基于通道的节点事件服务

概览

在 Fabric 之前的版本中,节点事件服务被称为事件仓库(event hub)。当 Peer 节点的账本中新增一个区块的时候该服务就会发送一个事件,无论该区块属于哪个通道,只有组织成员中运行事件节点才可以访问该事件(例如,连接到事件的节点)。

从v1.1开始,有两个新的服务提供事件。这些服务使用完全不同的设计来为每个通道提供事件。这意味着事件的注册发生在通道的级别,而不是 Peer 节点,允许对 Peer 节点数据的访问进行细粒度的控制。通过 Peer 节点的组织之外的标识(由通道配置定义)来接受接收事件的请求。这还提供了更高的可靠性和接收可能错过的事件的方法(无论是由于连接问题还是因为 Peer 节点正在加入网络)。

启动服务

  • Deliver

该服务发送已经提交到账本的所有区块。可以在区块的 ChaincodeActionPayload 中查看链码设置的所有事件。

  • DeliverFiltered

该服务发送“经筛选”的区块,已经提交到账本的区块信息的最小集合。它用在 Peer 节点希望外部客户端主要用来接收交易的信息和状态的网络中。可以在区块的 FilteredChaincodeAction 中查看链码设置的所有事件。

注解

链码事件的负载不会包含在筛选出的区块中。

如何注册事件

通过向 Peer 节点发送一个带有搜索种子信息的信封(envelope)来完成对任意服务的注册,该信息中包含了所需的开始和结束的位置和搜索行为(直到准备好前阻塞或没有准备好就失败)。SeekOldestSeekNewest 变量用来表明是账本中最新的(最后的)或者最旧的(第一个)区块。要让服务无限期地发送事件,SeekInfo 消息应该包含 MAXINT64 的停止位置。

注解

如果节点启用了 TLS,就必须在信封的通道头部中设置 TLS 证书。

默认情况下,两个服务都使用通道读者的策略(Channel Readers policy)来决定哪些客户端可以接收事件。

发送响应信息概览

事件服务发回 DeliverResponse 信息。

没条消息包含如下内容:

  • 状态(status) -- HTTP 状态码。两个服务在发生错误是都会返回相应的状态码;否则会返回 200 - SUCCESS 表示服务发送完成了 SeekInfo 信息中请求的内容。
  • 区块(block) -- 只有 Deliver 服务返回。
  • 筛选出的区块(filtered block) -- 只有 DeliverFiltered 服务返回。

筛选出的区块包含:

  • 通道 ID。

  • 序号 (例如区块号)。

  • 筛选出的交易数组。

  • 交易 ID.

    • 类型 (例如 ENDORSER_TRANSACTIONCONFIG)。
    • 交易验证码。
  • 筛选出的交易活动。
    • 筛选出的链码活动数组。
      • 交易的链码事件(有效负载为零)。

SDK 事件文档

使用事件服务的详细信息,请参考 SDK 文档。