Storm的通信机制

  • 目录
    • 前言:
    • 1、Worker进程间通信原理
    • 2、Worker进程间技术(Netty、ZeroMQ)
    • 3、Worker 内部通信技术(Disruptor)
    • 总结:

目录

前言:

这篇文章,博客主要介绍下Storm中Worker进程间和进程内部通信的原理和技术。整篇内容仅供了解,如有不足或错误请指出。
Worker间的通信经常需要通过网络跨节点进行,Storm使用ZeroMQ或Netty(0.9以后默认使用)作为进程间通信的消息框架。
Worker进程内部通信:不同worker的thread通信使用LMAX Disruptor来完成。
不同topologey之间的通信,Storm不负责,需要自己想办法实现,例如使用kafka等。

1、Worker进程间通信原理

worker进程间消息传递机制,消息的接收和处理的大概流程见下图
这里写图片描述

1、对于worker进程来说,为了管理流入和传出的消息,每个worker进程有一个独立的接收线程<一个worker进程运行一个专用的接收线程来负责将外部发送过来的消息移动到对应的executor线程的incoming-queue中>(对配置的TCP端口supervisor.slots.ports进行监听)对应Worker接收线程,每个worker存在一个独立的发送线程(transfer-queue的每个元素实际上代表一个tuple的集合) ,它负责从worker的transfer-queue中读取消息,并通过网络发送给其他worker。
2、每个executor有自己的incoming-queue 和outgoing-queue 。
Worker接收线程将收到的消息通过task编号传递给对应的executor(一个或多个)的incoming-queues;
每个executor有单独的线程分别来处理spout/bolt的业务逻辑,业务逻辑输出的中间数据会存放在outgoing-queue中,当executor的outgoing-queue中的tuple达到一定的阀值,executor的发送线程将批量获取outgoing-queue中的tuple,并发送到transfer-queue中。
3、每个worker进程控制一个或多个executor线程,用户可在代码中进行配置。其实就是我们在代码中设置的并发度个数。

总结:每个work都有对应的接受线程用来通过网络接收外部发送过来的消息,并根据tuple中包含的taskId匹配到对应的excutor,将该消息移动到对应的excutor线程的incoming-queue里面,excutor从incoming-queue里面拿数据进行处理后(通过bolt的excute方法来消费incoming-queue中的tuple数据),将中间结果输出到outgoing-queue中,当outgoing-queue中的数据达到一定的阈值之后,excutor的发送线程会将outgoing-queue中的数据发送到worker的transfer-queue中,而worker的发送线程再将transfer-queue中读到的消息通过网络发送给其他的worker.

2、Worker进程间技术(Netty、ZeroMQ)

2.1、Netty
Netty是一个NIO client-server(客户端服务器)框架,使用Netty可以快速开发网络应用,例如服务器和客户端协议。Netty提供了一种新的方式来使开发网络应用程序,这种新的方式使得它很容易使用和有很强的扩展性。Netty的内部实现时很复杂的,但是Netty提供了简单易用的api从网络处理代码中解耦业务逻辑。Netty是完全基于NIO实现的,所以整个Netty都是异步的。
书籍:Netty权威指南

2.2、ZeroMQ
ZeroMQ是一种基于消息队列的多线程网络库,其对套接字类型、连接处理、帧、甚至路由的底层细节进行抽象,提供跨越多种传输协议的套接字。ZeroMQ是网络通信中新的一层,介于应用层和传输层之间(按照TCP/IP划分),其是一个可伸缩层,可并行运行,分散在分布式系统间。
ZeroMQ定位为:一个简单好用的传输层,像框架一样的一个socket library,他使得Socket编程更加简单、简洁和性能更高。是一个消息处理队列库,可在多个线程、内核和主机盒之间弹性伸缩。ZMQ的明确目标是“成为标准网络协议栈的一部分,之后进入Linux内核”。

3、Worker 内部通信技术(Disruptor)

