环形队列,disruptor中的核心存储类
- Sequencer
序号实现器,维护发送者发送的序号生成逻辑、消费方获取可消费的序号,是无锁化访问的核心实现类,共有两个实现类,MultiProducerSequencer为多生产者实现类、SingleProducerSequencer单生产者实现类。
- WaitStrategy
等待策略,消息发送者在容器已写满时、消费者在无消费数据时的等待策略,disruptor提供了N种实现类:
- BlockingWaitStrategy
基于juc的阻塞等待。
- LiteTimeoutBlockingWaitStrategy
带超时时间的阻塞等待。
- YieldingWaitStrategy
先自旋100次,如果还不满足条件,则每次调用yield方法,让出CPU,重新参与调度。
- BusySpinWaitStrategy
自旋,直到满足条件,生产环境慎用。
- TimeoutBlockingWaitStrategy
带超时时间的阻塞等待,与LiteTimeoutBlockingWaitStrategy的区别是TimeoutBlockingWaitStrategy等待时间必须严格低于设定的值。
- SleepingWaitStrategy
前100次自旋每一次都调用yield,然后阻塞1ms ,继续重试。
- PhasedBackoffWaitStrategy
组合策略,可以指定上述策略,然后退化为 yield自旋。
WaitStrategy在创建RingBuffer时指定,默认为BlockingWaitStrategy。
- SequenceBarrier
序号栈栏。在流水线上有多个步骤,后一个步骤必须依赖前一个步骤的完成,栈栏的作用就在于此。
- EventFactory
事件生成器工厂类,RingBuffer的设计为力避免频繁的垃圾回收,在RingBuffer中存储的值会预先创建,生产者获取一个Event对象,并填充具体的值,故通常事件对象通常创建的事一个包装类。
- EventProcessor
事件处理器,disruptor中提供了两类事件处理器WorkProcessor、BatchEventProcessor(批处理),它的职责是从RingBuffer中获取可消费的事件,然后调用EventHandler的onEvent方法。
- EventHandler
事件处理器在获取一个可处理的事件后调用EventHandler的onEvent方法,这也是用户自定处理程序的入口,即编写用户业务代码的扩展点。
- ExceptionHandler
异常处理策略。
首先以笔者在工作中遇到一个经典使用场景来和大家观摩一下disruptor的基本使用。
在互联网行业中有一种经典的读写分离架构:数据异构,以物流下单为示例,通常关系型数据库只负责订单的创建业务,而关于订单查询、订单轨迹查询等查询类业务,通常会去查询es,依此来降低数据库压力,但接踵而来的问题是如何将数据库的数据准实时同步到Es呢?canal闪亮登场,其核心理念就是订阅并解析binlog,其基本的流程如下:
在示例中解析binlog的目的是提取数据的变化,即DML语句(插入、更新、删除),将这些数据变更在目标端进行重放,为了提高性能,采用disruptor框架提高性能,该如何实现呢?
-
将解析动作分解为两步,第一步判断事件是否是dml事件,即是否需要解析。
-
解析dml
为什么要这样拆分呢?一是将粒度降低,解耦,灵活提供不一样的并发度。
接下来我们看一下canal中是如何使用disruptor来解决该问题的。
2.1 创建EventFactory
首先需要创建一个EventFactory,用于填充RingBuffer中的对象,避免过多垃圾回收。
2.2 创建RingBuffer
根据bingo dump协议,mysql的解析线程创建一个,故该场景下的事件发送者只有一个,创建一个单生产者的RingBuffer,其代码如下:
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
结语
小编也是很有感触,如果一直都是在中小公司,没有接触过大型的互联网架构设计的话,只靠自己看书去提升可能一辈子都很难达到高级架构师的技术和认知高度。向厉害的人去学习是最有效减少时间摸索、精力浪费的方式。
我们选择的这个行业就一直要持续的学习,又很吃青春饭。
虽然大家可能经常见到说程序员年薪几十万,但这样的人毕竟不是大部份,要么是有名校光环,要么是在阿里华为这样的大企业。年龄一大,更有可能被裁。
送给每一位想学习Java小伙伴,用来提升自己。
本文到这里就结束了,喜欢的朋友可以帮忙点赞和评论一下,感谢支持!
序员年薪几十万,但这样的人毕竟不是大部份,要么是有名校光环,要么是在阿里华为这样的大企业。年龄一大,更有可能被裁。
送给每一位想学习Java小伙伴,用来提升自己。
[外链图片转存中…(img-dByQSEko-1712016406377)]
本文到这里就结束了,喜欢的朋友可以帮忙点赞和评论一下,感谢支持!