构建高性能内存队列:Disruptor yyds~

网站建设4年前发布
45 0 0

Java中有哪些队列,我们清楚使用锁的性能比较低,尽量使用无锁设计。接下来就我们来认识下Disruptor。,github地址:https://github.com/LMAX-Exchange/disruptor/wiki/Performance-Results,先简单介绍下:,2023030615412089e227649ca7315aa42261ef67d1b58706655a800,20230306154120318a879050df0d18f0f9275e26a85f3720a11b842,基于上面简单例子来看确实很简单,Disruptor帮我们封装好了生产消费模型的实现,接下来我们来看下他是基于哪些核心组件来支撑起一个高性能无锁队列呢?,RingBuffer: 环形数组,底层使用数组entries,在初始化时填充数组,避免不断新建对象带来的开销。后续只会对entries做更新操作,20230306154121159de5838dbdc8cf2a1671de6f32d50ec0aaea444,20230306154122584770724ae0568a4dd604b1e41da1180d0ad6374,2023030615412288db773158e3232941b349d28126391fdd7dec480,Sequencer: 核心管家,Sequence: 本身就是一个序号器用来标识处理进度,也可以当做是一个atomicInteger; 还有另外一个特点,为了解决伪共享问题而引入的:缓存行填充。这个在后面介绍。,workProcessor: 处理Event的循环,在循环中获取Disruptor的事件,然后把事件分配给各个handler,EventHandler: 负责业务逻辑的handler,自己实现。,WaitStrategy: 消费者 如何等待 事件的策略,定义了如下策略,1、多生产者如何保证消息生产不会相互覆盖。【如何达到互斥效果】,2023030615412338ffd0266696b15be256549b6cfe43b47fc708405,每个线程获取不同的一段数组空间,然后通过CAS判断这段空间是否已经分配出去。,接下来我们看下多生产类MultiProducerSequencer中next方法【获取生产序号】,2、生产者向序号器申请写的序号,如序号正在被消费,Sequencer是如何知道哪些序号是可以被写入的呢?【未消费则被覆盖如何处理】,从gatingSequences中取得最小的序号,生产者最多能写到这个序号的后一位。通俗来讲就是申请的序号不能大于最小消费者序号一圈【申请到最大序列号-buffersize 要小于/等于 最小消费的序列号】的时候, 才能申请到当前写的序号,202303061541244622dfd4647c53acb781443e9b23f15fa7b598212,3、在多生产者情况下,生产者是申请到一段可写入的序号,然后再写入这些序号中,那么消费者是如何感知哪些序号是可以被消费的呢?【借问提1图说明】,这个前提是多生产者情况下,第一点我们说过每个线程获取不同的一段数组空间,那么现在单单通过序号已经不够用了,MultiProducerSequencer​使用了int 数组 【availableBuffer​】来标识当前序号是否可用。当生产者成功生产事件后会将availableBuffer中当前序列号置为1标识可以读取。,如此消费者可以读取的的最大序号就是我们availableBuffer中第一个不可用序号-1。,20230306154125b3e387a9942a619dd0c606e4938f100fb3ce9e968,初始化availableBuffer流程,消费者消费流程,为了提高CPU的速度,Cpu有高速缓存Cache,该缓存最小单位为缓存行CacheLine,他是从主内存复制的Cache的最小单位,通常是64字节。一个Java的long类型是8字节,因此在一个缓存行中可以存8个long类型的变量。如果你访问一个long数组,当数组中的一个值被加载到缓存中,它会额外加载另外7个。因此你能非常快地遍历这个数组。,伪共享问题是指,当多个线程共享某份数据时,线程1可能拉到线程2的数据在其cache line中,此时线程1修改数据,线程2取其数据时就要重新从内存中拉取,两个线程互相影响,导致数据虽然在cache line中,每次却要去内存中拉取。,20230306154126e1f99a1217b32b875b88443f0fdef45d077214543,在value前后统一都加入7个Long类型进行填充,线程拉取时,不论如何都会占满整个缓存,2023030615412749c7ff330a28e441d07070ae9487e2423947da424

© 版权声明

相关文章