3.1、Disruptor的来历

  • 一个公司的业务与技术的关系,一般可以分为三个阶段。第一个阶段就是跟着业务跑。第二个阶段是经历了几年的时间,才达到的驱动业务阶段。第三个阶段,技术引领业务的发展乃至企业的发展。所以我们在学习Disruptor这个技术时,不得不提LMAX这个机构,因为Disruptor这门技术就是由LMAX公司开发并开源的。
  • LMAX是在英国注册并受到FSA监管(监管号码为509778)的外汇黄金交易所。LMAX也是欧洲第一家也是唯一一家采用多边交易设施Multilateral
    Trading Facility(MTF)拥有交易所牌照和经纪商牌照的欧洲顶级金融公司
  • LAMX拥有最迅捷的交易平台,顶级技术支持。LMAX交易所使用“(MTF)分裂器Disruptor”技术,可以在极短时间内(一般在3百万秒之一内)处理订单,在一个线程里每秒处理6百万订单。所有订单均为撮合成交形式,无一例外。多边交易设施(MTF)曾经用来设计伦敦证券交易所(london Stock Exchange)、德国证券及衍生工具交易所(Deutsche Borse)和欧洲证券交易所(Euronext)。
  • 2011年LMAX凭借该技术获得了金融行业技术评选大赛的最佳交易系统奖和甲骨文“公爵杯”创新编程框架奖。

3.2、Disruptor是什么
1、 简单理解:Disruptor是一个QueueDisruptor是实现了“队列”的功能,而且是一个有界队列(长度有限)。而队列的应用场景自然就是“生产者-消费者”模型。
2、 在JDK中Queue有很多实现类,包括不限于ArrayBlockingQueue、LinkBlockingQueue,这两个底层的数据结构分别是数组和链表。数组查询快,链表增删快,能够适应大多数应用场景。
3、 但是ArrayBlockingQueue、LinkBlockingQueue都是线程安全的。涉及到线程安全,就会有synchronized、lock等关键字,这就意味着CPU会打架
4、 Disruptor一种线程之间信息无锁的交换方式(使用CAS(Compare And Swap/Set)操作)。
3.2、Disruptor主要特点
1、 没有竞争=没有锁=非常快。
2、 所有访问者都记录自己的序号的实现方式,允许多个生产者与多个消费者共享相同的数据结构。
3、 在每个对象中都能跟踪序列号(ring buffer,claim Strategy,生产者和消费者),加上神奇的cache line padding,就意味着没有为伪共享和非预期的竞争。
3.3、 Disruptor 核心技术点
Disruptor可以看成一个事件监听或消息机制,在队列中一边生产者放入消息,另外一边消费者并行取出处理.
底层是单个数据结构:一个ring buffer。
每个生产者和消费者都有一个次序计算器,以显示当前缓冲工作方式。
每个生产者消费者能够操作自己的次序计数器的能够读取对方的计数器,生产者能够读取消费者的计算器确保其在没有锁的情况下是可写的。

核心组件
Ring Buffer 环形的缓冲区,负责对通过 Disruptor 进行交换的数据(事件)进行存储和更新。
Sequence 通过顺序递增的序号来编号管理通过其进行交换的数据(事件),对数据(事件)的处理过程总是沿着序号逐个递增处理。
RingBuffer底层是个数组,次序计算器是一个64bit long 整数型,平滑增长。
这里写图片描述
Ring Buffer 运行的过程:
1、 接受数据并写入到脚标31的位置,之后会沿着序号一直写入,但是不会绕过消费者所在的脚标。
2、 Joumaler和replicator同时读到24的位置,他们可以批量读取数据到30
3、消费逻辑线程读到了14的位置,但是没法继续读下去,因为他的sequence暂停在15的位置上,需要等到他的sequence给他序号。如果sequence能正常工作,就能读取到30的数据。

总结:

