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”进行跑数据的争论! 对于争论这件事在各行各业都有,其实我觉得针对“争论”这个词的根源在于一件事情有很多解决方案 ...
随机推荐
- How to compare dates in Java
How to compare dates in JavaBy mkyong | January 18, 2010 | Updated : November 15, 2016 | Viewed : 93 ...
- sqlserver常用调优脚本
------------------------最耗时的sql--------------------------------------- DECLARE @n INT; ; WITH cte1 A ...
- Mongodb 安装(Windows)
- 跨系统-跨数据库访问表或创建映射视图-PB访问数据库的特殊处理
一. 在项目中可能会遇到在一个项目中会出现多个数据库的操作. 二. 也可能会多个系统多个数据库之间进行交互操作显示. 三. 经常需要两个数据库关联查询或需要翻译显示内容时会很麻烦. 四. 今天就有个简 ...
- java类中serialversionuid 作用 是什么?举个例子说明(转)
serialVersionUID适用于Java的序列化机制.简单来说,Java的序列化机制是通过判断类的serialVersionUID来验证版本一致性的.在进行反序列化时,JVM会把传来的字节流中的 ...
- Linux创建系统用户
#!/bin/bash users_home_front_dir="/data/users/" ssh_user=$1 user_group=$2 server_user_path ...
- Project Euler:Problem 32 Pandigital products
We shall say that an n-digit number is pandigital if it makes use of all the digits 1 to n exactly o ...
- 菜鸟学Java(六)——简单验证码生成(Java版)
验证码大家都知道,它的作用也不用我多说了吧.如果不太清楚请参见百度百科中的解释,一般验证码的生成就是随机产生字符(数字.字母或者汉字等),然后将这些生成的字符绘制成一张图片,再在图片上加上一些干扰元素 ...
- C++11 explicit的使用
C++中的explicit关键字只能用于修饰只有一个参数的类构造函数 , 它的作用是表明该构造函数是显示的, 而非隐式的,跟它相对应的另一个关键字是implicit, 意思是隐藏的,类构造函数默认情况 ...
- node知识积累
// 在node的应用程序中,执行异步操作的函数将回掉函数最为最后一个参数,回掉函数接收错误对象作为第一个参数 var fs = require('fs') fs.readFile('input.tx ...