(4)Kafka、RocketMQ、RabbitMQ比较(1

1)三种对比、2)rocketMq高性能原因、3)kafka比RocketMQ更高原因、4)RocketMQ场景、5)zk和NameServer对比

一、三种对比

Kafka:1)基于Pull模式来处理,2)高吞吐量,3)大量数据、日志采集业务。

RocketMQ:1)金融领域而生,可靠性高,尤其订单扣款,2)业务削峰,大量交易涌入,后端无法及时

RabbitMQ:数据量没那么大,小公司优先选择

1.Kafka

优点:单机写入TPS百万条/秒、时效ms级、日志领域比较成熟

           可用性高,多个副本,少数宕机,不丢数据,不会不可用

           Pull方式获取消息, 有序, 控制仅被消费一次;

缺点: Kafka单机超过64个队列/分区,队列越多,load越高,发送消息响应时间变长

            使用短轮询方式,实时性取决于轮询间隔时间;

            不支持重试;支持消息顺序,但一台代理宕机后,就乱序

2.RocketMQ

设计时参考 Kafka做改进。阿里集团被广泛应用在订单,交易,充值,流计算,消息推送,日志流式处理,binglog分发等场景。

优点:1)吞吐量十万级、可用性高、消息可0丢失2)10亿级消息堆积,不会因堆积性能下降

3.RabbitMQ

优点:1)erlang语言的特性,mq 性能较好,高并发;吞吐量万级,MQ功能比较完备

           2)健壮、稳定、易用、跨平台、支持多种语言、文档齐全;

缺点:实现机制重,吞吐量低一些

二、rocketMq高性能原因

1、生产者顺序写入

消息存储是由ConsumeQueueCommitLog配合完成。一个Topic里面有多个MessageQueue,每个MessageQueue对应一个ConsumeQueue

    ConsumeQueue:记消息物理存储地址。

    CommitLog:存储文件具体字节信息(文件大小默认1g,名称20位数,左边补0右边为偏移量)。消息顺序写,文件满写下一个

2、消费者随机读

先读逻辑队列consumQue中元数据,再从commitlog找消息体。但入口处rocketmq用package,可以批量地从磁盘读取,作为cache存到内存中,加速后续的读取速度。

随机读具体流程

1)Consumer20s一次负载均衡(默认分页)更新,根据Broker存的ConsumerGroupTopic信息,把MessageQueue分给不同Consumer,负载策略

2)每个MessageQueue对应一个pullRequest,全部存储到该ConsumerpullRequestQueue队列里面

3)Consumer启动独立后台PullMessageService线程,不停的尝试从pullRequestQueue.take()获取PullRequest

4)捞取到PullRequest会先做缓存校验(默认一个Queue里面缓存待处理消息个数不超过1000个,消息大小不超过100M,否则会延迟50ms再重试),从而保证客户端的缓存负载不会过高

5)PullRequest发送给Broker,如果Broker发现该Queue待处理的消息,就会直接返回给Consumer,Consumer接收响应以后,重新把该PullRequest丢到自己的pullRequestQueue队列里面,从而重复执行捞取消息的动作,保证消息的及时性

6)PullRequest发送给Broker,如果Broker发现该Queue没有待处理的消息,则会Hold住这个请求,暂不响应给Consumer,默认长轮询是5s重试获取一次待处理消息,如果有新的待处理消息则立刻ResponseConsumer,当客户端检测到消息挂起超时(客户端有默认参数 响应超时时间 20s),会重新发起PullRequest给Broker

3、消费模型

(1)push:producer发消息后,broker马上投给consumer。实时性高,但增加broker负载;如push过快,消费端出现问题

(2)pull:producer发消息后,broker等consumer来读取。主动权在消费者;但间隔不好设置,太短浪费,太消费不及时

(3)长轮询:consumer请求时,broker保持连接一段时间(默认15s),期间内有消息到达,返回给consumer;没返回空,重请求。缺点:服务端保存consumer状态,客户端过多占资源

默认pushConsumer,本质是pull+长轮询。通过长轮询达到push实时性,又有pull可控性。系统收消息后,自动处理消息offset(消息偏移量),期间有新consumer加入自动做负载均衡(集群模式下offset存在broker中; 广播模式下offset存在consumer里)。

ps:也可设pullConsumer,更灵活,代码复杂,手动维护offset、消息存储和状态。

4、zero copy

零拷贝技术有mmap(小文件)及sendfile(大文件),MMQ发送消息通常都很小,rocketmq就以mmap+write实现

三、为什么kafka吞吐量更高,但RocketMQ延时低

kafka的Producer:小消息缓存合并(异步),到一定数量批量发Broker

减少网络io,提高发送性能,但发送者宕机,消息丢失,提高io性能降低可靠性

RocketMQ无法用同样方式

1)Producer调send(),及时处理(延时低),直接发出去,但未发送到Broker,返回成功,宕机,消息丢

2)因为用的Java语言,缓存过多会GC

3)Producer每台机器多线程发送,单Producer每秒数据有限,不可能上万缓存完全可由上层业务完成。

四、为什么选择RocketMQ

broker里topic的partition数过多,kafka性能  < rocketMq都用文件存储

1、kafka: 一个分区一个文件,topic多,分区总量也多,对消息刷盘时,文件竞争磁盘,出现性能的下降。顺序读写,一分区最多只被一线程消费

2、rocketMq:所有队列都存一个文件中,每个队列消息量小,topic的增加对rocketMq性能影响小

五、为什么kafka 用zk,rocket mq用自研的NameServer?

与nameServer相比,zookeeper:

1.复杂性:zk:基于CAP,宕机选举,选举耗时;

                nameServer:代码量少,节点间互不通信,无法复制。

2.可用性:zk :CP,牺牲可用性

                 nameServer:部署多台broker实现高可用:没宕机时,轮询队列,发消息;宕机:接下来5分钟跳过BrokerA,选其他broker中队列,发消息,不选举

3、路由注册信息:

    zk:数据只写主节点,就复制到从

    NameServer:broker启动时,轮询nameServer列表,与每个nameServer长连接,发起注册请求。

    1、维护Broker列表,用来动态存储Broker信息。

    2、Broker和NameServer心跳检测,30s发给NameServer  Broker信息。NameServer会更新时间,最新与当前超过120s,则进行路由剔除

    3、Topic路由注册中读写锁:对broker表允许并发读,串行写

https://zhuanlan.zhihu.com/p/163246737?utm_source=wechat_session

https://zhuanlan.zhihu.com/p/161224418

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,724评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,104评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,142评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,086评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,076评论 5 370
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,914评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,220评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,871评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,318评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,834评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,951评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,574评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,162评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,162评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,383评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,349评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,652评论 2 343

推荐阅读更多精彩内容