从零开始实现lmax-Disruptor队列(二)多消费者、消费者组间消费依赖原理解析

Java34

在v1版本的MyDisruptor实现单生产者、单消费者功能后。按照计划,v2版本的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中的生产者和消费者是互相制约的,生产者的生产速度不能过快,在逻辑上队列已满时需要阻塞等待消费者进行消费,直到队列不满。
  • 为了支持多个消费者,上述描述需要调整:即生产商的生产速度不能太快。从逻辑上讲,当队列已满时,您需要阻塞并等待“最慢的消费者”完成消费,直到队列不满意为止。
    [En]

    to support multiple consumers, the above description needs to be adjusted: that is, the production speed of the producer cannot be too fast. Logically, when the queue is full, you need to block and wait for the " * slowest consumer * " to complete the consumption until the queue is dissatisfied.*

  • disruptor中每个消费者都拥有自己的消费序列号,生产者在生产时需要保证生产的序列号不能覆盖任何一个消费者,即生产者的序列号不能超过最慢的消费者序列号一圈(Producer.Sequence - SlowestConsumer.Sequence

```java
package mydisruptor;

import mydisruptor.util.SequenceUtil;
import mydisruptor.waitstrategy.MyWaitStrategy;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.locks.LockSupport;

/**

输入验证码查看隐藏内容

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

相关文章
Java

都是中文用户名惹的祸~

进入公司遇到的第一个棘手BUG; 在数据库连接和配置正确的前提下,服务无法启动,控制台上报如下错误:[En]Under the premise that the database connection...
Java

每日一题(2022-5-24):经典搜索算法

题目 给定一个文件目录的路径,统计这个目录下所有的文件数并返回 分析 这个问题很容易想到深度搜索或广泛搜索。它不仅检查搜索算法的应用,而且检查文件的操作。这个问题在面试中很常见[En]This que...
Java

实现get/post请求调用第三方接口

java内存区域和内存模型是不一样的东西,内存区域是指Jvm运行时将数据分区存储,强调对内存空间的划分。而内存模型是定义了线程和主内存之间的关系,即JVM在计算内存中的工作方式,如果我们想要深入了解J...
Java

docker 安装mysql5.7

拉取镜像 docker pull mysql:5.7 准备数据目录 mkdir -p /mall/docker/mysql/conf mkdir -p /mall/docker/mysql/logs ...
Java

Java学习 (16) Java方法篇(03)递归

递归 语法实例 递归与循环的区别 递归优缺点 循环优缺点 递归 递归就是就是自己调用自己 利用递归可以用简单的程序来解决一些复杂的问题。它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的...
Java

spring boot学习

每一次的加载都会去扫描spring.factories文件里面的类并且放入ioc中 注解 @Async,@EnableAsync 前者告诉spring这是一个异步任务,后者在启动类上表示开启这个功能 ...
Java

CompletableFuture的入门

runAsync 和 supplyAsync runAsync接受一个Runable的实现,无返回值 CompletableFuture.runAsync(()->System.out.prin...
Java

Spider

流程: 迭代进行:种子url->Element遍历获取超链接lin->作为新种子id ⚠️注意频率和遍历深度 1.设定url及请求参数 headers = {"user-agen...
Java

浅谈一下流式处理平台Flink

大数据框架听过很多,比如 Hadoop,HDFS...不过自己的项目都没有上过 为什么突然提到 Flink,因为最近一个项目需要用到,所以学习最好的方式就是 项目驱动 我过去认为我必须在做之前学习一些...
Java

Java(11)自定义类

之前的例子中,我们已经编写了一些简单的类。但是,那些类都只包含一个简单的main方法。现在来学习如何编写复杂应用程序所需要的那种主力类。通常这些类没有main方法,却有自己的实例字段和实例方法。要想构...
Java

JavaSE-时间差

```java public static String getDiffDateStr(Date startTime,Date endTime){ long diff = endTime.getTim...
Java

java的ConCurrentHashMap

一般的应用的编程,用到ConCurrentHashMap的机会很少,就象大家调侃的一样:只有面试的时候才用得着。 但还是有。 网上关于这个的资料,多如牛毛,大部分是原理分析和简单例子。 原理的核心就一...