disryptor和rabbitmq

news2025/5/20 19:53:45

disryptor和rabbitmq

Disruptor 是什么?

Disruptor 是一个由 LMAX Exchange 开发的高性能、低延迟的进程内(in-process)并发编程框架/库。它最初是为了解决金融交易系统中高吞吐量、低延迟消息传递的需求而设计的。

核心特点和设计理念:

  1. Ring Buffer(环形缓冲区):

    • Disruptor 的核心数据结构是一个预先分配的环形数组(Ring Buffer)。

    • 所有事件(消息)都存储在这个缓冲区中。

    • 生产者将数据放入 Ring Buffer,消费者从 Ring Buffer 中读取数据。

    • 预分配避免了动态内存分配和垃圾回收(GC)的开销。

  2. Sequence Numbers(序列号):

    • 每个事件在 Ring Buffer 中都有一个唯一的、单调递增的序列号。

    • 生产者和消费者都通过追踪这些序列号来协调工作,而不是使用传统的锁。

    • 这大大减少了锁竞争,提高了并发性能。

  3. 无锁设计 (Lock-Free / Wait-Free):

    • Disruptor 尽量避免使用锁。它通过 CAS (Compare-And-Swap) 操作和内存屏障(Memory Barriers)来保证数据的一致性和可见性。

    • 某些等待策略可能是“自旋等待”(busy-spin)或“让出CPU”(yielding),以适应不同的延迟和CPU使用需求。

  4. 机械共鸣 (Mechanical Sympathy):

    • 设计上充分考虑了现代 CPU 硬件的特性,如缓存行(Cache Lines)、内存屏障、分支预测等。

    • 例如,通过填充(padding)来避免伪共享(False Sharing),从而提高缓存效率。

  5. 事件处理器 (Event Processors) / 消费者 (Consumers):

    • 消费者被称为 Event Processors。

    • 可以有多个消费者,它们可以独立处理事件,也可以形成依赖关系链(DAG -有向无环图)。

    • 例如,一个消费者处理完事件后,另一个消费者才能开始处理同一个事件。

Disruptor 的主要应用场景:

  • 高频交易系统

  • 实时数据分析

  • 游戏服务器的事件处理

  • 高性能日志系统

  • 任何需要在单个JVM进程内实现极低延迟、高吞吐量消息传递的场景。

RabbitMQ 是什么?

RabbitMQ 是一个开源的消息代理(Message Broker),也称为消息队列(Message Queue)中间件。它实现了 AMQP (Advanced Message Queuing Protocol) 协议,并支持其他协议如 MQTT, STOMP 等。

核心特点和设计理念:

  1. 消息代理 (Broker):

    • RabbitMQ 作为一个独立的服务器(或集群)运行,应用程序(生产者和消费者)通过网络连接到它。

    • 它负责接收、存储和转发消息。

  2. 生产者 (Producers) 和消费者 (Consumers):

    • 生产者发送消息到 RabbitMQ。

    • 消费者从 RabbitMQ 订阅并接收消息。

    • 生产者和消费者是解耦的,它们不需要知道对方的存在,也不需要同时在线。

  3. 队列 (Queues):

    • 消息存储在队列中,直到被消费者取走。

    • 队列可以持久化,确保即使 RabbitMQ 服务器重启,消息也不会丢失。

  4. 交换机 (Exchanges):

    • 生产者实际上是将消息发送到交换机。

    • 交换机根据路由规则(Routing Keys, Bindings)将消息分发到一个或多个队列。

    • 常见的交换机类型有:Direct, Topic, Fanout, Headers。

  5. 持久化 (Persistence):

    • 消息和队列都可以被标记为持久化,以确保在服务器故障时数据不丢失。

  6. 可靠性与可用性:

    • 支持消息确认(Acknowledgements)机制,确保消息被成功处理。

    • 支持集群(Clustering)和镜像队列(Mirrored Queues)以实现高可用性和负载均衡。

  7. 跨语言、跨平台:

    • 由于基于标准协议,RabbitMQ 可以被多种编程语言(Java, Python, Ruby, .NET, Node.js 等)和不同平台的应用使用。

RabbitMQ 的主要应用场景:

  • 微服务架构: 服务间的异步通信和解耦。

  • 任务队列: 将耗时的任务(如发送邮件、生成报表、图像处理)异步化处理,提高系统响应速度。

  • 事件驱动架构: 系统组件通过发布和订阅事件来进行交互。

  • 数据复制与同步: 在不同系统间同步数据。

  • 流量削峰: 在高并发场景下,将请求放入队列,后端服务按能力处理,防止系统过载。

Disruptor vs. RabbitMQ:主要区别

