Storm中worker的内部通信

一.worker间通信

1.ServerSocket将数据分发到Disruptor队列中以Map<taskId,队列>的形式
2.启动一个execute1进程,去Disruptor的Map中根据taskId获取Map<taskId-1,incoming>中对应的元素,放入自己的incoming-queue 队列
3.execute线程(有多少个task就有多少个execute)有自己的业务逻辑,将获取的元素输出成tuple,存放在outgoing-queue中.
4.当outgoing-queue中的Tuple达到阈值时,从队列中将数据emit(tuple)射到transfer-queue对外缓冲区.外缓冲区接收所有execute线程射出的数据
5.输出总管从对外缓冲区中获取数据 在ui界面的spout,bolt中可以看到 [9-9] storm03 6702
每个线程都会有一个对应的机器和端口
6.将数据通过网络传输发送到对应的机器端口上,socket02: worker6700
每个worker进程控制的execute线程个数就并发度个数

worker工作图:
work述
细节描述
(1)ServerSocket数据分发:在初始化的时候每个线程就已经有id标识,
outTask[3,4,5,6] for task-2 type:bolt1的实例 fieldGrouping field.value.hashcode%4
outTask[3,4,5,6] for task-1 type:bolt1的实例 fieldGrouping field.value.hashcode%4
outTask[1,2] for task-8 type:spout的实例 shuffleGrouping random.nextInt(2)
outTask[1,2] for task-9 type:spout的实例 shuffleGrouping random.nextInt(2)
(2)worker的内部通信:Disruptor队列(单线程每秒处理600百万订单),没有竞争,没有锁,非常快
(3)网络通信:Netty,一个NIO client-server框架(socket框架) ,之前是zeroMQ

注意:topology之间是不能通信,都是相互独立的.但topology可以运行在多个worker上。

二.Disruptor

Disruptor一种线程之间信息无锁的交换方式.应用场景是“生产者-消费者”模型,Disruptor可以看成一个事件监听或消息机制,底层是单个数据结构:一个ring buffer,环形缓冲区.在队列中一边生产者放入消息,另外一边消费者并行取出处理.但生产者放入消息大于消费者并行取出消息的速度时,生产者会有一个判断.是否放入消息.RingBuffer底层是个数组,次序计算器是一个64bit long 整数型,平滑增长。

生产者和消费者都有多个时,防止生产和消费同一个,会有一个序号管理器来管理,生产者和消费者都通过序号管理器去放入和取出
消费者当前生产的序号 % 环形缓冲区的size =环形缓冲区不能覆盖的序号(生产者)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值