剖析高性能队列Disruptor背后的数据结构和算法

------ 本文是学习算法的笔记,《数据结构与算法之美》,极客时间的课程 ------

Disruptor 是一种内存消息队列。它经Java 中另外一个非常常用的内存消息队列 ArrayBlockQueue(ABS)的性能,要高出一个数量级,可以算得上是最快的内存消息队列了。今天来看下,Disruptor是如何做到如此高性能的?其底层依赖了哪些数据结构和算法?

基于循环队列的“生产者-消费者模型”

什么是内存消息队列?如果我说“生产者-消费者模型”,估计在部分人都知道。在这个模型中,“生产者”生产数据,并且将数据放到一个足以存储容器中。之后,“消费者”从中心存储容器中,取出数据消费。

这个模型非常简单、好理解,那你有没有思考过,这里面存储数据的中心存储容器,是用什么数据结构来实现的呢?

实际上,实现中心存储容器最常用的一种数据结构,就是队列。队列支持数据先进先出。下是这个特性,使得数据被消费的顺序性可以得到保证,也就是说,早被生产的数据就会早被消费。

队列的实现思路。一种是基于链表实现的链式队列,另一种是基于数组实现的顺序队列。不同的需求背景下,我们会选择不同的实现方式。

如果我们要实现一个无界队列,也就是说,队列的大小事先不确定,理论上可以支持无限大。这种情况下,我们适合选用链表来实现队列。因为链表支持快速地动态扩容。如果我们要实现一个德莱文队列,也就是说,队列的大小事先确定,当队列中数据满了之后,生产者就需要等待。直到消费者消费了数据,队列有空闲位置的时候,生产者才能癣数据放入。

实际上,相较于无界队列,有界队列的应用场景更加广泛。毕竟,我们的机器内存是有限的。而无界队列占用的内存数量是不可控的。对于实际的软件开发来说,这种不可控的因素,就会有潜在的风险。在某些极端情况下,无界队列就有能因为内存持续增长,而导致OOM( Out of Memory)错误。

还有一种循环队列,我们讲过,非循环队列在添加、删除数据的工程中,会涉及的搬移操作,导致性能变差。而循环队列可以解决这个数据搬移问题,所以,性能更加好。所以,大部分用到顺序队列的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值