特性DisruptorRabbitMQ
核心目的进程内高性能并发、低延迟消息传递跨进程/分布式应用间的消息传递和解耦
通信方式内存共享 (Ring Buffer)网络通信 (TCP/IP, AMQP等协议)
部署作为集成在应用程序内部 (单个JVM)作为独立的服务部署 (可集群)
性能/延迟极低 (纳秒级),因为是内存操作,无网络开销相对较高 (毫秒级或更高),有网络开销和序列化开销
持久化默认不提供 (内存数据结构),需自行实现内建支持消息和队列的持久化到磁盘
可靠性依赖于JVM进程的存亡。如果JVM崩溃,数据丢失。通过消息确认、持久化、集群等机制提供高可靠性
跨语言/平台主要是 Java 库 (有其他语言的移植版但不如Java成熟)协议标准,天然支持多语言、跨平台
数据结构Ring Buffer (环形数组)Queues (队列)
使用场景单体应用内部模块间高速通信,日志,金融交易等微服务通信,异步任务处理,系统解耦,事件驱动等
复杂性使用模式相对复杂,需要理解其底层机制才能发挥最佳性能概念较多 (Exchange, Queue, Binding),但API使用相对直接
“事务”支持自身不直接提供类似数据库事务的概念支持 AMQP 事务 (但性能影响大,不常用),或通过发布者确认和消费者确认实现可靠性

总结:

  • Disruptor 是一个“轮子”,用于在单个应用程序内部构建超高性能的并发组件。你可以把它看作是 Java BlockingQueue 的一个极致性能替代品。

  • RabbitMQ 是一个“邮局系统”,用于在不同的应用程序或服务之间可靠地传递消息。它是一个完整的、独立的消息中间件。

它们解决的问题域完全不同:

  • 如果你需要在同一个JVM进程内的不同线程间以极低的延迟传递大量数据,Disruptor 是一个强大的选择。

  • 如果你需要解耦不同的服务,实现异步通信,保证消息的可靠传递(即使某个服务暂时下线),或者在多种语言编写的应用间通信,那么 RabbitMQ (或其他消息队列如 Kafka, ActiveMQ) 是合适的选择。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2380209.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

get请求使用数组进行传参

get请求使用数组进行传参,无需添加中括号 mvc接口要添加参数名,使用array承接。不能用list, 否则会报错 这里是用apifox模拟前端调用。 前端调用代码 // 根据项目ID和角色ID查询相关审批人 export function findRelativeApproverByProjectIdAndRoleId(roleIds, p…

【MySQL成神之路】MySQL常用语法总结

目录 MySQL 语法总结 数据库操作 表操作 数据操作 查询语句 索引操作 约束 事务控制 视图操作 存储过程和函数 触发器 用户和权限管理 数据库操作 创建数据库: CREATE DATABASE database_name; 选择数据库: USE database_name; 删除数…

Linux动静态库制作与原理

什么是库 库是写好的现有的,成熟的,可以复用的代码。现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常。 本质上来说库是一种可执行代码的二进制形式,可以被操作系统…

ffmpeg 把一个视频复制3次

1. 起因, 目的: 前面我写过,使用 python 把一个视频复制3次但是速度太慢了,我想试试看能否改进。而且我想换一种新的视频处理思路,并试试看速度如何。 2. 先看效果 效果就是能行,而且速度也快。 3. 过程: 代码 1…

GPT/Claude3国内免费镜像站更新 亲测可用

无限次使用:无限制的提问次数,不设上限,随心所欲。 无需魔法、稳定流畅:操作简便,无需复杂设置,即可享受稳定流畅的服务。 手机和电脑均能用:轻松适配手机和电脑,使用体验更佳。 …

Python:操作Excel按行写入

Python按行写入Excel数据,5种实用方法大揭秘! 在日常的数据处理和分析工作中,我们经常需要将数据写入到Excel文件中。Python作为一门强大的编程语言,提供了多种库和方法来实现将数据按行写入Excel文件的功能。本文将详细介绍5种常见的Python按行写入Excel数据的方法,并附上…

Redis进阶知识

Redis 1.事务2. 主从复制2.1 如何启动多个Redis服务器2.2 监控主从节点的状态2.3 断开主从复制关系2.4 额外注意2.5拓扑结构2.6 复制过程2.6.1 数据同步 3.哨兵选举原理注意事项 4.集群4.1 数据分片算法4.2 故障检测 5. 缓存5.1 缓存问题 6. 分布式锁 1.事务 Redis的事务只能保…

12.vue整合springboot首页显示数据库表-实现按钮:【添加修改删除查询】

