文档章节

RabbitMQ和Kafka

通九互联科技
 通九互联科技
发布于 2015/09/06 17:30
字数 1408
阅读 5849
收藏 25

起因

最近公司RabbitMQ的集群出了点问题,然后有些亲就说RabbitMQ慢且不好用,是一个瓶颈,不如换成Kafka。而我本人,使用RabbitMQ有一点久了,认为这个事情应当辩证的去看。所以就在没事的时候简单的看了看RabbitMQ的代码。但是我并没有看太多Kafka的代码,我只简单提下。

关于Kafka

根据Kafka官方的文档,Kafka可以被认为一个高大上的集群消息中间件,但是读了下以前一个朋友给的部署文档和Kafka的官方的文档。发现Kafka确实不错,真的可以说是集群消息中间件。

  1. 用topic来进行消息管理,每个topic包含多个part,每个part对应一个逻辑log,有多个segment组成。

  2. segment中的消息id由其逻辑位置决定,可以用消息id直接定位到消息的存储位置,避免id到位置的额外映射。

  3. 生产者发到某个topic的消息会被均匀的分布到多个part上,broker收到消息会写入最后的segment文件中,当某个segment上的消息条数达到配置值或消息发布时间超过阈值时,segment上的消息会被flush到磁盘,只有flush到磁盘上的消息消费者才能收到。并且通过rolling的机制,保证segment的文件不至于过大。

  4. 消费者可以rewind back到任意位置重新进行消费,当消费者故障时,可以选择最小的offset进行重新读取消费消息。

是不是看起来很爽,但是深入往下看,发现了一些深坑

  1. Kafka对消息的重复、丢失、错误以及顺序型没有严格的要求。但是part只会被consumer group内的一个consumer消费,故kafka保证每个parti内的消息会被顺序的消费。

  2. broker没有副本机制,一旦broker宕机,该broker的消息将都不可用。同时broker是无状态的,broker不保存消费者的状态,由消费者自己保存。无状态导也致消息的删除成为难题,所以Kafka选择消息保存一定时间后会被删除。

  3. 大量的依赖Zookeeper,需要Zookeeper来管理broker与consumer的动态加入与离开。以及消费关系及每个partion的消费信息。

看到这里,你如果还明白我说这些深坑是什么意思,那就请带入运维场景和特定故障场景思考下。我稍后会说一下这些坑会带来什么问题。

关于RabbitMQ

RabbitMQ是使用Erlang开发的一个消息队列,可以构建成集群,也可以单独使用。

根据测试,RabbitMQ在不使用ACK机制的,Msg大小为1K的情况下,QPS可达6W+。再双方ACK机制,Msg大小为1K的情况下,QPS瞬间降到了1W+。从某种意义上RabbitMQ还真是慢,但是我们需要思考下。

  1. 我们真的每个消息都能到1K吗?

  2. 我们真的需要双方都对消息ACK的系统吗?

好了,如果两个回答都是YES,那么RabbitMQ就是慢的。如果是No,那么RabbitMQ还是一个非常快的队列。

RabbitMQ慢有几个原因:

  1. RabbitMQ做为一个Broker,不单单做到了简单的数据转发功能,还保证了单个队列上的数据有序,即便是有多个消费者和多个生产者。

  2. RabbitMQ的策略是实时转发,而不像Kafka那样等待刷盘之后才让消费者来消费。

  3. 如果消费者和生产者不对等,会产生大量的磁盘IO操作,进行消息换出。

RabbitMQ为什么不好用:

  1. AMQP协议本身比较复杂,参数比较多。

  2. Erlang写的,很多人不熟悉,并且Mnesia出现问题好多人解决不了。

RabbitMQ和Kafka相比没价值了吗?

很多亲们读到这里,就会想RabbitMQ好像也不怎么样呀。和Kafka相比没什么价值可言了,但是我前面说了一些Kafka的坑,我就在这里面揭示一下。

  1. Kafka大量依赖Zookeeper,它的broker并不保存任何状态,如果Zookeeper集群不幸悲剧了,那么整个Kafka集群的消息就全完蛋了。

  2. 上面问题有人会说这概率好小,我也同样认为这个概率很小,那么一个broker当机呢?当一个broker当机了整个消息队列由于负载均衡的算法,在一瞬间消费者和生产者之间的消息就全乱掉了。很多需要保证消息顺序的系统一下子就完蛋了。

这就是RabbitMQ存在的价值和意义,同时RabbitMQ使用了MirrorQueue的机制,也可以做到多个机器进行热备。

RabbitMQ该怎么用

  1. RabbitMQ的消息应当尽可能的小,并且只用来处理实时且要高可靠性的消息。

  2. 消费者和生产者的能力尽量对等,否则消息堆积会严重影响RabbitMQ的性能。

  3. 集群部署,使用热备,保证消息的可靠性。

Kafka该怎么用

  1. 应当有一个非常好的运维监控系统,不单单要监控Kafka本身,还要监控Zookeeper。

  2. 对消息顺序不依赖,且不是那么实时的系统。

  3. 对消息丢失并不那么敏感的系统。



© 著作权归作者所有

共有 人打赏支持
通九互联科技
粉丝 133
博文 38
码字总数 21941
作品 1
大连
个人站长
私信 提问
加载中

