从零开始实现lmax-Disruptor队列(三)多线程消费者WorkerPool原理解析

Java29

在v2版本的MyDisruptor实现多消费者、消费者组间依赖功能后。按照计划,v3版本的MyDisruptor需要支持多线程消费者的功能。

由于这篇文章是一系列博客的一部分,我们需要了解前一篇博客的内容,以便更好地理解这篇博客。

[En]

Since the article is part of a series of blogs, we need to know the content of the previous blog in order to better understand this blog.

  • 之前的版本中我们已经实现了单线程消费者串行的消费,但在某些场景下我们需要更快的消费速度,所以disruptor也提供了多线程的消费者机制。
  • 多线程消费者对外功能上和单线程消费者基本一样,也是全量的消费从序列0到序列N的完整事件,但内部却是局部并行乱序消费的。在一定的范围内,具体哪个线程消费哪个事件是通过CAS争抢随机获得的。
    从零开始实现lmax-Disruptor队列(三)多线程消费者WorkerPool原理解析

  • disruptor中多线程消费者的载体是WorkerPool。

  • 在V3版本的MyDisruptor中,MyWorkerPool和单线程消费者MyBatchEventProcessor一样,构造函数都是传入三个关键组件:RingBuffer、序列屏障mySequenceBarrier和用户自定义的事件处理器。
  • 和单线程消费者不同,多线程消费者允许传入一个用户自定义的事件处理器MyWorkHandler集合。传入的每个MyWorkHandler都会创建一个MyWorkProcessor对象将其封装、包裹起来(下文会展开介绍MyWorkProcessor)。
  • 虽然同为用户自定义的消费处理器接口,disruptor中WorkHandler和单线程消费者中传入的EventHandler有些不一样。其消费处理接口只传入了事件对象本身,并没有sequence和endOfBatch参数。
    主要原因是因为多线程消费者内部的消费是并行、乱序的,因此sequence序列号意义不大,且endOfBatch也无法准确定义。
  • WorkerPool对外提供了一个用于启动消费者的方法start,要求外部传入一个juc下的Executor实现用于启动所有的MyWorkProcessor任务。

```java
/*
* 多线程消费者(仿Disruptor.WorkerPool)
*
/
public class MyWorkerPool {

输入验证码查看隐藏内容

扫描二维码关注本站微信公众号 Johngo学长
或者在微信里搜索 Johngo学长
回复 svip 获取验证码
wechat Johngo学长

相关文章
Java

架构设计之设计模式总结

在实际的项目开发中,我们经常使用设计模式。设计模式能否正确、合理、灵活地应用到项目中,是判断您开发能力的重要指标之一。一方面,您需要为编程打下坚实的基础,另一方面,需要积累大量的项目经验。这个过程不是...
Java

Storm2

```java;gutter:true; package storm.scheduler; import java.util.ArrayList; import java.util.Collectio...
Java

RabbitMQ 工作队列

每日一句 如果你执意追逐我的幻影,迟早会被真正的我打败。 https://www.ylcoder.top/post/1649241412 概述 工作队列(也称为任务队列)的主要思想是避免立即执行资源密...
Java

识别 UTF-8 编码

思路:如果GBK中文字节流我们使用 UTF-8 编码,会出现未知字符�,字节代表数字为 -65, -67。 所以先尝试用 utf-8 编码,然后获取字节流,判断其中是否存在未知字符。 流程:当直接使用...
Java

Map集合

一、什么是Map: 首先map是一个集合,一种按照键存储元素的容器。在map中键可以是任意类型的对象,map中不能有重复的键,每一个键都有一个对应的值。 二、Map集合的特点: 1、Map是一个双列集...
Java

地址解析协议(ARP) 分析

什么是ARP协议 ARP( A ddress R esolution P rotocol)— 地址解析协议 ,用于将IP地址解析为MAC地址。复杂来说,ARP用于32位IPv4地址和以太网的48位MA...
Java

设计模式之模板方法模式

在我们的实际开发中,如果一个方法非常复杂,如果我们把所有的逻辑都写在一个方法中,维护起来非常困难,当我们想要替换它们的时候,我们必须重写一些步骤,所以代码的可扩展性很差。当你遇到这种情况时,你应该考虑...
Java

Vue初探

MVVM模型 M:模型(Model) :对应 data 中的数据 V:视图(View) :模板(理解为html页面) VM:视图模型(ViewModel) : Vue 实例对象 数据驱动视图: 如上图...