vue整合springboot首页显示数据库表:【添加修改删除查询】 提示:帮帮志会陆续更新非常多的IT技术知识,希望分享的内容对您有用。本章分享的是node.js和vue的使用。前后每一小节的内容是存在的有:学习and理解的关联性。【帮帮志系…

bisheng系列(一)- 本地部署(Docker)

目录 一、导读 二、说明 1、镜像说明 2、本节内容 三、docker部署 1、克隆代码 2、运行镜像 3、可能的错误信息 四、页面测试 1、注册用户 2、登陆成功 3、添加模型 一、导读 环境:Ubuntu 24.04、Windows 11、WSL 2、Python 3.10 、bisheng 1.1.1 背景…

如何用Python批量解压ZIP文件?快速解决方案

如何用Python批量解压ZIP文件?快速解决方案 文章目录 **如何用Python批量解压ZIP文件?快速解决方案**代码结果详细解释 话不多说,先上干货!!! 代码 import os import zipfiledef unzip_file(dir_path: str…

DriveGenVLM:基于视觉-语言模型的自动驾驶真实世界视频生成

《DriveGenVLM: Real-world Video Generation for Vision Language Model based Autonomous Driving》2024年8月发表,来自哥伦比亚大学的论文。 自动驾驶技术的进步需要越来越复杂的方法来理解和预测现实世界的场景。视觉语言模型(VLM)正在成…

企业标准信息公共服务平台已开放标准通编辑器访问入口

标准通 数字化标准编辑器 专业、高效、便捷 企业标准信息公共服务平台 近日,企业标准信息公共服务平台已开放标准通编辑器访问入口,可进入官网指定版块使用! 核心功能亮点 解决企业痛点 传统标准编制,需反复核对格式、逐条…

进阶-数据结构部分:1、数据结构入门

飞书文档https://x509p6c8to.feishu.cn/wiki/HRLkwznHiiOgZqkqhLrcZNqVnLd 一、存储结构 顺序存储 链式存储 二、常用数据结构 2.1、栈 先进后出 场景: 后退/前进功能:网页浏览器中的后退和前进按钮可以使用栈来实现。在浏览网页时,每次…

React 19中useContext不需要Provider了。

文章目录 前言一、React 19中useContext移除了Provider&#xff1f;二、使用步骤总结 前言 在 React 19 中&#xff0c;useContext 的使用方式有所更新。开发者现在可以直接使用 作为提供者&#xff0c;而不再需要使用 <Context.Provider>。这一变化简化了代码结构&…

Json schema校验json字符串(networknt/json-schema-validator库)

学习链接 json-schema官网 - 英文 jsonschemavalidator 可在线校验网站 networknt的json-schema-validator github地址 networknt的json-schema-validator 个人gitee地址 - 里面有md文档说明和代码示例 JSON Schema 入门指南&#xff1a;如何定义和验证 JSON 数据结构 JS…

交易所开发:构建功能完备的金融基础设施全流程指南

交易所开发&#xff1a;构建功能完备的金融基础设施全流程指南 ——从技术架构到合规安全的系统性解决方案 一、开发流程&#xff1a;从需求分析到运维优化 开发一款功能完备的交易所需要遵循全生命周期管理理念&#xff0c;涵盖市场定位、技术实现、安全防护和持续迭代四大阶…

Axure疑难杂症:统计分析页面引入Echarts示例动态效果

亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢! Axure产品经理精品视频课已登录CSDN可点击学习https://edu.csdn.net/course/detail/40420 课程主题:统计分析页面引入Echarts示例动态效果 主要内容:echart示例引入、大小调整、数据导入 应用场景:统计分析页面…

展锐Android14及更新版本split_build编译方法

更改split_build.py文件内容后按照下面方法编译&#xff1a; zip -r sys/vendor/sprd/release/split_build.zip sys/vendor/sprd/release/split_build/ rm -r sys/vendor/sprd/release/split_build/ cp -r vnd/vendor/sprd/release/split_build/ sys/vendor/sprd/release/cd s…

青少年ctf平台应急响应-应急响应2

题目&#xff1a; 当前服务器被创建了一个新的用户&#xff0c;请提交新用户的用户名&#xff0c;得到的结果 ssh rootchallenge.qsnctf.com -p 30327 这个命令用于通过 SSH 协议连接到指定的远程服务器。具体解释如下&#xff1a; ssh&#xff1a;这是在 Unix-like 系统中…

k8s监控方案实践补充(二):使用kube-state-metrics获取资源状态指标

k8s监控方案实践补充&#xff08;二&#xff09;&#xff1a;使用kube-state-metrics获取资源状态指标 文章目录 k8s监控方案实践补充&#xff08;二&#xff09;&#xff1a;使用kube-state-metrics获取资源状态指标一、Metrics Server简介二、kube-state-metrics实战部署1. 创…