Repository navigation
Event
事件框架提供了生产和消费预定义或自定义的事件的能力。它有3个基础组件:
- 事件流
- 事件适配器
- 事件结构
事件流是用来发送和接收事件的gRPC通道。每个消费者会与事件框架建立事件流,并快速传递它感兴趣的事件。事件生成者通过事件流只发送合适的事件给连接到生产者的消费者。
事件流初始化缓冲和超时参数。缓冲保存着几个等待投递的事件,超时参数在缓冲满时有三个选项:
- 如果超时小于0,丢弃新到来的事件
- 如果超时等于0,阻塞事件知道缓冲再次可用
- 如果超时大于0,等待指定的超时时间,如果缓冲还是满的话就丢弃事件
事件生产者暴露函数Send(e *pb.Event)来发送事件,其中Event可以是预定义的Block或Generic事件。将来会定义更多的事件来包括其它的fabric元素。
message Generic {
string eventType = 1;
bytes payload = 2;
}eventType和payload是由事件生产者任意定义的。例如,JSON数据可能被用在payload中。链码或插件发出Generic事件来与消费者通讯。
事件消费者允许外部应用监听事件。每个事件消费者通过时间流注册事件适配器。消费者框架可以看成是事件流与适配器之间的桥梁。一种典型的事件消费者使用方式:
adapter = <adapter supplied by the client application to register and receive events>
consumerClient = NewEventsClient(<event consumer address>, adapter)
consumerClient.Start()
...
...
consumerClient.Stop()事件适配器封装了三种流交互的切面:
- 返回所有感兴趣的事件列表的接口
- 当事件消费者框架接受到事件后调用的接口
- 当事件总线终止时,事件消费者框架会调用的接口
引用的实现提供了Golang指定语言绑定
EventAdapter interface {
GetInterestedEvents() ([]*ehpb.Interest, error)
Recv(msg *ehpb.Event) (bool,error)
Disconnected(err error)
}把gRPC当成事件总线协议来使用,允许事件消费者框架对于不同的语言的绑定可移植而不影响事件生成者框架。
这节详细描述了事件系统的消息结构。为了简单起见,消息直接使用Golang描述。
事件消费者和生产者之间通信的核心消息是事件。
message Event {
oneof Event {
//consumer events
Register register = 1;
//producer events
Block block = 2;
Generic generic = 3;
}
}每一个上面的定义必须是Register, Block或Generic中的一种。
就像之前提到过的一样,消费者通过与生产者建立连接来创建事件总线,并发送Register事件。Register事件实质上是一组声明消费者感兴趣的事件的Interest消息。
message Interest {
enum ResponseType {
//don't send events (used to cancel interest)
DONTSEND = 0;
//send protobuf objects
PROTOBUF = 1;
//marshall into JSON structure
JSON = 2;
}
string eventType = 1;
ResponseType responseType = 2;
}事件可以通过protobuf结构直接发送,也可以通过指定适当的responseType来发送JSON结构。
当前,生产者框架可以生成Block和Generic事件。Block是用来封装区块链中区块属性的消息。