CN106802824A - 一种基于Disruptor的数据收发方法 - Google Patents
一种基于Disruptor的数据收发方法 Download PDFInfo
- Publication number
- CN106802824A CN106802824A CN201611199684.8A CN201611199684A CN106802824A CN 106802824 A CN106802824 A CN 106802824A CN 201611199684 A CN201611199684 A CN 201611199684A CN 106802824 A CN106802824 A CN 106802824A
- Authority
- CN
- China
- Prior art keywords
- data
- disruptor
- sequence number
- method based
- transmitting method
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/466—Transaction processing
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/54—Interprogram communication
- G06F9/546—Message passing systems or structures, e.g. queues
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2209/00—Indexing scheme relating to G06F9/00
- G06F2209/54—Indexing scheme relating to G06F9/54
- G06F2209/541—Client-server
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Computer And Data Communications (AREA)
Abstract
本发明公开了一种基于Disruptor的数据收发方法,用于数据处理系统,包括:当接收到上游子系统的待处理数据时,事件处理器获取Disruptor下的RingBuffer的当前最新写入数据的序列号,并将待处理数据写入序列号所在槽的下一个空闲槽;RingBuffer将当前最新写入数据的序列号加1并公布,然后通知事件监听处理器以进行数据的消费和处理。由于Disruptor相对于传统方式没有锁也就不存在竞争,因此能够克服处理延迟较高的问题,另外无需CPU频繁的资源调度,因此整体的消息处理性能和吞吐量随着线程数量的增加而线性提升。
Description
技术领域
本发明涉及计算机技术领域,特别是涉及一种基于Disruptor的数据收发方法。
背景技术
在大规模的数据处理中,为了实现高性能(低延迟、低资源耗用等)系统,如电子商务系统,金融交易系统等。工程师们会结合现代计算机处理器(CPU)的特点,设计多任务、多线程的架构。这些运行的任务线程,可以争用处理器计算时间,各自独立执行,最终完成同一个或不同的处理任务,这就是我们说的并发。并发程序中通常会发生针对同一程序对象或计算机资源的抢占争用,为了保证这种对某一资源对象的访问操作是安全有序(即线程安全)的,必须为它们设计相应的锁,即我们通常讲的并发同步锁。所以就很容易看到“申请锁”、“读写数据对象(操作资源对象)”、“释放锁”的循环反复情景。在各种架构中,都有专门的、支持并发任务处理的实现,如Java中的线程池ThreadPoolExecutor。
在生产者-消费者场景中,如果生产者和消费者分别使用不同的线程实现,那么这一模型的实质就是不同线程对数据的共享和传递。而在当前普遍的架构中,是使用队列(Queue)来共享数据,生产者线程将消息产出后,放入队列,消费者线程从该队列中获取消息并处理。消息因此得到了传递。所以,队列也可以看成是消息的缓冲区。这种架构允许生产线程在消费线程处理不过来的情况下,还可以继续后面的工作。在Java中,对于队列(Queue)来说,BlockingQueue是主要的线程安全版本。
基于BlockingQueue和ThreadPoolExecutor这一典型的传统技术方案。虽然它帮助实现了异步的、较高性能的并发消息处理,但随着业务增长和上游子系统提交的消息量增加,该方案的缺点也显露无疑。这是因为,这种任务处理机制存在以下明显的不足(缺点):
(1)BlockingQueue和ThreadPoolExecutor中的并发同步锁无处不在。而锁技术是慢的,代价昂贵。因为它依赖底层操作系统,这导致消息的处理延迟较高。
(2)线程需要申请CPU时间窗口以便执行。数量众多的线程间的上下文切换,意味着频繁的CPU计算资源调度。最终的结果就是,整体的消息处理性能和吞吐量并不能随着线程数量的增加而线性提升。
由此可见,在数据收发过程中,如何克服BlockingQueue和ThreadPoolExecutor所带来的问题是本领域技术人员亟待解决的问题。
发明内容
本发明的目的是提供一种基于Disruptor的数据收发方法,用于在数据收发过程中,克服BlockingQueue和ThreadPoolExecutor所带来的问题。
为解决上述技术问题,本发明提供一种基于Disruptor的数据收发方法,用于数据处理系统,包括:
当接收到上游子系统的待处理数据时,事件处理器获取Disruptor下的RingBuffer的当前最新写入数据的序列号,并将所述待处理数据写入所述序列号所在槽的下一个空闲槽;
所述RingBuffer将当前最新写入数据的序列号加1并公布,然后通知事件监听处理器以进行数据的消费和处理。
优选地,所述RingBuffer中的槽的数量为2n,其中,n为正整数。
优选地,所述序列号与所述槽的位置号相同。
优选地,所述事件处理器通过基于Netty的数据传输协议接收所述上游子系统的待处理数据。
优选地,所述Disruptor支持单个生产者模式或多个生产者模式。
优选地,还包括:
所述事件监听处理器通过ExecutorService提供的线程池触发所述数据的消费和处理。
本发明所提供的基于Disruptor的数据收发方法,用于数据处理系统,包括:当接收到上游子系统的待处理数据时,事件处理器获取Disruptor下的RingBuffer的当前最新写入数据的序列号,并将待处理数据写入序列号所在槽的下一个空闲槽;RingBuffer将当前最新写入数据的序列号加1并公布,然后通知事件监听处理器以进行数据的消费和处理。由于Disruptor相对于传统方式没有锁也就不存在竞争,因此能够克服处理延迟较高的问题,另外无需CPU频繁的资源调度,因此整体的消息处理性能和吞吐量随着线程数量的增加而线性提升。经过测试对比发现,基于Disruptor的数据收发方法的性能比基于BlockingQueue的收发方法高出一个数量级,数据处理的吞吐量和延迟指标都远远超越了BlockingQueue的收发方法高出一个数量级,数据处理的吞吐量和延迟指标都远远超越了BlockingQueue的收发方法。
附图说明
为了更清楚地说明本发明实施例,下面将对实施例中所需要使用的附图做简单的介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本发明实施例提供的一种基于Disruptor的数据收发方法的流程图;
图2为本发明实施例提供的一种基于Disruptor的数据收发的示意图;
图3为本发明实施例提供的另一种基于Disruptor的数据收发方法的流程图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下,所获得的所有其他实施例,都属于本发明保护范围。
本发明的核心是提供一种基于Disruptor的数据收发方法,用于在数据收发过程中,克服BlockingQueue和ThreadPoolExecutor所带来的问题。
为了使本技术领域的人员更好地理解本发明方案,下面结合附图和具体实施方式对本发明作进一步的详细说明。
图1为本发明实施例提供的一种基于Disruptor的数据收发方法的流程图。图2为本发明实施例提供的一种基于Disruptor的数据收发的示意图。如图1所示,基于Disruptor的数据收发方法,用于数据处理系统,包括以下步骤:
S10:当接收到上游子系统的待处理数据时,事件处理器获取Disruptor下的RingBuffer的当前最新写入数据的序列号,并将待处理数据写入序列号所在槽的下一个空闲槽。
S11:RingBuffer将当前最新写入数据的序列号加1并公布,然后通知事件监听处理器以进行数据的消费和处理。
Disruptor的关键特性是无锁编程,这个是通过单一写线程的方式实现的,即一块数据在同一时间永远只有一个线程写入。通过遵循这个编程原则来避免使用昂贵的同步锁或CAS操作,这就是为什么Disruptor这么快的原因。Disruptor在的缓存区域就是RingBuffer。Ring Buffer:如其名,环形的缓冲区。这个数据结构的主要特点是,数据是被写入到它上面一个个称为槽的位置,前提是这个槽是空闲的。
在具体实施中,这些槽的数量是可以允许自己定义和设置的,作为优选地实施方式,RingBuffer中的槽的数量为2n,其中,n为正整数。所以它可以是几万到几千万数量不等的数据缓冲规模。RingBuffer里的每一个数据都有一个序列号(sequence number)来索引,在具体实施中,可以设置序列号与槽的位置号相同。RingBuffer维护当前最新放置的元素的序列号,这个序列号一直递增,(通过求余来得到数据在RingBuffer下面的数组下标)。可以理解的是,如果RingBuffer中的槽用完后,则之前被取走数据的槽就可以作为空闲槽进入一轮的使用,此时槽的序号会依据当前待处理的序列号而变化。
例如,RingBuffer维护的最新写入的数据的序列号是18,事件处理器在接收到待处理数据后,从RingBuffer可以获知下一空闲数据写入槽位是19,则生产线程将待处理数据写入到19号槽位。写入之后,RingBuffer才会将最后写入数据的序列号更新为19并对外公布,并通知事件监听处理器进行消息数据的消费和处理。
如图2所示,该图显示的是基于Disruptor的新技术方案,事件处理器在接收到上游子系统提交来的待处理数据后,放入了Disruptor中的内存存储结构RingBuffer中,这些待处理数据被认为是一个个事件(event),并被Disruptor中已注册的若干个事件监听处理器(event handler)监听和处理。在此图中,左边将待处理数据写入Ring Buffer结构中的箭头就是“生产者-消费者”模型中的生产者,而右边的箭头,即事件监听处理器就是消费者。
本实施例提供的基于Disruptor的数据收发方法,用于数据处理系统,包括:当接收到上游子系统的待处理数据时,事件处理器获取Disruptor下的RingBuffer的当前最新写入数据的序列号,并将待处理数据写入序列号所在槽的下一个空闲槽;RingBuffer将当前最新写入数据的序列号加1并公布,然后通知事件监听处理器以进行数据的消费和处理。由于Disruptor相对于传统方式没有锁也就不存在竞争,因此能够克服处理延迟较高的问题,另外无需CPU频繁的资源调度,因此整体的消息处理性能和吞吐量随着线程数量的增加而线性提升。经过测试对比发现,基于Disruptor的数据收发方法的性能比基于BlockingQueue的收发方法高出一个数量级,数据处理的吞吐量和延迟指标都远远超越了BlockingQueue的收发方法高出一个数量级,数据处理的吞吐量和延迟指标都远远超越了BlockingQueue的收发方法。
在上述实施例的基础上,事件处理器通过基于Netty的数据传输协议接收上游子系统的待处理数据。基于Netty(一个基于NIO的、提供异步的、事件驱动的、客户-服务器端通信编程框架)的数据传输协议,连接上游子系统。上游子系统的待处理数据正是通过基于Netty的数据传输协议被提交到了核心系统。
Disruptor支持两种生产者类型,SINGLE和MULTI,即单个生产者模式或多个生产者模式。在具体实施中,可以根据实际情况设置,如图2所示,配置的是多个生产者模式。
图3为本发明实施例提供的另一种基于Disruptor的数据收发方法的流程图。在上述实施例的基础上,还包括:
S12:事件监听处理器通过ExecutorService线程池触发数据的消费和处理。
在基于Netty的数据传输协议中,可以配置事件监听处理器和ExecutorService线程池。这里的事件监听处理器就是消费者(Consumer),可以是一个也可以是多个,它们是通过ExecutorService提供的线程来触发消息事件处理的。正是因为有了RingBuffer这一优越的数据结构作为基础,配合Disruptor中以序列号(sequence number)来索引这一核心设计要素,使得消费者线程避免了昂贵的同步锁就可以高效地消费和处理待处理数据。
以上对本发明所提供的基于Disruptor的数据收发方法进行了详细介绍。说明书中各个实施例采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似部分互相参见即可。对于实施例公开的装置而言,由于其与实施例公开的方法相对应,所以描述的比较简单,相关之处参见方法部分说明即可。应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以对本发明进行若干改进和修饰,这些改进和修饰也落入本发明权利要求的保护范围内。
Claims (6)
1.一种基于Disruptor的数据收发方法,用于数据处理系统,其特征在于,包括:
当接收到上游子系统的待处理数据时,事件处理器获取Disruptor下的RingBuffer的当前最新写入数据的序列号,并将所述待处理数据写入所述序列号所在槽的下一个空闲槽;
所述RingBuffer将当前最新写入数据的序列号加1并公布,然后通知事件监听处理器以进行数据的消费和处理。
2.根据权利要求1所述的基于Disruptor的数据收发方法,其特征在于,所述RingBuffer中的槽的数量为2n,其中,n为正整数。
3.根据权利要求1所述的基于Disruptor的数据收发方法,其特征在于,所述序列号与所述槽的位置号相同。
4.根据权利要求1所述的基于Disruptor的数据收发方法,其特征在于,所述事件处理器通过基于Netty的数据传输协议接收所述上游子系统的待处理数据。
5.根据权利要求1所述的基于Disruptor的数据收发方法,其特征在于,所述Disruptor支持单个生产者模式或多个生产者模式。
6.根据权利要求1所述的基于Disruptor的数据收发方法,其特征在于,还包括:
所述事件监听处理器通过ExecutorService提供的线程池触发所述数据的消费和处理。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201611199684.8A CN106802824A (zh) | 2016-12-22 | 2016-12-22 | 一种基于Disruptor的数据收发方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201611199684.8A CN106802824A (zh) | 2016-12-22 | 2016-12-22 | 一种基于Disruptor的数据收发方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN106802824A true CN106802824A (zh) | 2017-06-06 |
Family
ID=58984071
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201611199684.8A Pending CN106802824A (zh) | 2016-12-22 | 2016-12-22 | 一种基于Disruptor的数据收发方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN106802824A (zh) |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110473113A (zh) * | 2019-07-08 | 2019-11-19 | 中国平安人寿保险股份有限公司 | 基于disruptor提高业务系统吞吐量方法、装置及介质、服务器 |
CN111158876A (zh) * | 2019-12-26 | 2020-05-15 | 杭州安恒信息技术股份有限公司 | 一种日志处理方法、装置、设备及计算机可读存储介质 |
CN111831446A (zh) * | 2020-07-15 | 2020-10-27 | 北京思特奇信息技术股份有限公司 | 一种基于Disruptor的数据读写方法、装置及介质 |
CN112015797A (zh) * | 2020-08-31 | 2020-12-01 | 中国平安人寿保险股份有限公司 | 一种读取数据的方法及计算机设备 |
CN113742035A (zh) * | 2020-05-27 | 2021-12-03 | 北京沃东天骏信息技术有限公司 | 一种边缘任务执行方法和装置 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6691178B1 (en) * | 2000-02-22 | 2004-02-10 | Stmicroelectronics, Inc. | Fencepost descriptor caching mechanism and method therefor |
US20050120351A1 (en) * | 2003-10-31 | 2005-06-02 | De Bonet Jeremy S. | System and method for a synchronized shared buffer architecture for multimedia players |
CN102981823A (zh) * | 2012-10-25 | 2013-03-20 | 四川农业大学 | 一种领域驱动开发插件系统 |
CN105224445A (zh) * | 2015-10-28 | 2016-01-06 | 北京汇商融通信息技术有限公司 | 分布式跟踪系统 |
-
2016
- 2016-12-22 CN CN201611199684.8A patent/CN106802824A/zh active Pending
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6691178B1 (en) * | 2000-02-22 | 2004-02-10 | Stmicroelectronics, Inc. | Fencepost descriptor caching mechanism and method therefor |
US20050120351A1 (en) * | 2003-10-31 | 2005-06-02 | De Bonet Jeremy S. | System and method for a synchronized shared buffer architecture for multimedia players |
CN102981823A (zh) * | 2012-10-25 | 2013-03-20 | 四川农业大学 | 一种领域驱动开发插件系统 |
CN105224445A (zh) * | 2015-10-28 | 2016-01-06 | 北京汇商融通信息技术有限公司 | 分布式跟踪系统 |
Non-Patent Citations (2)
Title |
---|
TRISHA: "剖析Disruptor_为什么会这么快", 《HTTP://IFEVE.COM/DISSECTING-DISRUPTOR-WHATS-SO-SPECIAL/》 * |
WWW.MYEXCEPTION.CN: "并发框架Disruptor学习总结", 《HTTP://WWW.MYEXCEPTION.CN/PROGRAM/1642058.HTML》 * |
Cited By (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110473113A (zh) * | 2019-07-08 | 2019-11-19 | 中国平安人寿保险股份有限公司 | 基于disruptor提高业务系统吞吐量方法、装置及介质、服务器 |
CN110473113B (zh) * | 2019-07-08 | 2024-04-09 | 中国平安人寿保险股份有限公司 | 基于disruptor提高业务系统吞吐量方法、装置及介质、服务器 |
CN111158876A (zh) * | 2019-12-26 | 2020-05-15 | 杭州安恒信息技术股份有限公司 | 一种日志处理方法、装置、设备及计算机可读存储介质 |
CN111158876B (zh) * | 2019-12-26 | 2023-06-06 | 杭州安恒信息技术股份有限公司 | 一种日志处理方法、装置、设备及计算机可读存储介质 |
CN113742035A (zh) * | 2020-05-27 | 2021-12-03 | 北京沃东天骏信息技术有限公司 | 一种边缘任务执行方法和装置 |
CN111831446A (zh) * | 2020-07-15 | 2020-10-27 | 北京思特奇信息技术股份有限公司 | 一种基于Disruptor的数据读写方法、装置及介质 |
CN112015797A (zh) * | 2020-08-31 | 2020-12-01 | 中国平安人寿保险股份有限公司 | 一种读取数据的方法及计算机设备 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN106802824A (zh) | 一种基于Disruptor的数据收发方法 | |
US10261813B2 (en) | Data processing system for dispatching tasks from a plurality of applications to a shared resource provided by an accelerator | |
CN102591843B (zh) | 多核处理器的核间通信方法 | |
US9032128B2 (en) | Method and system for generating and delivering inter-processor interrupts in a multi-core processor and in certain shared memory multi-processor systems | |
US10380058B2 (en) | Processor core to coprocessor interface with FIFO semantics | |
EP3701377B1 (en) | Method and apparatus for updating shared data in a multi-core processor environment | |
CN102693162A (zh) | 基于共享内存和核间中断的多核平台上多个虚拟机之间进程通信方法 | |
CN106844017A (zh) | 用于网站服务器处理事件的方法和设备 | |
US20210334228A1 (en) | Managing network interface controller-generated interrupts | |
RU2009139312A (ru) | Способ устранения исключительной ситуации в одном из ядер многоядерной системы | |
KR100850387B1 (ko) | 패시브 스레드 및 액티브 세마포어를 갖는 처리 아키텍쳐 | |
CN102567090A (zh) | 在计算机处理器中创建执行线程的方法和系统 | |
CN107562685B (zh) | 一种基于延时补偿的多核处理器核心间数据交互的方法 | |
CN102323894A (zh) | 企业分布式应用间实现非阻塞方式相互调用的系统及方法 | |
CN105635298A (zh) | 一种基于业务隔离原理的数据采集设备统一接入系统 | |
CN114564435A (zh) | 异构多核芯片的核间通信方法、装置及介质 | |
US9582340B2 (en) | File lock | |
CN111209123A (zh) | 一种本地存储io协议栈数据交互方法和装置 | |
CN101189579B (zh) | 用于多线程处理的使用信号量的方法和装置 | |
CN113485840A (zh) | 基于Go语言的多任务并行处理装置及方法 | |
US10277547B2 (en) | Data communications in a distributed computing environment | |
CN110837419A (zh) | 基于弹性批处理的推理引擎系统、方法及电子设备 | |
CN114697194B (zh) | 阻塞式事件通知方法及装置 | |
CN109992359A (zh) | 一种事务调度方法 | |
CN101976206A (zh) | 一种中断处理方法和装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
RJ01 | Rejection of invention patent application after publication |
Application publication date: 20170606 |
|
RJ01 | Rejection of invention patent application after publication |