高性能队列技术Disruptor及其应用

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
高性能队列技术Disruptor及其应用
目录
01 Disruptor: 高性能队列技术 02 Java中的加锁与原子变量 03 伪共享 04 Disruptor的设计方案
1
Disruptor: 高性能队列技术
Disruptor简介
1. Disruptor是由英国外汇交易公司LMAX开发的一款高性能队列。 2. Disruptor的主要目的是解决内存队列的延迟问题。 3. 基于Disruptor开发的系统单线程能支撑每秒600万订单。 4. Disruptor曾在2011年获得Oracle官方的Duke大奖。
通过比较Disruptor和ArrayBlockingQueue的吞吐量,展示了在并发竞争激烈程度不同下的性能差异 。
延迟测试结果
按照Pipeline: 1P – 3C的连接模式测试延迟,生产者两次写入之间的延迟为1ms,展示了不同环境 下的延迟情况。
感谢
原子变量与CAS实现线程安全
1. 原子变量:确保数据在多线程环境下的唯一性和完整性。 2. CAS(Compare-And-Swap):一种基于硬件原子操作的同步原语。 3. 线程安全:提高程序在多线程并发访问时的正确性和效率。
原子变量的工作原理
1. 原子变量:基本数据单位,不可再分。 2. 工作原理:基于量子力学,遵循海森堡不确定性原理。 3. 波动性:原子变量的状态呈波状分布。 4. 测量问题:测量原子变量值具有一定的随机性,影响量子态的确定。
Disruptor架构
1. Disruptor采用了一种独特的内存队列技术来解决延迟问题。 2. Disruptor的架构设计简单而高效,基于C++编写。 3. Disruptor将队列操作和处理器调度分离,实现了高内聚性和可扩展性。 4. Disruptor支持多种队列类型,可以灵活应对不同需求。 5. Disruptor使用了事件驱动的方式来实现多线程协作。
4
Disruptor的设计方案
环形数组结构
1. 采用数组而非链表。 2. 对处理器的缓存机制更加友好。 3. 提高定位速度。 4. 下标采取递增的形式。
元素位置定位
1. 数组长度2^n。 2. 通过位运算,加快定位速度。 3. 下标采取递增的形式。 4. 不用担心index溢出的问题。
无锁设计
相应措施来防止和检测。
图4 ArrayBlockingQueue伪共享示意图
伪共享的概念及影响
共享机制与未使用共享机制
使用共享机制与未使用共享机制的速度对比
结果
1. 生产者线程 putting 元素到 ArrayBlockingQueue 时,putIndex 会修改,导 致消费者线程的缓存行无效,需要从主存中重新读取。
2
Java中的加锁与原子变量
加锁的影响
1. 加锁可确保数据一致性。 2. 加锁可能导致性能下降。 3. 加锁需要权衡使用。
CAS与锁的比较
1. CAS (Compare and Swap)操作是一种原子性的数据读取和更新方式。 2. 通过CAS操作,可以减少锁的使用,提高系统性能。 3. CAS操作分为三种类型:CASNoOp、CASYes和CASNoYes。
Disruptor特性限制
1. Disruptor的特性受限于3.3.4版本。 2. 本文主要探讨了Disruptor在前端应用中的实际使用情况。
Disruptor实际应用
1. 在美团技术团队中,Disruptor在很多项目中都有应用。 2. 项目的架构 even 借鉴了它的设计机制。 3. Disruptor能够为系统带来高性能和低延迟。 4. 在金融领域,Disruptor能够处理每秒数百万级的请求。 5. 它在处理高并发请求方面表现出色,能够有效地提高系统的性能。
5. 链表队列适合高并发场景。
无界队列:LinkedTransferQueue
1. 基于链表的无界队列LinkedTransferQueue,同样采用CAS方式实现线程安 全,无需加锁。
2. 适用于高并发场景。 3. 相比有界队列,无界队列能够更好地处理大量数据。 4. 无界队列不会因为队列长度超过最大容量而抛出异常。 5. 无界队列适用于需要频繁进行数据传输的场景。
1. 通过原子变量CAS保证操作的线程安全。 2. 每个生产者或者消费者线程,会先申请可以操作的元素在数组中的位置。 3. 申请到之后,直接在该位置写入或者读取数据。
一个生产者
1. 生产者单线程写数据。 2. 申请写入m个元素。 3. 判断是否会覆盖未读的元素。
读数据
1. 数据收集:获取并整理所需数据 2. 数据清洗:去除异常值和缺失值,保证数据质量 3. 数据分析:从数据中提取有用信息,进行统计分析 4. 数据可视化:将分析结果以图表形式展示,便于理解
写数据
1. 数据收集:明确目标、选择合适来源、制定收集计划。 2. 数据分析:整理收集到的数据、识别关键信息、进行统计分析。 3. 数据呈现:选择合适的图表和可视化工具、设计吸引人的幻灯片布局、展示
研究成果。
吞吐量测试数据
展示了不同环境下吞吐量测试的数据,包括CPU、JVM和OS等信息。
并发竞争激烈程度的比较
缓存行
1. 缓存行为:降低系统响应时间。 2. 提高性能:通过存储频繁访问的数据。 3. 空间优化:减少磁盘空间占用。 4. 负载均衡:分散请求在多个缓存服务器。
什么是伪共享
1. 定义:伪共享是指在多用户环境中,一个用户对共享数据所做的修改,可能 会被其他用户看到。
2. 影响:伪共享可能导致数据不一致和冲突,降低系统可靠性和数据安全性。
Disruptor应用场景
1. Disruptor被广泛应用于各种知名项目中,如Apache Storm、Camel和Log4j 2等。
2. 这些项目中,有些采用了Disruptor的设计机制来提高性能。 3. 在美团技术团队中,Disruptor也有不少应用。 4. Disruptor能够为系统带来高性能享
1. 共享经济:通过闲置物品的再利用,提高资源配置效率。 2. collaborative consumption: 共享经济的一个分支,强调多人共同使用同一商
品或服务。
计算机CPU与缓存示意图
1. 计算机CPU负责执行程序指令。 2. 缓存是CPU内部的高速存储器,用于暂存近期访问的数据和指令。
数组队列:ArrayBlockingQueue
ArrayBlockingQueue是基于数组实现的线程安全队列,通过加锁方式保证线程安全。但是,由于加 锁和伪共享,它在实际使用过程中会出现严重的性能问题。
链表队列:LinkedBlockingQueue和 ConcurrentLinkedQueue
1. 基于链表的线程安全队列分为LinkedBlockingQueue和 ConcurrentLinkedQueue。
2. 它们通过原子变量compare and swap(CAS)方式实现线程安全,无需加 锁。
3. 高并发情况下,ConcurrentLinkedQueue性能较好。
4. LinkedBlockingQueue在实际使用过程中,会因为加锁和伪共享等出现严重 的性能问题。
伪共享的影响
1. 伪共享定义:计算机中的一种现象,当多个进程同时访问同一资源时,产生 一种错误的资源共享情况。
2. 影响概述:导致系统性能下降,数据不一致和潜在的安全问题。 3. 资源竞争:在多用户环境下,伪共享会影响不同进程对资源的请求与分配。 4. 安全问题:由于伪共享可能隐藏恶意行为,如病毒、木马等,因此需要采取
2. 这种现象称为伪共享,会影响缓存性能。 3. 解决伪共享的方法是增大数组元素的间隔,使不同线程存取的元素位于不同
的缓存行上,以空间换时间。 4. 在某些条件下,使用共享机制可以提高速度,但在 Java 8 中,有
@Contended 注解可以更优雅地解决这个问题。
代码修改后的结果
1. 将代码中的 ValuePadding 替换为 ValueNoPadding。 2. 修改后的程序性能得到提升。 3. 伪共享问题得到了更好的解决。 4. 使用共享机制与未使用共享机制的速度对比。 5. @Contented 注解可以更优雅地解决这个问题。
相关文档
最新文档