流管理组件主要有三个部分组成:发送流池(SendStreamPool)、发送流池管理(SendStreamPoolManager)、接收流管理(ReceiveStreamManager)。
1)发送流池(SendStreamPool):
发送流池负责管理连接所创建的所有发送流,每个连接对应创建一个发送流池,在创建时可初始化一定数量的发送流,当池中空闲发送流数量低于阈值且总发送流数量低于允许的最大值时,发送流池会自动创建一定数量新的发送流。如果发送流在发送过程中发生错误,则通过DropStream方法弃用该发送流。如果连接关闭,则会弃用所有发送流并关闭发送流池。
发送流池接口定义在core/mgr/streammgr.go中mgr.SendStreamPool interface。
2)发送流池管理(SendStreamPoolManager):
发送流池管理组件负责管理与其他所有节点建立的所有连接的发送流池。在向某节点发送数据时,会从发送流池管理组件获取负载最低的连接对应的发送流池借一个发送流发送数据。
发送流池管理组件接口定义在core/mgr/streammgr.go中mgr.SendStreamPoolManager interface。
3)接收流管理(ReceiveStreamManager)
接收流管理组件负责管理与其他所有节点建立的所有连接上接受的所有接收流。如果某个连接关闭,则会关闭该连接的所有接收流。
接收流管理组件接口定义在core/mgr/streammgr.go中mgr.ReceiveStreamManager interface.
内置流管理
Liquid内置流管理实现:
发送流池——simple.sendSteamPool,实现代码在simple/streammgr_sendstreampool.go中。
发送流池管理——simple.sendStreamPoolManager,实现代码在simple/streammgr_sendstreampoolmgr.go中。
接收流管理——simple.receiveStreamManager,实现代码在simple/streammgr_receivestreammgr.go中。
连接状态维护
链接状态维护组件负责监督必要节点(共识节点、种子节点)与本节点链接状态,若必要节点未与本节点建立连接,则会尝试与之建立新连接。接口定义在core/mgr/connmgr.go中mgr.ConnSupervisor interface。
内置连接状态维护
Liquid内置了一种连接状态维护实现——simple.connSupervisor,实现代码在simple/conn_supervisor.go文件中。
simple.connSupervisor保存了必要节点ID及其网络地址列表,每隔5秒会自动检查必要节点与本节点连接状态,若必要节点未与本节点连接,则会启动一个尝试连接任务,每隔一段时间(间隔时间按照斐波那契队列规则递增)尝试与之建立连接。如果有必要节点断开连接,则会立即启动一个尝试连接任务。
应用协议管理&应用协议交换机
应用协议管理组件记录着本节点所支持的应用协议列表及应用协议对应的消息处理器,应用协议管理组件还记录着与本节点建立连接的节点所支持的应用协议列表。接口定义在core/mgr/protocolmgr.go中mgr.ProtocolManager interface。
应用协议交换机组件负责将本节点支持的协议列表与其他正在连接的节点的协议列表交换,当有新应用协议注册或注销时,将会重新把本节点支持的协议列表推送给已连接的其他节点。应用协议管理组件与应用协议交换机配合使用来同步节点间支持应用协议列表。当收到来自其他节点新注册应用协议或新注销应用协议推送时,会通过回调机制通知已注册的上层应用。
当发送数据时,会先检查对方是否支持相应应用协议,若不支持,则返回错误。这样的机制可以减少无效消息在网络上传播次数。
内置应用协议管理
Liquid内置了一种连接应用协议管理实现——simple.simpleProtocolMgr,实现代码在simple/protocolmgr.go文件中。
内置应用协议交换机
Liquid内置了一种连接应用协议交换机实现——simple.protocolExchanger,实现代码在simple/protocolmgr.go文件中。