1 Storm的通信机制
说明:1、worker与worker之间跨进程通信;
2、worker内部中各个executor间的通信,Task对象--->输入队列queue--->执行--->输出队列
1.1通信机制的流程图
1.2通信机制的总结
a、每个task中都对应一个输入队列和输出队列;
b、一个worker中所有的task的输入队列被封装在一个InnerMap<TaskId,InputQueue>中;
c、当上游的Component组件需要发送数据时,就会拿TaskId去InnerMap中获取相应的输入队列,
此时有两中情况:
①:如果InputQueue不为空,表示数据要发送task在当前的worker中,直接获取对应的InputQueue进行push;
②:如果InputQueue为空,就需要走网络通信。走网络通信需要知道对方的Ip和端口号,在Worker初始化了一个ConnectionMap<Supervisor Ip+worker端口号,NettyClient>对象。通过TaskId找到这个task运行在那个worker上,用对应的superivsor ip+worker端口号获取一个netty连接,进行数据传输;
注:nettyClient数据传输模块在每个task中都有一个。
d、NettyServer收到数据之后,会按照每个数据要发送的TaskId进行分发,分发到一个反序列化队列中;
e、在Task初始化的时候,会创建一个线程来消费TaskId对应的反序列化队列中的数据,并存放到对应task的InputQueue的队列中。
注:上述所说的taskId和taskId与worker之间的对应关系,在nimbus分配任务已规划完毕。
1.3通信机制的队列简单描述
队列是DisruptorQueue(无锁队列),每秒中能处理600万订单,是由LAMX的公司开源