文档章节

RabbitMQ和Kafka

通九互联科技
 通九互联科技
发布于 2015/09/06 17:30
字数 1408
阅读 1.4W
收藏 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
博文 37
码字总数 21775
作品 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有恢复机制,不知道楼主测试过没有
ActiveMQ RabbitMQ KafKa对比

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

xiaomin0322
2018/05/11
409
0
MQ-RabbitMq部署安装配置

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

linuxzkq
2018/06/26
0
0
如何保证消息队列的可靠性传输?

面试题 如何保证消息的可靠性传输?或者说,如何处理消息丢失的问题? 面试官心理分析 这个是肯定的,用 MQ 有个基本原则,就是数据不能多一条,也不能少一条,不能多,就是前面说的重复消费...

李红欧巴
2019/03/20
215
0
爬虫架构 | 消息队列应用场景及ActiveMQ、RabbitMQ、RocketMQ、Kafka对比

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

小怪聊职场
2018/04/26
0
0
RabbitMQ和Kafka到底怎么选?

  前言   开源社区有好多优秀的队列中间件,比如RabbitMQ和Kafka,每个队列都貌似有其特性,在进行工程选择时,往往眼花缭乱,不知所措。对于RabbitMQ和Kafka,到底应该选哪个?   Rab...

java进阶架构师
2019/11/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

spring cloud 是什么,学习什么

一、什么是springcloud,有什么作用   Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、...

FH-Admin
33分钟前
51
0
【招聘】医疗行业

产品经理(1人) 【岗位职责】 1.方案策划:对互联网医疗信息化项目全流程负责,包括产品的需求、开发、推广、实施各个过程;跟踪国内外最新进展、发展趋势、竞争厂家研发信息、国家政策信息...

挨踢得要死要死的某瓜
35分钟前
357
0
「网易官方」极客战记(codecombat)攻略-地牢-Kithgard 学徒kithgard-apprentice

那么这就是年轻的食人魔巫师和术士来研究的地方? 默认代码 # 你的目标是生存。 # 也很有趣。 也许能嬴上排行榜! # 你第一次来地牢的时候,应该没见过这个房间。 概览 这是你测试技能战术的...

极客战记
39分钟前
49
0
TI AM570x浮点DSP C66x + ARM Cortex-A15开发板的CSI2 CAMERA接口、以太网接口

TL570x-EVM是一款由创龙基于SOM-TL570x核心板设计的开发板,它为用户提供了SOM-TL570x核心板的测试平台,用于快速评估SOM-TL570x核心板的整体性能。 TL570x-EVM底板采用沉金无铅工艺的4层板设...

Tronlong创龙
47分钟前
37
0
程序员必须掌握的核心算法有哪些?

由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程...

摩尔12
58分钟前
39
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部