上节说到,NIFI在集群模式的时候,会对NIFI的任务流进行负载均衡,将处理器要处理的流文件分担到集群的各个节点来处理提升处理效率。本节来学习下NIFI负载均衡队列的实现。
一、源码分析
梳理下新建连接时候的流程,与启动处理器相似。
控制器层:
面板层:
DAO层:
FlowcController层
这里构建了一个队列工厂,没有负载均衡的时候,新建一个 StandardFlowFileQueue 实例。当处于集群模式的时候,会新建一个SocketLoadBalancedFlowFileQueue 实例。我们从这个类的 startLoadBalancing 方法着手。
QueuePartition
这里调用了两个类的两个start方法。
先看 RebalancingPartition 类:
接口的定义很简单,注释说它的唯一任务工作是把flowfile重新分发给集群其他参与者
QueuePartition 初看比较绕,它表示一个队列的一部分。这样一个队列就能划分成一个本地队列,0个或者多个远程队列。这里我们暂时理解成每一个负载均衡队列,都可以看成由一个本地队列和多个远程队列组成。并且注意到 RebalancingPartition 就继承自 QueuePartition 。
同样继承自 QueuePartition 的还有 LocalQueuePartition:
注释意思是:它就是一个完整的的 FlowFile Queue,所以包含了其他组件与其交互的必要内容。
我们找一个它的实现来看:
另外我们看下没有负载均衡的情况下,NIFI队列的实现 StandardFlowFileQueue:
都由 SwappablePriorityQueue 实现本地队列。所以我们这里暂时认为 LocalQueuePartition 就是一个地道的本地队列。
这里整理下几个类的关系
到这里大致知道NIFI的负载均衡队列分成了本地队列和远程队列两大部分。回到队列的构造方法先:
构造了 本地 QueuePartition 和远程的放入了 queuePartitions 中。包括本节点在内,集群有多少个节点,就有多少个QueuePartition 实例。整理下各个成员变量的类型:
- localPartition:SwappablePriorityQueueLocalPartition
- rebalancingPartition:StandardRebalancingPartition
- queuePartitions:SwappablePriorityQueueLocalPartition + RemoteQueuePartition
看看 queuePartitions start方法的执行
SwappablePriorityQueueLocalPartition :
什么也不做,很容易理解,本地不需要负载均衡。
RemoteQueuePartition:
进行了一个登记注册,然后 把是否在运行标记 running 设置为 true,这个注册中心是由FlowController创建的,各个QueuePartition共享
先简单来看下这个注册中心:
比较简单,一个map,一个Set.其中map是以集群的节点标识作为key。
看看是如何登记注册的:
新建了一个 RegisteredPartition 实例,放入 AsyncLoadBalanceClient 的registeredPartitions 和 partitionQueue。所以要看下 AsyncLoadBalanceClient 是怎么维护 Map 和 set的。
进入红框的方法:
set 的大小 clientsPerNode 有关:该值是初始化时候带进来的
可以是配置的,
默认值是4
看说明:
集群当中当前节点同其他节点之间建立的最大连接数。
所以这个登记中心,会为每个节点,分配4个(默认情况)用于连接的client,每个client
会有一个map 跟queue.从下边这个地方,我们点进去看它都记录了什么
map中的key传入的是连接的标识,唯一ID。RegisteredPartition内容如下:
Supplier 是个接口,通过get方法能提供相应的对象。暂时理解为工厂类吧。
这时候,我们就能勾勒出创建多个负载均衡队列之后注册中心中的数据是如何存放的了。用N1、N2、N3...来表示不同的NIFI节点,F表示建成之后的连接,C表示当前节点同其他节点建立的连接。RegisteredPartition对象缩写为RP,注册中心中存放的内容表示如下:
注册中心的 allClients 包含所有的蓝色的client。注册中心有个start()方法:
会调用client的start方法,client的start方法也很简单:
把client的状态置为running. 来看client的父类: