MQ调研梳理
1.架构
|
主项 |
子项 |
rabbitMQ |
rocketMQ |
Kafka |
Hippo |
Tube |
|---|---|---|---|---|---|---|
|
高可用 |
1:镜像队列。 2:集群。master/slave机制。 |
HA 同步双写和异步复制均支持 |
(同mafka) |
1、中心节点:HA |
||
|
高吞吐 |
性能 跟cpu 密切相关,5000是4核,5000左右。具体见rabbitmq基准性能测试 |
异步刷盘 单机7万qps, 三台机器12万(网测) |
(同mafka) |
未提及 |
单个Tube集群可稳定承载5w以上的客户端(生产者/消费者)数量,单台broker并发写入量可达10w TPS,使用1k大小的消息测试(机器配置:12核2.1GHz CPU带超线程、64G内存,Raid 5级磁盘阵列)时,可跑满千兆网卡带宽;Tube在绝大多数场景下可以将消息的延迟限制在毫秒级。 |
|
|
多机房部署 |
公司内无,shovel等插件支持 |
待确认 |
无 |
支持多 DC 部署 |
无 |
|
|
多机房容灾 |
公司内无,shovel等插件支持无 |
无 |
mirror maker |
未提及 |
无 |
|
|
高可靠 |
事务性, 1:producer->broker,producer 回ack的时候会在刷到盘或者消费者消费到回ack。并且会持久化 2:broker->consumer, 有确认机制。也会持久化,但是消费完会删除数据。 |
异步复制可保证99%的消息不丢失,通过同步双写技术可以完全避免单点,同步双写会对性能有一定的影响, 适合对消息要求极高的场合。 |
(同mafka) |
1. 存储可靠性 a) WAL+持久化; b)数据存储多副本 c) 存储节点自动failover;(failover 的时候会不会存在数据落后的被选为 master,具体策略没提及) 2. 传输可靠性 a) ACK 机制 b) CRC 校验 (细节未提及) |
1、无事务性 2、使用了磁盘的Raid 10来保证数据的容错 3、两种情况丢消息:c pull后挂掉,机器挂掉 |
|
|
数据备份防止数据单点 |
master-slave 双写 |
服务器粒度master-slave |
Topic粒度,replica factor指定数据备份数目 |
2.特性
|
主项 |
rabbitMQ |
Kafka |
rocketMQ |
Hippo |
Tube |
|---|---|---|---|---|---|
|
1对多 |
Y |
Y |
Y |
Y |
Y |
|
消息timer (延迟消费) |
Y(队列粒度) |
N |
Y(时间梯度)、商业版本毫秒级 |
- |
|
|
event trigger? |
N |
N |
N |
- |
|
|
group message |
Y |
Y |
Y |
Y |
Y |
|
消息tag(filter) |
N |
N |
Y |
- |
|
|
消息回溯 |
N |
Y(offset) |
Y(时间粒度、offset待确认) |
Y |
|
|
事务性 |
Y |
N |
Y |
- |
N |
|
优先级 |
Y(具体的话,数字越大优先级越大,通过插件实现的) |
N |
Y(高中低) |
- |
|
|
染色 |
N |
N |
N |
- |
|
|
文件传输(很奇怪的需求) |
N |
N |
N |
- |
|
|
持久化 |
数据库(文件) |
文件 |
文件 |
文件 |
文件 |
|
扩容 |
Y |
Y (平滑迁移,高级) |
Y |
Y |
无需扩容 |
|
多副本容灾(同机房、多机房) |
N |
mirror-maker canal-kafka |
HALF (不支持机房容灾) 针对有状态节点的难题,我们提供了一套数据自动扩容和迁移的工具来满足用户的自动扩容缩容中所产生的数据迁移类的需求。 |
未提及 |
HALF (不支持机房容灾) 跨机房部署需要解决的两大问题就是容灾和延时。当前Tube还不具备跨机房容灾的能力,但是对于Producer/Consumer端的跨机房,目前已经有在生产环境部署使用并且运行稳定,但是因为网络时延的存在,在性能和吞吐上有一定的下降 |
|
负载均衡 |
客户端咱自己封装的。 |
Y,自动 |
生产端从NameServer获取指定Topic的路由信息, 采用RR算法,从返回的队列中挑选一个队列来进行发送。 (支持失败重试和发送消息超时设置) 消费端从NameServer获取Topic下的路由信息和所有消费端, 根据平均分配算法、配置、或者机房来选择具体的队列进行消费, 做到消费端的负载均衡。 |
Producer: 从 controller 获取所有的 broker 列表,round-robin。 保持与 controller 心跳, 在 broker 发生变化时,获得更新。 Consumer: 从 controller 获取所有的 consumer 列表, 按照固定算法分配,每个 consumer 独占一个 partition。consumer 独占 partition 设置了超时。 保持与 controller 的心跳, 在 consumer 组发生变化时,获得更新并调整。 |
中心节点 |
|
消费模型 |
推拉 |
拉 |
拉 |
拉 |
拉 |
|
doubt message(消息追踪) |
Y(firehost tracer) |
N |
Y, 可以查询指定消息状态 |
- |
|
|
消息积累/消息积压 |
积压敏感,积压过多会触发集群流控,导致该集群生产消费受限制。 |
无上限 |
RocketMQ单机可以支持亿级的消息堆积能力 |
Y |
Y |
|
消息回溯 |
N |
offset回溯 |
Y,时间回溯,毫秒级 |
Y |
|
|
broker消息过滤 |
N |
|
|||
|
消息轨迹 |
Y,通过插件(firehose)查询 |
N |
商业版ons支持 |
||
|
单机支持的TOPIC数(待确认) |
RocketMQ单机支持最高5万个队列,Load不会发生明显变化 |
3.运维成本(部署、监控等)
|
主项 |
子项 |
rabbitMQ |
Kafka |
rocketMQ |
|---|---|---|---|---|
|
工具栈 |
工具完善,运维方面 |
kafka manager(by yahoo) |
脚本工具 |
|
|
扩展项目 |
||||
相关调研资料:
- 阿里云 ONS(Open Notification Service): 【视频】阿里分布式消息系统(ons)原理与实践 阿里分布式消息系统ONS原理与实践.pdf
MQ调研梳理的更多相关文章
- 手写MQ框架(四)-使用netty改造梳理
一.背景 书接上文手写MQ框架(三)-客户端实现,前面通过web的形式实现了mq的服务端和客户端,现在计划使用netty来改造一下.前段时间学习了一下netty的使用(https://www.w3cs ...
- 关于RPC与MQ异同的理解
最近看了一些资料,回顾过去项目的经验,梳理自己对两者异同的理解: 相同: 1.都利于大型系统的解耦: 2.都提供子系统之间的交互,特别是异构子系统(如java\node等不同开发语言): 不同: 1. ...
- quartz集群调度机制调研及源码分析---转载
quartz2.2.1集群调度机制调研及源码分析引言quartz集群架构调度器实例化调度过程触发器的获取触发trigger:Job执行过程:总结:附: 引言 quratz是目前最为成熟,使用最广泛的j ...
- ERP调研之 对话
开卷语: 2009年8月6号,A公司ERP项目顺利启动,按照项目进度的安排,项目组成员立即投入到紧张而又忙碌的的业务调研之中.这次为期3周的业务调研面向企业所有业务部门,包括产品部门.采购部门.计划部 ...
- 定时组件quartz系列<三>quartz调度机制调研及源码分析
quartz2.2.1集群调度机制调研及源码分析引言quartz集群架构调度器实例化调度过程触发器的获取触发trigger:Job执行过程:总结:附: 引言 quratz是目前最为成熟,使用最广泛的j ...
- (1)quartz集群调度机制调研及源码分析---转载
quartz2.2.1集群调度机制调研及源码分析 原文地址:http://demo.netfoucs.com/gklifg/article/details/27090179 引言quartz集群架构调 ...
- 为什么会需要消息队列(MQ)?
为什么会需要消息队列(MQ)? #################################################################################### ...
- 消息队列一:为什么需要消息队列(MQ)?
为什么会需要消息队列(MQ)? #################################################################################### ...
- 企业业务数据处理用“work”还是“MQ”
近期公司在做架构梳理已经项目架构方向,不知不觉就引起了使用“work”跑数据还是用“MQ”进行跑数据的争论! 对于争论这件事在各行各业都有,其实我觉得针对“争论”这个词的根源在于一件事情有很多解决方案 ...
随机推荐
- 【转载并整理】mysql 创建用户,数据库
http://www.jb51.net/article/31850.htm https://www.cnblogs.com/SQL888/p/5748824.html http://www.cnblo ...
- python sort和sorted函数
sort 与 sorted 区别: sort 是应用在 list 上的方法,sorted 可以对所有可迭代的对象进行排序操作. list 的 sort 方法返回的是对已经存在的列表进行操作,而内建函数 ...
- IReport5.6.0创建数据库连接找不到驱动(iReport中ClassNotFoundError错误的解决)
情景:iRoport中选择com.microsoft.jdbc.sqlserver.SQLServerDriver的JDBC Driver;连接时出现ClassNotFoundError错误 当见到下 ...
- 【Unity】4.2 提升开发效率的捷径--导入 Unity 5.3.4 自带的资源包
分类:Unity.C#.VS2015 创建日期:2016-04-06 一.简介 Unity自带的资源包也称为标准资源包.换言之,Unity自带的所有标准资源包导入到Unity项目中以后,都会放在Pro ...
- C语言:存取结构体成员的点运算符(.)和箭头运算符(->)的区别
转自:http://blog.csdn.net/taric_ma/article/details/7397362 一直以为这两个是没有什么区别的,可以相互替换,今天又翻了一下<C语言核心技术&g ...
- shutil 高级文件操作
High-level file operations 高级的文件操作模块,官网:https://docs.python.org/2/library/shutil.html# os模块提供了对目录或者 ...
- C++操作符的优先级 及其记忆方法
优先级 操作符 描述 例子 结合性 1 ()[]->.::++-- 调节优先级的括号操作符数组下标访问操作符通过指向对象的指针访问成员的操作符通过对象本身访问成员的操作符作用域操作符后置自增操作 ...
- vim学习笔记(11):vim 去掉<200b>
vim查看文件,发现多了<200b>字符,使用/200b搜索匹配不上:grep 200b 也匹配不上 查询后才知道:200b是:Unicode Character 'ZERO WIDTH ...
- 【转】Unity3D中脚本的执行顺序和编译顺序
支持原文,原文请戳: Unity3D中脚本的执行顺序和编译顺序 在Unity中可以同时创建很多脚本,并且可以分别绑定到不同的游戏对象上,它们各自都在自己的生命周期中运行.与脚本有关的也就是编译和执行啦 ...
- GNU make简介
引言 接触开源项目有一段时间了,对自动化编译工具一直很好奇.近期有时间正好整理下GNU make.后续可以深入了解下. 本文主要整理GNU make的学习的基本资料,同时简要介绍make的功能.语法. ...