Disruptor简单了解

1.简介
  1.1 它是一个高性能的【线程间】异步通信的开源的并发框架,即在【同一个JVM进程】中的【多线程间】消息传递。
      Disruptor 是国外 lmax 平台的核心-无锁并行计算框架!LMAX是一种新型零售金融交易平台,它能够以很低的延迟产生大量交易。
      这个系统是建立在JVM平台上,其核心是一个业务逻辑处理器,它能够在一个线程里每秒处理600万订单。
      业务逻辑处理器完全是运行在内存中,使用事件源驱动的方式。
      业务逻辑驱动器的核心是Disruptor。Disruptor主动将数据发送到数据消费端,600万指的是分发给消费端的订单数!
  1.2 原理:使用单线程写 (Redis、Netty等等高性能技术框架的设计都是这个核心思想)

2.使用场景
      Disruptor的最常用的场景就是“生产者-消费者”场景,对场景的就是“一个生产者、多个消费者”的场景,并且要求顺序处理。
  举个例子,我们从MySQL的BigLog文件中顺序读取数据,然后写入到ElasticSearch(搜索引擎)中。
  在这种场景下,BigLog要求一个文件一个生产者,那个是一个生产者。而写入到ElasticSearch,则严格要求顺序,否则会出现问题,
  所以通常意义上的多消费者线程无法解决该问题,如果通过加锁,则性能大打折扣。

     一般性地来说,当你需要在两个独立的处理过程(两个线程)之间交换数据时,就可以使用 Disruptor 。
  当然使用队列(如BlockingQueue)也可以,只不过 Disruptor 做得更好。

3.Disruptor 的核心概念
   3.1 Ring Buffer
       如其名,环形的缓冲区。曾经 RingBuffer 是 Disruptor 中的最主要的对象,但从3.0版本开始,
       其职责被简化为仅仅负责对通过 Disruptor 进行交换的数据(事件)进行存储和更新。在一些更高级的应用场景中,
       Ring Buffer 可以由用户的自定义实现来完全替代。

   3.2 Sequence  Disruptor
       通过顺序递增的序号来编号管理通过其进行交换的数据(事件),对数据(事件)的处理过程总是沿着序号逐个递增处理。
       一个 Sequence 用于跟踪标识某个特定的事件处理者( RingBuffer/Consumer )的处理进度。虽然一个 AtomicLong 也可以用于标识进度,
       但定义 Sequence 来负责该问题还有另一个目的,那就是防止不同的 Sequence 之间的CPU缓存伪共享(Flase Sharing)问题。

   3.3 Sequencer 
       Sequencer 是 Disruptor 的真正核心。此接口有两个实现类 SingleProducerSequencer、MultiProducerSequencer ,
       它们定义在生产者和消费者之间快速、正确地传递数据的并发算法。

   3.4 Sequence Barrier
       用于保持对RingBuffer的 main published Sequence 和Consumer依赖的其它Consumer的 Sequence 的引用。
       Sequence Barrier 还定义了决定 Consumer 是否还有可处理的事件的逻辑。

   3.5 Wait Strategy
       定义 Consumer 如何进行等待下一个事件的策略。 (注:Disruptor 定义了多种不同的策略,针对不同的场景,提供了不一样的性能表现)

   3.6 Event(通过 Disruptor 进行交换的数据类型)
       在 Disruptor 的语义中,生产者和消费者之间进行交换的数据被称为事件(Event)。
       它不是一个被 Disruptor 定义的特定类型,而是由 Disruptor 的使用者定义并指定。

   3.7 EventProcessor
       EventProcessor 持有特定消费者(Consumer)的 Sequence,并提供用于调用事件处理实现的事件循环(Event Loop)。

   3.8 EventHandler
       Disruptor 定义的事件处理接口,由用户实现,用于处理事件,是 Consumer 的真正实现。

   3.9 Producer
       即生产者,只是泛指调用 Disruptor 发布事件的用户代码,Disruptor 没有定义特定接口或类型。  

4.它有什么特点呢
    4.1 顾名思义,它是一个环,准确说,是一个用数组实现的环形队列。
      4.2 不像传统队列,维护对头,队尾,它只有Sequencer,指向下一个可用的数据缓存区
      4.3 新产生的数据对原来数据进行写覆盖,不进行remove操作。
      4.4 队列大小一定是2的N次方   

5.跟JMQ的区别
    Disruptor :内存队列,使用场景一般在【系统内部】,提高在高并发的情况下系统的性能,一般作用于【线程间】的消息传递;
    MQ        :分布式消息队列,使用场景一般在【系统和系统】间的消息传递,吞吐量高,也适用于消息流数据处理的中间件


6.项目地址
  https://github.com/LMAX-Exchange/disruptor

7.Maven依赖(最新)
  <dependency>
    <groupId>com.lmax</groupId>
    <artifactId>disruptor</artifactId>
    <version>3.4.2</version>
  </dependency>

8.参考文档
  https://blog.csdn.net/li123128/article/details/81703618
  https://blog.csdn.net/qq_19558705/article/details/77247912
  https://www.cnblogs.com/haiq/p/4112689.html
  https://blog.csdn.net/li12412414/article/details/82317888

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值