图解Disruptor框架(一):初识Ringbuffer

图解Disruptor框架(一):初识Ringbuffer

概述

1、 什么是Disruptor?为什么是Disruptor?

Disruptor是一个性能十分强悍的无锁高并发框架。在JUC并发包中,号称是性能最好的ArrayBlockingQueue(简称:ABQ),在Disruptor的面前,也只能低下骄傲的头颅了。现在我们来看一下官方给出的测试数据。

吞吐量

上图是官方给出的在不同的模式下,使用ABQ以及Disruptor的吞吐量对比图。可见,在相同的模式之下,ABQ的性能跟Disruptor的性能不是一个数量级的。

接下来,看看耗时怎么样:

耗时对比

毫无疑问,ABQ又败下阵来。稍微分析一下原因就可以知道为什么会是这个样子的,我们在ABQ的源码中可以看到:

  1. public void put(E e) throws InterruptedException {


  2. checkNotNull(e); 

  3. final ReentrantLock lock = this.lock; 

  4. // 在这里,获取不到锁的线程只有阻塞了。 

  5. lock.lockInterruptibly(); 

  6. try { 

  7. while (count == items.length) 

  8. notFull.await(); 

  9. enqueue(e); 

  10. } finally { 

  11. lock.unlock(); 






  12. public E take() throws InterruptedException { 

  13. final ReentrantLock lock = this.lock; 

  14. // 在这里,获取不到锁的线程只有阻塞了。 

  15. lock.lockInterruptibly(); 

  16. try { 

  17. while (count == 0) 

  18. notEmpty.await(); 

  19. return dequeue(); 

  20. } finally { 

  21. lock.unlock(); 





ABQ内部,不论是put()还是take()都使用了锁对资源进行同步,获取不到锁的线程就只能阻塞了。但是相比于ABQ,Disruptor号称是不使用锁进行资源同步的。孰优孰劣,在此Disruptor先胜一局。这里先留个悬念,既然Disruptor不使用锁,那么他是怎么做到的?

在对Disruptor进行深入的了解之前,我们先来看下Disruptor的核心数据结构--RingBuffer

RingBuffer

RingBuffer就是下面这个东西:

RingBuffer

先来简单的介绍一下Ringbuffer这个名字,这个名字有两个特点:

  • Ring:环形的。
  • Buffer:缓存。

这一节先介绍第一个特点,环形的。(关于缓存,简单的说,Disruptor使用了一个内存预加载的机制,在构造Ringbuffer的时候已经初始化好了数据。每次存数据,其实是对数据的更新。)

RingBuffer本质上是一个数组,因此对数据的索引十分的方便。

获取第四个元素

随着数据的增多,序号的增大,这个环可能会变成以下的这个样子:

取第12个位置的元素

想取第十二个位置的元素也非常的简单,初中数学告诉我们,只需要在:

12 % 10 = 2 这个位置,就可以取到这个元素。

以上就是Disruptor最核心的数据结构了。这个框架中的其他一切组件:生产者、消费者、序号生成器等等之类的组件,都是为了服务这个RingBuffer而诞生的。

总结

今天这篇就是简单的介绍一下disruptor这个框架。大家只需要先有个印象,知道有这么一个东西就行了。后续我会慢慢的将这些东西补充完全。

参考资料

  1. 官方的设计说明以及测试 http://101.96.10.64/lmax-exchange.github.io/disruptor/files/Disruptor-1.0.pdf
  2. Ringbuffer设计的简要介绍 http://mechanitis.blogspot.com/2011/06/dissecting-disruptor-whats-so-special.html

原文地址:https://www.cnblogs.com/junhong1995/p/10134413.html

时间: 2024-10-13 17:11:27

图解Disruptor框架(一):初识Ringbuffer的相关文章

分布式事务框架-seata初识

摘自:https://www.cnblogs.com/iceggboom/p/12144570.html 分布式事务框架-seata初识 一.事务与分布式事务 事务,在数据库中指的是操作数据库的最小单位,往大了看,事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消. 那为什么会有分布式事务呢?单机事务是通过将操作限制在一个会话内通过数据库本身的锁以及日志来实现ACID.因为引入了分布式架构,所以事务的参与者.支持事务的服务器.资源服务器以及事务管理器

disruptor框架

简介: Martin Fowler在自己网站上写了一篇LMAX架构的文章,在文章中他介绍了LMAX是一种新型零售金融交易平台,它能够以很低的延迟产生大量交易.这个系统是建立在JVM平台上,其核心是一个业务逻辑处理器,它能够在一个线程里每秒处理6百万订单.业务逻辑处理器完全是运行在内存中,使用事件源驱动方式.业务逻辑处理器的核心是Disruptor. Disruptor它是一个开源的并发框架,并获得2011 Duke’s 程序框架创新奖,能够在无锁的情况下实现网络的Queue并发操作. Disru

Disruptor框架EventProcessor和Workpool的使用

场景使用: 在HelloWorld的实例中,我们创建Disruptor实例,然后调用getRingBuffer方法去获取RingBuffer,其实在很多时候,我们可以直接使用RingBuffer,以及其他的API操作,看一下示例: 使用EventProcessor消息处理器: 使用WorkerPool消息处理器: 先看一下EventProcessor消息处理器: 这是一个event对象: 这是一个消费者, 最后是一个main方法,然后EventFactory也在这个方法里面实现,这里就是没有创建

web框架--tornado框架之初识

一.初识tornado 对于Web框架来说,一般分为两类,其中一类则是包含上述 4部分 内容的框架,另外一类就是只包含 第3部分 功能的框架.tornado就是一中属于前者的框架.tornado 是一个基于 Python 开发的web框架,较其他 Web 框架的区别是:采用了非阻塞的方式和对epoll的应用.这意味着对于实时 Web 服务来说,Tornado 是一个理想的 Web 框架. 经典的hello world 案例:tornado内部已经帮我们实现socket. 1 #!/usr/bin

python爬虫框架scrapy初识(一)

Scrapy介绍 Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中.所谓网络爬虫,就是一个在网上到处或定向抓取数据的程序,当然,这种说法不够专业,更专业的描述就是,抓取特定网站网页的HTML数据.抓取网页的一般方法是,定义一个入口页面,然后一般一个页面会有其他页面的URL,于是从当前页面获取到这些URL加入到爬虫的抓取队列中,然后进入到新页面后再递归的进行上述的操作,其实说来就跟深度遍历或广度遍历一样.Scrap

thinkPHP框架之初识篇

安装框架 XAMPP:XML.Apache.MySQL.PHP.PERL LAMP : Linux.Apache.MySQL.PHP LNMP :Linux.Ningx.MySQL.PHP J2EE : 贵 linux命令 1.关闭系统自带apache sudo /usr/sbin/apachectl stop 2.查看Apache系统进程 ps -ef | grep httpd 3.查看MySQL进程 ps -ef | grep mysql 4.查看PHP版本 php -version 5.显

CQRS框架(nodejs的DDD开发落地框架)初识感想

CQRS是啥?DDD又是啥? 这两个概念其实没什么神秘的,当然此文章中的这两个概念以曾老师的课程为准(关于CQRS和DDD的标准概念,google上已经很多了,不再赘述.) DDD(Domain Driven Design),领域驱动设计开发. DDD和OOP有什么同吗?其实就我个人经验来说,没有任何不同(当然你可以反驳我),DDD就是OOP.这里以曾老师课上的概念为准,domain就是世界,包含了当前所有actor的一个域,这个域是一个上帝视角,可以监听每一个域中发生的事件,并且记录. CQR

Django框架之初识

前言 1. 什么是Web应用程序? 通过Web访问的应用程序,用户只需要有浏览器即可,不需要再安装其他软件 应用程序有两种模式: C/S:C/S是客户端/服务器端程序,也就是说这类程序一般独立运行 B/S:浏览器端/服务器端应用程序,一般借助IE等浏览器来运行:本质上其实也是c/s架构 Web应用程序首先是“应用程序”,又有自己独特的地方:基于Web的,典型的浏览器/服务器架构的产物:即B/S模式. 2. HTTP协议 也称为超文本传输协议:规定了客户端与服务端消息传输的格式 1)HTTP协议的

爬虫(十四):Scrapy框架(一) 初识Scrapy、第一个案例

1. Scrapy框架 Scrapy功能非常强大,爬取效率高,相关扩展组件多,可配置和可扩展程度非常高,它几乎可以应对所有反爬网站,是目前Python中使用最广泛的爬虫框架. 1.1 Scrapy介绍 1.1.1 架构介绍 Scrapy是一个基于Twisted的异步处理框架,是纯Python实现的爬虫框架,其架构清晰,模块之间的耦合程度低,可扩展性极强,可以灵活完成各种需求.我们只需要定制开发几个模块就可以轻松实现一个爬虫. 它可以分为如下的几个部分: Engine:引擎,处理整个系统的数据流处