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”进行跑数据的争论! 对于争论这件事在各行各业都有,其实我觉得针对“争论”这个词的根源在于一件事情有很多解决方案 ...
随机推荐
- [转]FutureTask详解
FutureTask类是Future 的一个实现,并实现了Runnable,所以可通过Excutor(线程池) 来执行,也可传递给Thread对象执行.如果在主线程中需要执行比较耗时的操作时,但又不 ...
- C#基础第七天-作业答案-利用面向对象的思想去实现名片-动态添加
class Card { private string name; public string Name { get { return name; } set { name = value; } } ...
- Logstash+ElasticSearch+Kibana处理nginx访问日志(转)
ELK似乎是当前最为流行的日志收集-存储-分析的全套解决方案. 去年年初, 公司里已经在用, 当时自己还山寨了一个统计系统(postgresql-echarts, 日志无结构化, json形式存储到p ...
- js关闭当前页面和给子页面的对象赋值
代码如下: function saveData(){ //给父页面的对象赋值 frameElement.api.opener.document.getElementById("userNam ...
- GCD 实现生产-消费 模式
#import "ViewController.h" @interface ViewController (){ } @property (nonatomic,strong) di ...
- 一篇文章学会shell工具篇之sed
sed工具执行原理; 有关sed的参数及action的常见操作方法; 定址; 模式空间和保持空间; 使用标签 1.首先先来了解一下什么是sed? sed叫做流编辑器,在shell脚本和Makefile ...
- exe4j打包java应用程序
转载地址:http://blog.csdn.net/fog911811/article/details/6151700 第一.将应用程序导出成一个JAR文件. 1.先打包程序成一个jar.在eclip ...
- PS辅助工具Assistor PS
Assistor PS是一个功能强大的PS辅助工具,它可以切图.标坐标.尺寸.文字样式注释.画参考线等功能,可以为设计师节省很多时间.该PS工具原本需要每月付费$9.99美元,但在今年6月开始,将免费 ...
- (原创)sqlite封装库SmartDB1.3发布
最近终于稍微有点空对SmartDB进行升级了,SmartDB1.3比之前的版本做了简化,增强了易用性和灵活性. SmartDB对sqlite做了一层封装,屏蔽了诸多细节,使得我们使用起来很方便.在注重 ...
- Java 编程下正则表达式判断字符串是否包含中文
package cn.sunzn.demo; import java.util.regex.Matcher; import java.util.regex.Pattern; public class ...