精华内容
下载资源
问答
  • Storm通信机制

    2017-08-16 08:48:59
    <div class="markdown_views"><h1 id="storm通信机制"><a name="t0" target="_blank"></a>Storm通信机制 Worker间的通信经常需要通过网络跨节点进行,Storm使用ZeroMQ或Netty(0.9以后默认使用)作为进程间通信的消息...

    Worker间的通信经常需要通过网络跨节点进行,Storm使用ZeroMQ或Netty(0.9以后默认使用)作为进程间通信的消息框架。
    Worker进程内部通信:不同worker的thread通信使用LMAX Disruptor来完成。
    不同topologey之间的通信,Storm不负责,需要自己想办法实现,例如使用kafka等;

    1、Worker进程间通信

    worker进程间消息传递机制,消息的接收和处理的大概流程见下图
    这里写图片描述
    对于worker进程来说,为了管理流入和传出的消息,每个worker进程有一个独立的接收线程(对配置的TCP端口supervisor.slots.ports进行监听);
    对应Worker接收线程,每个worker存在一个独立的发送线程,它负责从worker的transfer-queue中读取消息,并通过网络发送给其他worker
    每个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中。
    每个worker进程控制一个或多个executor线程,用户可在代码中进行配置。其实就是我们在代码中设置的并发度个数。

    2、Worker进程间通信分析

    这里写图片描述
    1、 Worker接受线程通过网络接受数据,并根据Tuple中包含的taskId,匹配到对应的executor;然后根据executor找到对应的incoming-queue,将数据存发送到incoming-queue队列中。
    2、 业务逻辑执行现成消费incoming-queue的数据,通过调用Bolt的execute(xxxx)方法,将Tuple作为参数传输给用户自定义的方法
    3、 业务逻辑执行完毕之后,将计算的中间数据发送给outgoing-queue队列,当outgoing-queue中的tuple达到一定的阀值,executor的发送线程将批量获取outgoing-queue中的tuple,并发送到Worker的transfer-queue中
    4、 Worker发送线程消费transfer-queue中数据,计算Tuple的目的地,连接不同的node+port将数据通过网络传输的方式传送给另一个的Worker。
    5、 另一个worker执行以上步骤1的操作。

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

    3.1、Netty

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

    3.2、ZeroMQ

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

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

    4.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凭借该技术获得了金融行业技术评选大赛的最佳交易系统奖和甲骨文“公爵杯”创新编程框架奖。

    4.2、Disruptor是什么

    1、 简单理解:Disruptor是一个Queue。Disruptor是实现了“队列”的功能,而且是一个有界队列。而队列的应用场景自然就是“生产者-消费者”模型。
    2、 在JDK中Queue有很多实现类,包括不限于ArrayBlockingQueue、LinkBlockingQueue,这两个底层的数据结构分别是数组和链表。数组查询快,链表增删快,能够适应大多数应用场景。
    3、 但是ArrayBlockingQueue、LinkBlockingQueue都是线程安全的。涉及到线程安全,就会有synchronized、lock等关键字,这就意味着CPU会打架。
    4、 Disruptor一种线程之间信息无锁的交换方式(使用CAS(Compare And Swap/Set)操作)。

    4.3、Disruptor主要特点

    1、 没有竞争=没有锁=非常快。
    2、 所有访问者都记录自己的序号的实现方式,允许多个生产者与多个消费者共享相同的数据结构。
    3、 在每个对象中都能跟踪序列号(ring buffer,claim Strategy,生产者和消费者),加上神奇的cache line padding,就意味着没有为伪共享和非预期的竞争。

    4.4、 Disruptor 核心技术点

    Disruptor可以看成一个事件监听或消息机制,在队列中一边生产者放入消息,另外一边消费者并行取出处理.
    底层是单个数据结构:一个ring buffer。
    每个生产者和消费者都有一个次序计算器,以显示当前缓冲工作方式。
    每个生产者消费者能够操作自己的次序计数器的能够读取对方的计数器,生产者能够读取消费者的计算器确保其在没有锁的情况下是可写的。

    核心组件
    Ring Buffer 环形的缓冲区,负责对通过 Disruptor 进行交换的数据(事件)进行存储和更新。
    Sequence 通过顺序递增的序号来编号管理通过其进行交换的数据(事件),对数据(事件)的处理过程总是沿着序号逐个递增处理。
    RingBuffer底层是个数组,次序计算器是一个64bit long 整数型,平滑增长。
    这里写图片描述

    1、 接受数据并写入到脚标31的位置,之后会沿着序号一直写入,但是不会绕过消费者所在的脚标。
    2、 Joumaler和replicator同时读到24的位置,他们可以批量读取数据到30
    3、消费逻辑线程读到了14的位置,但是没法继续读下去,因为他的sequence暂停在15的位置上,需要等到他的sequence给他序号。如果sequence能正常工作,就能读取到30的数据。

    转自:http://blog.csdn.net/tototuzuoquan/article/details/73551560

    展开全文
  • Storm的通信机制

    2018-04-06 21:35:10
    Worker间的通信经常需要通过网络跨节点进行,Storm使用ZeroMQ或Netty(0.9以后默认使用)作为进程间通信的消息框架。 Worker进程内部通信:不同worker的thread通信使用LMAX Disruptor来完成。 不同topologey...

    目录

    前言:

    这篇文章,博客主要介绍下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内部的通信的原理,为今后的进阶之路打好基础。

    展开全文
  • 一、BIO、NIO、AIO通信机制理解

    千次阅读 2017-05-10 15:11:03
    关于BIO、NIO、AIO通信机制的理解

    一、BIO的理解

    首先我们通过通信模型图来熟悉下BIO的服务端通信模型:采用BIO通信模型的服务端,通常由一个独立的Acceptor线程负责监听客户端的连接,它接收到客户端的连接请求之后为每个客户端创建一个新的线程进行链路处理,处理完成之后,通过输出流返回应答给客户端,线程销毁。这就是典型的一请求一应答通信模型。这个是在多线程情况下执行的。当在单线程环境下时,在while循环中服务端会调用accept方法等待接收客户端的连接请求,一旦接收到一个连接请求,就可以建立socket,并在该socket上进行读写操作,此时不能再接收其它客户端的连接请求,只能等待同当前连接的客户端的操作执行完成。
    BIO服务端通信模型

    该模型最大的问题就是缺乏弹性伸缩能力,当客户端并发访问量增加后,服务端的线程个数和客户端并发访问数呈1:1的正比关系,由于线程是Java虚拟机非常宝贵的系统资源,当线程数膨胀之后,系统的性能将急剧下降,随着并发访问量的继续增大,系统会发生线程堆栈溢出、创建新线程失败等问题,并最终导致进程宕机或者僵死,不能对外提供服务。

    二、伪异步I/O编程

    为了解决同步阻塞I/O面临的一个链路需要一个线程处理的问题,后来有人对它的线程模型进行了优化,后端通过一个线程池来处理多个客户端的请求接入,形成客户端个数M:线程池最大线程数N的比例关系,其中M可以远远大于N,通过线程池可以灵活的调配线程资源。设置线程的最大值,防止由于海量并发接入导致线程耗尽。
    采用线程池和任务队列可以实现一种叫做伪异步的I/O通信框架。模型图如下。
    伪异步IO模型
    当有新的客户端接入时,将客户端的Socket封装成一个Task(该任务实现Java.lang.Runnablle接口)投递到后端的线程池中进行处理,JDK的线程池维护一个消息队列和N个活跃线程对消息队列中的任务进行处理。由于线程池可以设置消息队列的大小和最大线程数,因此,它的资源占用是可控的,无论多少个客户端并发访问,都不会导致资源的耗尽和宕机。
    由于线程池和消息队列都是有界的,因此,无论客户端并发连接数多大,它都不会导致线程个数过于膨胀或者内存溢出,相对于传统的一连接一线程模型,是一种改良。
    伪异步I/O通信框架采用了线程池实现,因此避免了为每个请求都创建一个独立线程造成的线程资源耗尽问题。但是由于它底层的通信依然采用同步阻塞模型,因此无法从根本上解决问题。
    通过对输入和输出流的API文档进行分析,我们了解到读和写操作都是同步阻塞的,阻塞的时间取决于对方IO线程的处理速度和网络IO的传输速度,本质上讲,我们无法保证生产环境的网络状况和对端的应用程序能足够快,如果我们的应用程序依赖对方的处理速度,它的可靠性就会非常差。

    三、NIO编程(非阻塞IO)

    与Socket类和ServerSocket类相对应,NIO也提供了SocketChannel和ServerSocketChannel两种不同的套接字通道实现,在JDK1.4中引入。这两种新增的通道都支持阻塞和非阻塞两种模式。阻塞模式使用非常简单,但是性能和可靠性都不好,非阻塞模式则正好相反。我们可以根据自己的需求来选择合适的模式,一般来说,低负载、低并发的应用程序可以选择同步阻塞IO以降低编程复杂度,但是对于高负载、高并发的网络应用,需要使用NIO的非阻塞模式进行开发。
    首先来了解一些概念
    (1)缓冲区Buffer
    Buffer是一个对象,它包含一些要写入或者要读出的数据,在NIO库中,所有数据都是用缓冲区处理的。在读取数据时,它是直接读到缓冲区中的;在写入数据时,写入到缓冲区中,任何时候访问NIO中的数据,都是通过缓冲区进行操作。
    缓冲区实质上是一个数组。通常它是一个字节数组(ByteBuffer),也可以使用其他种类的数组,但是一个缓冲区不仅仅是一个数组,缓冲区提供了对数据的结构化访问以及维护读写位置(limit)等信息。常用的有ByteBuffer,其它还有CharBuffer、ShortBuffer、IntBuffer、LongBuffer、FloatBuffer、DoubleBuffer
    (2)通道Channel
    Channel是一个通道,可以通过它读取和写入数据,它就像自来水管一样,网络数据通过Channel读取和写入。通道与流的不同之处在于通道是双向的,流只是一个方向上移动(一个流必须是InputStream或者OutputStream的子类),而且通道可以用于读、写或者用于读写。同时Channel是全双工的,因此它可以比流更好的映射底层操作系统的API。特别是在Unix网络编程中,底层操作系统的通道都是全双工的,同时支持读写操作。我们常用到的ServerSocketChannnel和SocketChannel都是SelectableChannel的子类。
    (3)多路复用器Selector
    多路复用器Selector是Java NIO编程的基础,多路复用器提供选择已经就绪的任务的能力,简单的说,Selector会不断的轮询注册在其上的Channel,如果某个Channel上面有新的TCP连接接入、读和写事件,这个Channel就处于就绪状态,会被Selector轮询出来,然后通过SelectionKey可以获取就绪Channel的集合,进行后续的I/O操作。
    一个多用复用器Selector可以同时轮询多个Channel,由于JDK使用了epoll()代替传统的select实现,所以它并没有最大连接句柄1024/2048的限制,这也意味着只需要一个线程负责Selector的轮询,就可以接入成千上万的客户端。
    NIO服务端通信序列

    NIO客户端通信序列
    尽管NIO编程难度确实比同步阻塞BIO大很多,但是我们要考虑到它的优点:
    (1)客户端发起的连接操作是异步的,可以通过在多路复用器注册OP_CONNECT等后续结果,不需要像之前的客户端那样被同步阻塞。
    (2)SocketChannel的读写操作都是异步的,如果没有可读写的数据它不会同步等待,直接返回,这样IO通信线程就可以处理其它的链路,不需要同步等待这个链路可用。
    (3)线程模型的优化:由于JDK的Selector在Linux等主流操作系统上通过epoll实现,它没有连接句柄数的限制(只受限于操作系统的最大句柄数或者对单个进程的句柄限制),这意味着一个Selector线程可以同时处理成千上万个客户端连接,而且性能不会随着客户端的增加而线性下降,因此,它非常适合做高性能、高负载的网络服务器。

    四、AIO(异步非阻塞IO)

    JDK1.7升级了NIO类库,升级后的NIO类库被称为NIO2.0。也就是我们要介绍的AIO。NIO2.0引入了新的异步通道的概念,并提供了异步文件通道和异步套接字通道的实现。异步通道提供两种方式获取操作结果。
    (1)通过Java.util.concurrent.Future类来表示异步操作的结果;
    (2)在执行异步操作的时候传入一个Java.nio.channels.
    CompletionHandler接口的实现类作为操作完成的回调。
    NIO2.0的异步套接字通道是真正的异步非阻塞IO,它对应UNIX网络编程中的事件驱动IO(AIO),它不需要通过多路复用器(Selector)对注册的通道进行轮询操作即可实现异步读写,从而简化了NIO的编程模型。
    我们可以得出结论:异步Socket Channel是被动执行对象,我们不需要想NIO编程那样创建一个独立的IO线程来处理读写操作。对于AsynchronousServerSocketChannel和AsynchronousSocketChannel,它们都由JDK底层的线程池负责回调并驱动读写操作。正因为如此,基于NIO2.0新的异步非阻塞Channel进行编程比NIO编程更为简单。

    总结:

    几种IO模型功能和特性对比
    由上述总结得出,并不意味着所有的Java网络编程都必须要选择NIO和Netty,具体选择什么样的IO模型或者NIO框架,完全基于业务的实际应用场景和性能诉求,如果客户端并发连接数不多,周边对接的网元不多,服务器的负载也不重,那就完全没必要选择NIO做服务端;如果是相反情况,那就考虑选择合适的NIO框架进行开发。

    展开全文
  • Storm通信机制Worker间的通信经常需要通过网络跨节点进行,Storm使用ZeroMQ或Netty(0.9以后默认使用)作为进程间通信的消息框架。 Worker进程内部通信:不同worker的thread通信使用LMAX Disruptor来完成。 不同...

    Storm通信机制

    Worker间的通信经常需要通过网络跨节点进行,Storm使用ZeroMQ或Netty(0.9以后默认使用)作为进程间通信的消息框架。
    Worker进程内部通信:不同worker的thread通信使用LMAX Disruptor来完成。
    不同topologey之间的通信,Storm不负责,需要自己想办法实现,例如使用kafka等;

    2.1、Worker进程间通信

    worker进程间消息传递机制,消息的接收和处理的大概流程见下图
    这里写图片描述
     对于worker进程来说,为了管理流入和传出的消息,每个worker进程有一个独立的接收线程(对配置的TCP端口supervisor.slots.ports进行监听);
    对应Worker接收线程,每个worker存在一个独立的发送线程,它负责从worker的transfer-queue中读取消息,并通过网络发送给其他worker
     每个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中。
     每个worker进程控制一个或多个executor线程,用户可在代码中进行配置。其实就是我们在代码中设置的并发度个数。

    2.2、Worker进程间通信分析

    这里写图片描述
    1、 Worker接受线程通过网络接受数据,并根据Tuple中包含的taskId,匹配到对应的executor;然后根据executor找到对应的incoming-queue,将数据存发送到incoming-queue队列中。
    2、 业务逻辑执行现成消费incoming-queue的数据,通过调用Bolt的execute(xxxx)方法,将Tuple作为参数传输给用户自定义的方法
    3、 业务逻辑执行完毕之后,将计算的中间数据发送给outgoing-queue队列,当outgoing-queue中的tuple达到一定的阀值,executor的发送线程将批量获取outgoing-queue中的tuple,并发送到Worker的transfer-queue中
    4、 Worker发送线程消费transfer-queue中数据,计算Tuple的目的地,连接不同的node+port将数据通过网络传输的方式传送给另一个的Worker。
    5、 另一个worker执行以上步骤1的操作。

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

    2.3.1、Netty

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

    2.3.2、ZeroMQ

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

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

    2.4.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凭借该技术获得了金融行业技术评选大赛的最佳交易系统奖和甲骨文“公爵杯”创新编程框架奖。

    2.4.2、Disruptor是什么

    1、 简单理解:Disruptor是一个Queue。Disruptor是实现了“队列”的功能,而且是一个有界队列。而队列的应用场景自然就是“生产者-消费者”模型。
    2、 在JDK中Queue有很多实现类,包括不限于ArrayBlockingQueue、LinkBlockingQueue,这两个底层的数据结构分别是数组和链表。数组查询快,链表增删快,能够适应大多数应用场景。
    3、 但是ArrayBlockingQueue、LinkBlockingQueue都是线程安全的。涉及到线程安全,就会有synchronized、lock等关键字,这就意味着CPU会打架。
    4、 Disruptor一种线程之间信息无锁的交换方式(使用CAS(Compare And Swap/Set)操作)。

    2.4.2、Disruptor主要特点

    1、 没有竞争=没有锁=非常快。
    2、 所有访问者都记录自己的序号的实现方式,允许多个生产者与多个消费者共享相同的数据结构。
    3、 在每个对象中都能跟踪序列号(ring buffer,claim Strategy,生产者和消费者),加上神奇的cache line padding,就意味着没有为伪共享和非预期的竞争。

    2.4.2、 Disruptor 核心技术点

    Disruptor可以看成一个事件监听或消息机制,在队列中一边生产者放入消息,另外一边消费者并行取出处理.
    底层是单个数据结构:一个ring buffer。
    每个生产者和消费者都有一个次序计算器,以显示当前缓冲工作方式。
    每个生产者消费者能够操作自己的次序计数器的能够读取对方的计数器,生产者能够读取消费者的计算器确保其在没有锁的情况下是可写的。

    核心组件
     Ring Buffer 环形的缓冲区,负责对通过 Disruptor 进行交换的数据(事件)进行存储和更新。
     Sequence 通过顺序递增的序号来编号管理通过其进行交换的数据(事件),对数据(事件)的处理过程总是沿着序号逐个递增处理。
     RingBuffer底层是个数组,次序计算器是一个64bit long 整数型,平滑增长。
    这里写图片描述

    1、 接受数据并写入到脚标31的位置,之后会沿着序号一直写入,但是不会绕过消费者所在的脚标。
    2、 Joumaler和replicator同时读到24的位置,他们可以批量读取数据到30
    3、消费逻辑线程读到了14的位置,但是没法继续读下去,因为他的sequence暂停在15的位置上,需要等到他的sequence给他序号。如果sequence能正常工作,就能读取到30的数据。

    展开全文
  • GlusterFS文件系统弹性哈希算法

    千次阅读 2017-04-18 00:45:00
    GlusterFS采用独特的无中心对称式架构,无需专用的元数据服务集群,使用DHT算法进行文件分布和定位。本文深入剖析GlusterFS文件系统弹性哈希算法。
  • 事件(Event)来同步线程是最具弹性的了。一个事件有两种状态:激发状态和未激发状态。也称有信号状态和无信号状态。事件又分两种类型:手动重置事件和自动重置事件。手动重置事件被设置为激发状
  • 微服务 弹性伸缩 Kasun Indrasiri是WSO2的集成架构主管。 开发人员越来越依赖微服务体系结构将应用程序构建为一组细粒度,重点狭窄且独立的服务,每个服务均独立开发和部署。 尽管微服务方法促进了敏捷性,但它也...
  •  我们提出的弹性分布式数据集(RDDs),是一个让程序员在大型集群上以容错的方式执行基于内存计算的分布式内存抽象。RDDs受启发于两类使用当前计算框架处理不高效的应用:迭代算法和交互式数据挖掘工具。这二者在...
  • 弹性公网IP(EIP)

    2020-11-25 10:26:22
    第一次听说弹性公网ip的时候,我以为是ip地址遇到大流量或者突发攻击时随机变换,我百思不得其解,为什么会是这样的,觉得这样的机制很狗屎,不科学!随后学习才知道,望文生义就是这样来的,EIP只是根据当时网络的...
  • 事件(Event)来同步线程是最具弹性的了。一个事件有两种状态:激发状态和未激发状态。也称有信号状态和无信号状态。事件又分两种类型:手动重置事件和自动重置事件。手动重置事件被设置为激发状态后,会唤醒所有...
  • 线程同步机制的区别与比较及进程通信方法 有关多线程的一些技术问题:1、 何时使用多线程?2、 线程如何同步?3、 线程之间如何通讯?4、 进程之间如何通讯?先来回答第一个问题,线程实际主要应用于四个主要...
  • 微服务弹性伸缩与负载均衡

    千次阅读 2018-02-08 17:40:59
    微服务弹性伸缩与负载均衡 微服务如何实现弹性伸缩 云帮的应用弹性伸缩有不同的层次、类型及形式,且进行伸缩操作对用户是无影响的,服务不会有任何的中断(平滑伸缩)。由于平台是基于容器技术的,因此伸缩的...
  • 总第443篇2021年 第013篇弹性伸缩具有应突发、省成本、自动化的业务价值。平台侧将各业务零散、闲置资源进行整合,形成一个大规模资源池,通过弹性调度、库存管控技术在公司运营成本和业务体...
  • 文章目录弹性伸缩理论知识弹性伸缩在线实验使用流程1. 创建伸缩组前提条件配置流程2. 创建伸缩配置3. 启用伸缩组4. 创建伸缩规则伸缩规则限制5. 创建定时任务6. 创建报警任务 弹性伸缩理论知识 请参考《阿里云ACP...
  • 摘要: 最完整的微服务化示例,从业务场景入手,讲述微服务化架构设计、容器化、集群部署、弹性伸缩本文转载自 微服务 开源项目 Apache ServiceComb (incubating) 官网博客:...
  • 简介 在单体式应用中,各个模块之间的调用是通过编程语言级别的方法或者函数来实现的。 但是一个基于微服务的分布式... 因此,微服务必须使用进程内通信协议(如 HTTP、AMQP)或二进制协议(如 TCP)进行交互,...
  • irf(智能弹性架构)

    千次阅读 2012-12-12 10:28:40
    公司园区网络架构中,在考虑的冗余,本想采用vrrp,供应商提供采用irf。 查看h3c的材料 基于IRF2的网络安全设计思路 ...   看看华三的网站,了解一下。 IRF智能弹性架构
  • 二、EC2的通信机制 EC2的实例一旦被创建就会动态地分配公共IP地址和私有IP地址 私有IP地址由动态主机配置协议(DHCP)分配产生 三、弹性负载平衡 弹性负载平衡功能允许EC2实例自动分发应用流量,从而...
  •  摘 要 本文简要介绍了弹性分组环(RPR)技术的出现背景、技术特点。该技术目前正在由IEEE 802.17工作组进行标准化,主要应用于城域网建设中。  关键词 弹性分组环 城域网 协议  QoSSDH  1 ...
  • 通往弹性软件架构之路

    千次阅读 2007-01-22 20:19:00
    通过分析这些关键用例,可以构建一个弹性架构,也就是说,各种不同类型的关注点保持分离,而系统中的一部分发生变化时对其余部分的影响是最小的。同时,架构的设计也必须满足诸如性能、可靠性等系统级关注点。架构将...
  • 这是 使用Nomad构建弹性基础架构 系列文章的第二篇。在本系列中,我们将探讨Nomad如何处理意外故障、停机和集群基础设施的常规维护,通常不需要操作员干预。 在这篇文章中,我们将会看到Nomad客户端如何通过驱动...
  • 9 月 11 日,蚂蚁金服在2019谷歌开发者大会上海站上开源了 ElasticDL 项目,这是业界首个基于 TensorFlow 实现弹性深度学习的开源系统。开源地址为...
  • 4.3 弹性计算云EC2亚马逊弹性计算云服务(Elastic Compute Cloud,EC2)是亚马逊提供的云计算环境的基本平台。网络数据流的流向非常复杂,企业和个人的网络平台所需的计算能力也随着这些流量增加在不断地变化着。...
  • 弹性光网络(基础知识)

    万次阅读 2014-07-29 21:13:56
    网络的固定频谱分割机制弹性光网络采用的频谱分割机制是灵活可变的。 第二层含义是指弹性光网络中采用的带宽转换器(Bandwidth Variable Transponder, BVT )能建立弹性的光路径,即对于同一条端到端的光...
  • Docker 1.12迎来内置编排机制

    万次阅读 2016-06-22 07:51:37
    节点间通信利用gRPC实现,其能够实现连接复用与标题压缩等HTTP/2出色特性。归功于protobufs,我们的传输结构效率也得到了显著提升。 感兴趣的朋友可以参阅Docker 1.12的其它说明资源: 为Mac或Windows...
  • 亚马逊弹性计算云(Amazon EC2)

    万次阅读 2012-05-21 14:34:42
    亚马逊弹性计算云(Amazon EC2)是一个Web服务,提供可调整的云计算能力。它旨在为开发人员提供简便的使用网络规模计算。 Amazon EC2简单的Web服务界面,让您可以以最小的代价获取和配置计算能力。它让您完全控制您...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 23,545
精华内容 9,418
关键字:

弹性事件通信机制