以上的一些内容,只需要了解即可,目的还是为了能够更好的理解Storm内部的通信的原理,为今后的进阶之路打好基础。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/456633.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《Windows PowerShell实战指南(第2版)》——1.4 搭建自己的实验环境

本节书摘来自异步社区《Windows PowerShell实战指南&#xff08;第2版&#xff09;》一书中的第1章&#xff0c;第1.4节&#xff0c;作者&#xff1a;【美】Don Jones&#xff08;道琼斯&#xff09; , Jeffery Hicks&#xff08;杰弗瑞希克斯&#xff09;著&#xff0c;更多章…

已解决]求问not 1 or 0 and 1 or 3 and 4 or 5 and 6 or 7 and 8 and 9为什么不等于0呢???

not 1 or 0 and 1 or 3 and 4 or 5 and 6 or 7 and 8 and 9 ----> (not 1&#xff09;)or (0 and 1) or (3 and 4) or (5 and 6) or (7 and 8 and 9) ----> 0 or 0 or 4 or 6 or 9 ----> 0 or 4 or 6 or 9 ----> 4 or 6 or 9 4

C#外围工具资源

1、MATH.NET数学库:可以用于 矩阵计算方程求根插值拟合。。。2、转载于:https://www.cnblogs.com/liq07lzucn/p/6227443.html

Storm程序的并发机制原理总结

文章目录目录前言&#xff1a;1、概念2、配置并行度总结&#xff1a;目录 前言&#xff1a; 为了在以后的实践中提高Storm程序执行的效率&#xff0c;我们还是有必要了解下对应的Storm程序的并发机制。&#xff08;哈哈&#xff0c;虽然以博主小菜鸟的水平还没有接触到这种提…

《无线网络:理解和应对互联网环境下网络互连所带来的挑战》——第2章 无线生态系统 2.1无线标准化过程...

本节书摘来自华章出版社《无线网络&#xff1a;理解和应对互联网环境下网络互连所带来的挑战》一书中的第2章&#xff0c;第2.1节&#xff0c;作者&#xff1a;&#xff08;美&#xff09;杰克L.伯班克&#xff08;Jack L. Burbank&#xff09;等著&#xff0c;更多章节内容可以…

Flask模板01

模板 在前面的示例中&#xff0c;视图函数的主要作用是生成请求的响应&#xff0c;这是最简单的请求。实际上&#xff0c;视图函数有两个作用&#xff1a;处理业务逻辑和返回响应内容。在大型应用中&#xff0c;把业务逻辑和表现内容放在一起&#xff0c;会增加代码的复杂度和…

★数学上最大的数是多少?

数学上最大的数是多少&#xff1f; 怪罗科普 收藏(282)| 阅读(117678)人类已经使用数长达千年之久。普遍认为&#xff0c;数的概念最先源于史前人类开始使用手指进行计数。这最终演变成符号语言&#xff0c;然后在沙子、墙壁和木头等物体上作标记。 我们已经向前发展了一大步&…

Flask模板02

3.4 控制语句 常用的几种控制语句&#xff1a; 模板中的if控制语句 app.route(/user) def user():user dongGereturn render_template(user.html,useruser)<html><head>{% if user %}<title> hello {{user}} </title>{% else %}<title> welc…

Storm任务提交过程及目录树介绍

目录前言&#xff1a;1、Storm 任务提交的过程2、Storm相关的目录树总结&#xff1a; 目录 前言&#xff1a; 对于任何一个组件来说&#xff0c;了解它相关的任务提交的过程是非常有必要的&#xff08;毕竟生产中遇到一些Bug时&#xff0c;你如果知道内部执行的过程&#xf…

《Adobe InDesign CS6中文版经典教程》—第1课1.5节修改文档的缩放比例

本节书摘来自异步社区《Adobe InDesign CS6中文版经典教程》一书中的第1课1.5节修改文档的缩放比例&#xff0c;作者【美】Adobe公司,更多章节内容可以访问云栖社区“异步社区”公众号查看。 1.5 修改文档的缩放比例Adobe InDesign CS6中文版经典教程InDesign中的控件让用户能…

随机生成一定范围的随机数

function randomNum(min,max) { return Math.ceil(Math.random()*(max-min)min); } min,max最小最大范围数字。转载于:https://www.cnblogs.com/kingzlz/p/6229586.html

【python】Flask视图

2.1 从 Hello World 开始 Flask程序运行过程&#xff1a; 所有Flask程序必须有一个程序实例。 Flask调用视图函数后&#xff0c;会将视图函数的返回值作为响应的内容&#xff0c;返回给客户端。一般情况下&#xff0c;响应内容主要是字符串和状态码。 当客户端想要获取资源…

大数据之Kafka入门简介

目录前言&#xff1a;1、Kafka是什么2、JMS是什么3、Kafka核心组件&#xff08;重点&#xff09;总结&#xff1a; 目录 前言&#xff1a; 作为流式计算中的一个组件&#xff0c;对于它的组成以及运行的原理&#xff0c;学习者也需要相关的了解。以下主要简单介绍了kafka是什…

oracle的安装与plsql的环境配置

1&#xff0c;首先得有oracle的安装包和plsql的安装包&#xff0c;安装包地址可见百度云 http://pan.baidu.com/s/1miTqhmg 2.解压下来进入0817账套&#xff0c;找到set.exe文件&#xff0c;双击安装即可 注意的是安装的时候有两个目录是要自己创建的&#xff0c;否则安装不成功…

如何在Docker容器中运行GUI程序

如何在Docker容器中运行GUI程序 各位&#xff0c;今天我们将学习如何在Docker之中运行GUI程序。我们可以轻易地在Docker容器中运行大多数GUI程序且不出错。Docker是一个开源项目&#xff0c;提供了一个打包、分发和运行任意程序的轻量级容器的开放平台。它没有语言支持、框架或…

【python】Get与Post的区别?(面试官最想听到的答案)

GET和POST是HTTP请求的两种基本方法&#xff0c;要说它们的区别&#xff0c;接触过WEB开发的人都能说出一二。 最直观的区别就是GET把参数包含在URL中&#xff0c;POST通过request body传递参数。 你可能自己写过无数个GET和POST请求&#xff0c;或者已经看过很多权威网站总结出…

大数据之Kafka集群安装及简单使用

目录1、Kafka集群部署2、Kafka常用操作命令 目录 1、Kafka集群部署 1.1、下载安装包 http://kafka.apache.org/downloads.html 在linux中使用wget命令下载安装包 wget http://mirrors.hust.edu.cn/apache/kafka/0.8.2.2/kafka_2.11-0.8.2.2.tgz 1.2、解压安装包 tar -z…

Python爬虫入门之Urllib库的基本使用

那么接下来&#xff0c;小伙伴们就一起和我真正迈向我们的爬虫之路吧。 1.分分钟扒一个网页下来 怎样扒网页呢&#xff1f;其实就是根据URL来获取它的网页信息&#xff0c;虽然我们在浏览器中看到的是一幅幅优美的画面&#xff0c;但是其实是由浏览器解释才呈现出来的&#xf…

【python】hashlib.shasha256练习注册 --笔记

用户注册和登录import csv import hashlib#注册将用户信息填写到csv文件中 def register():username input(用户名:)password input(密码:)user []user.append(username)user.append(hashlib.sha256(password.encode(utf-8)).hexdigest())with open(t2/users.csv, a, newlin…

《3ds Max疯狂设计学院》——1.6节3ds Max 2016新增的主要功能

本节书摘来自异步社区《3ds Max疯狂设计学院》一书中的第1章&#xff0c;第1.6节3ds Max 2016新增的主要功能&#xff0c;作者 曹茂鹏&#xff0c;更多章节内容可以访问云栖社区“异步社区”公众号查看 1.6 3ds Max 2016新增的主要功能1&#xff0e;Max Creation Graph3ds Max…