评论(8)

通九互联科技
通九互联科技

引用来自“貓小樂”的评论

文章写得我还是不知如何选择
看业务,要保证时序的最好用RabbitMQ,要保证量级的最好用Kafka。
貓小樂
貓小樂
文章写得我还是不知如何选择
通九互联科技
通九互联科技

引用来自“I_am_learner”的评论

“broker没有副本机制,一旦broker宕机,该broker的消息将都不可用。” kafka的备份机制是通过partition的备份实现的, 如果一个broker宕机, 在这个broker上的partition的leader会切到正常的机器上, 然后正常提供服务。0
“大量的依赖Zookeeper,需要Zookeeper来管理broker与consumer的动态加入与离开”,2.8.2的版本都已经把consumer的信息自己管理了0
ISR这个我前阶段看新版本的更新,至于Zookeeper的强依赖还是存在的,即便是consumer信息自己管理了,broker的ISR机制和Topic还是很依赖Zookeeper的。
I
I_am_learner
“broker没有副本机制,一旦broker宕机,该broker的消息将都不可用。” kafka的备份机制是通过partition的备份实现的, 如果一个broker宕机, 在这个broker上的partition的leader会切到正常的机器上, 然后正常提供服务。0
“大量的依赖Zookeeper,需要Zookeeper来管理broker与consumer的动态加入与离开”,2.8.2的版本都已经把consumer的信息自己管理了0
通九互联科技
通九互联科技

引用来自“摩云飞”的评论

没研究过Kafka,RabbitMQ的情况确实如你所说~
在新公司用的是Kafka,也有很多不错的地方,不过RabbitMQ更有意思一些,并且最近开启了Phoenix/Elixir这条路线。
摩云飞
摩云飞
没研究过Kafka,RabbitMQ的情况确实如你所说~
通九互联科技
通九互联科技

引用来自“lgscofield”的评论

Kafka有恢复机制,不知道楼主测试过没有
木有深入搞过Kafka,所以不知道Kafka的恢复是什么样子的。不过感谢提醒,有时间的话,我一定会去看下Kafka代码中是如何实现恢复的。
lgscofield
lgscofield
Kafka有恢复机制,不知道楼主测试过没有
MQ-RabbitMq部署安装配置

环境准备 本次实验使用的是VMvare虚拟机。详情如下 hostname: node1.server ip地址:192.168.0.150 网卡:eth0,eth1 系统及硬件:CentOS 7.2 内存2G,硬盘50G 一、 什么是RabbitMq 消息队列又...

linuxzkq
06/26
0
0
ActiveMQ RabbitMQ KafKa对比

前言: ActiveMQ和 RabbitMq 以及Kafka在之前的项目中都有陆续使用过,当然对于三者没有进行过具体的对比,以下摘抄了一些网上关于这三者的对比情况,我自己看过之后感觉还 是可以的,比较清...

xiaomin0322
05/11
0
0
爬虫架构 | 消息队列应用场景及ActiveMQ、RabbitMQ、RocketMQ、Kafka对比

前言:在之前的业务中,使用了Kafka和RabbitMQ两种消息队列,这篇文章来做一个总结。 消息队列中间件是分布式系统中重要的组件,主要实现异步消息,应用解耦,流量削峰及消息通讯等功能。 下...

小怪聊职场
04/26
0
0
rabbitMQ、activeMQ、zeroMQ、Kafka、Redis 比较

Kafka作为时下最流行的开源消息系统,被广泛地应用在数据缓冲、异步通信、汇集日志、系统解耦等方面。相比较于RocketMQ等其他常见消息系统,Kafka在保障了大部分功能特性的同时,还提供了超一...

xumaojun
05/06
0
0
架构设计之NodeJS操作消息队列RabbitMQ

一. 什么是消息队列? 消息(Message)是指在应用间传送的数据。消息可以非常简单,比如只包含文本字符串,也可以更复杂,可能包含嵌入对象。 消息队列(Message Queue)是一种应用间的通信方...

07/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

mgo初步接触

Intro mgo是mongodb的go语言绑定,第一次在静态类型语言中使用ORM,故留个笔记。 模型 mongodb是schema-less无模式的NoSQL非关系型数据库,理论上来说,在同一个表(mongodb中称为collectio...

御坂网络路由器
17分钟前
3
0
不要忽略异常(65)

请不要忽略异常, 尤其在api方法声明将会抛出的异常,这是定义者在试图说明某种问题 空的catch 块起到忽略异常的作用 对空的catch 块保持警惕,不应该出现 至少也要写明忽略该异常的原因 有一...

Java搬砖工程师
18分钟前
1
0
网站漏洞检测工具对discuzX3.2 X3.4网站漏洞修复

2018年12月9日,国内某安全组织,对discuz X3.2 X3.4版本的漏洞进行了公开,这次漏洞影响范围较大,具体漏洞是discuz 的用户前段SQL注入与请求伪造漏洞,也俗称SSRF漏洞,漏洞产生的原因首先...

网站安全
18分钟前
2
0
2018开发人员路线图

chinahufei
20分钟前
3
0
领哥,项目管理

领哥 https://www.leangoo.com/kanban/board_list

miaojiangmin
33分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部