RabbitMQ和Kafka到底怎么选?

沙海 2021年9月3日03:25:52Java评论33字数 5273阅读17分34秒阅读模式
摘要

智能摘要

智能摘要文章源自JAVA秀-https://www.javaxiu.com/43822.html

如上图所示,集群中有两个节点,每个节点上有一个broker,每个broker负责本机上队列的维护,并且borker之间可以互相通信。Group之间共享一个Topic,看起来就是一个队列的多个拷贝。别再被这些五花八门的队列迷惑了,从架构上找出关键差别,并结合自己的实际需求(比如本文就只单单从吞吐量一个需求来考察)轻轻松松搞定选型。文章源自JAVA秀-https://www.javaxiu.com/43822.html

原文约 6121 | 图片 16 | 建议阅读 13 分钟 | 评价反馈文章源自JAVA秀-https://www.javaxiu.com/43822.html

RabbitMQ和Kafka到底怎么选?

点击关注 ? Java基基 文章源自JAVA秀-https://www.javaxiu.com/43822.html

收录于话题文章源自JAVA秀-https://www.javaxiu.com/43822.html

#Java基基,354文章源自JAVA秀-https://www.javaxiu.com/43822.html

#面朝大厂,22文章源自JAVA秀-https://www.javaxiu.com/43822.html

点击上方“Java基基”,选择“设为星标”文章源自JAVA秀-https://www.javaxiu.com/43822.html

做积极的人,而不是积极废人!文章源自JAVA秀-https://www.javaxiu.com/43822.html

每天 14:00 更新文章,每天掉亿点点头发...文章源自JAVA秀-https://www.javaxiu.com/43822.html

文章源自JAVA秀-https://www.javaxiu.com/43822.html

源码精品专栏文章源自JAVA秀-https://www.javaxiu.com/43822.html

 文章源自JAVA秀-https://www.javaxiu.com/43822.html

文章源自JAVA秀-https://www.javaxiu.com/43822.html

来源:cnblogs.com/haolujun/p/9632835.html文章源自JAVA秀-https://www.javaxiu.com/43822.html

  • 前言文章源自JAVA秀-https://www.javaxiu.com/43822.html

  • RabbitMQ架构文章源自JAVA秀-https://www.javaxiu.com/43822.html

  • Kafka文章源自JAVA秀-https://www.javaxiu.com/43822.html

  • 总结文章源自JAVA秀-https://www.javaxiu.com/43822.html

RabbitMQ和Kafka到底怎么选?文章源自JAVA秀-https://www.javaxiu.com/43822.html

前言

开源社区有好多优秀的队列中间件,比如RabbitMQ和Kafka,每个队列都貌似有其特性,在进行工程选择时,往往眼花缭乱,不知所措。对于RabbitMQ和Kafka,到底应该选哪个?文章源自JAVA秀-https://www.javaxiu.com/43822.html

推荐下自己做的 Spring Boot 的实战项目:文章源自JAVA秀-https://www.javaxiu.com/43822.html

https://github.com/YunaiV/ruoyi-vue-pro文章源自JAVA秀-https://www.javaxiu.com/43822.html

RabbitMQ架构

RabbitMQ是一个分布式系统,这里面有几个抽象概念。文章源自JAVA秀-https://www.javaxiu.com/43822.html

  • broker:每个节点运行的服务程序,功能为维护该节点的队列的增删以及转发队列操作请求。文章源自JAVA秀-https://www.javaxiu.com/43822.html

  • master queue:每个队列都分为一个主队列和若干个镜像队列。文章源自JAVA秀-https://www.javaxiu.com/43822.html

  • mirror queue:镜像队列,作为master queue的备份。在master queue所在节点挂掉之后,系统把mirror queue提升为master queue,负责处理客户端队列操作请求。注意,mirror queue只做镜像,设计目的不是为了承担客户端读写压力。文章源自JAVA秀-https://www.javaxiu.com/43822.html

RabbitMQ和Kafka到底怎么选?文章源自JAVA秀-https://www.javaxiu.com/43822.html

如上图所示,集群中有两个节点,每个节点上有一个broker,每个broker负责本机上队列的维护,并且borker之间可以互相通信。集群中有两个队列A和B,每个队列都分为master queue和mirror queue(备份)。那么队列上的生产消费怎么实现的呢?文章源自JAVA秀-https://www.javaxiu.com/43822.html

队列消费

RabbitMQ和Kafka到底怎么选?文章源自JAVA秀-https://www.javaxiu.com/43822.html

如上图有两个consumer消费队列A,这两个consumer连在了集群的不同机器上。RabbitMQ集群中的任何一个节点都拥有集群上所有队列的元信息,所以连接到集群中的任何一个节点都可以,主要区别在于有的consumer连在master queue所在节点,有的连在非master queue节点上。文章源自JAVA秀-https://www.javaxiu.com/43822.html

因为mirror queue要和master queue保持一致,故需要同步机制,正因为一致性的限制,导致所有的读写操作都必须都操作在master queue上(想想,为啥读也要从master queue中读?和数据库读写分离是不一样的。),然后由master节点同步操作到mirror queue所在的节点。即使consumer连接到了非master queue节点,该consumer的操作也会被路由到master queue所在的节点上,这样才能进行消费。文章源自JAVA秀-https://www.javaxiu.com/43822.html

队列生产

RabbitMQ和Kafka到底怎么选?文章源自JAVA秀-https://www.javaxiu.com/43822.html

原理和消费一样,如果连接到非 master queue 节点,则路由过去。文章源自JAVA秀-https://www.javaxiu.com/43822.html

所以,到这里小伙伴们就可以看到 RabbitMQ的不足:由于master queue单节点,导致性能瓶颈,吞吐量受限。虽然为了提高性能,内部使用了Erlang这个语言实现,但是终究摆脱不了架构设计上的致命缺陷。文章源自JAVA秀-https://www.javaxiu.com/43822.html

推荐下自己做的 Spring Cloud 的实战项目:文章源自JAVA秀-https://www.javaxiu.com/43822.html

https://github.com/YunaiV/onemall文章源自JAVA秀-https://www.javaxiu.com/43822.html

Kafka

说实话,Kafka我觉得就是看到了RabbitMQ这个缺陷才设计出的一个改进版,改进的点就是:把一个队列的单一master变成多个master,即一台机器扛不住qps,那么我就用多台机器扛qps,把一个队列的流量均匀分散在多台机器上不就可以了么?注意,多个master之间的数据没有交集,即一条消息要么发送到这个master queue,要么发送到另外一个master queue。文章源自JAVA秀-https://www.javaxiu.com/43822.html

这里面的每个master queue 在Kafka中叫做Partition,即一个分片。一个队列有多个主分片,每个主分片又有若干副分片做备份,同步机制类似于RabbitMQ。RabbitMQ和Kafka到底怎么选?文章源自JAVA秀-https://www.javaxiu.com/43822.html

如上图,我们省略了不同的queue,假设集群上只有一个queue(Kafka中叫Topic)。每个生产者随机把消息发送到主分片上,之后主分片再同步给副分片。文章源自JAVA秀-https://www.javaxiu.com/43822.html

RabbitMQ和Kafka到底怎么选?文章源自JAVA秀-https://www.javaxiu.com/43822.html

队列读取的时候虚拟出一个Group的概念,一个Topic内部的消息,只会路由到同Group内的一个consumer上,同一个Group中的consumer消费的消息是不一样的;Group之间共享一个Topic,看起来就是一个队列的多个拷贝。所以,为了达到多个Group共享一个Topic数据,Kafka并不会像RabbitMQ那样消息消费完毕立马删除,而是必须在后台配置保存日期,即只保存最近一段时间的消息,超过这个时间的消息就会从磁盘删除,这样就保证了在一个时间段内,Topic数据对所有Group可见(这个特性使得Kafka非常适合做一个公司的数据总线)。队列读同样是读主分片,并且为了优化性能,消费者与主分片有一一的对应关系,如果消费者数目大于分片数,则存在某些消费者得不到消息。文章源自JAVA秀-https://www.javaxiu.com/43822.html

由此可见,Kafka绝对是为了高吞吐量设计的,比如设置分片数为100,那么就有100台机器去扛一个Topic的流量,当然比RabbitMQ的单机性能好。文章源自JAVA秀-https://www.javaxiu.com/43822.html

总结

本文只做了Kafka和RabbitMQ的对比,但是开源队列岂止这两个,ZeroMQ,RocketMQ,JMQ等等,时间有限也就没有细看,故不在本文比较范围之内。文章源自JAVA秀-https://www.javaxiu.com/43822.html

所以,别再被这些五花八门的队列迷惑了,从架构上找出关键差别,并结合自己的实际需求(比如本文就只单单从吞吐量一个需求来考察)轻轻松松搞定选型。最后总结如下:文章源自JAVA秀-https://www.javaxiu.com/43822.html

  • 吞吐量较低:Kafka和RabbitMQ都可以。文章源自JAVA秀-https://www.javaxiu.com/43822.html

  • 吞吐量高:Kafka。文章源自JAVA秀-https://www.javaxiu.com/43822.html

本文内容参考自RabbitMQ和KafKa官方文档,所以真要搞懂一个中间件的原理最好去看官方文档,文档里面有详细的设计方案,我们可以自己进行设计方案的对比,从而找出符合自己实际情况的中间件。 title: 头大!RabbitMQ 和 Kafka 到底怎么选? date: 2020-12-10 tags: categories: 精进 permalink: Fight/Head-What-is-RabbitMQ-or-Kafka author: haolujun from_url: cnblogs.com/haolujun/p/9632835.html wechat_url:文章源自JAVA秀-https://www.javaxiu.com/43822.html

前言

开源社区有好多优秀的队列中间件,比如RabbitMQ和Kafka,每个队列都貌似有其特性,在进行工程选择时,往往眼花缭乱,不知所措。对于RabbitMQ和Kafka,到底应该选哪个?文章源自JAVA秀-https://www.javaxiu.com/43822.html

RabbitMQ架构

RabbitMQ是一个分布式系统,这里面有几个抽象概念。文章源自JAVA秀-https://www.javaxiu.com/43822.html

  • broker:每个节点运行的服务程序,功能为维护该节点的队列的增删以及转发队列操作请求。文章源自JAVA秀-https://www.javaxiu.com/43822.html

  • master queue:每个队列都分为一个主队列和若干个镜像队列。文章源自JAVA秀-https://www.javaxiu.com/43822.html

  • mirror queue:镜像队列,作为master queue的备份。在master queue所在节点挂掉之后,系统把mirror queue提升为master queue,负责处理客户端队列操作请求。注意,mirror queue只做镜像,设计目的不是为了承担客户端读写压力。文章源自JAVA秀-https://www.javaxiu.com/43822.html

RabbitMQ和Kafka到底怎么选?文章源自JAVA秀-https://www.javaxiu.com/43822.html

如上图所示,集群中有两个节点,每个节点上有一个broker,每个broker负责本机上队列的维护,并且borker之间可以互相通信。集群中有两个队列A和B,每个队列都分为master queue和mirror queue(备份)。那么队列上的生产消费怎么实现的呢?文章源自JAVA秀-https://www.javaxiu.com/43822.html

队列消费

RabbitMQ和Kafka到底怎么选?文章源自JAVA秀-https://www.javaxiu.com/43822.html

如上图有两个consumer消费队列A,这两个consumer连在了集群的不同机器上。RabbitMQ集群中的任何一个节点都拥有集群上所有队列的元信息,所以连接到集群中的任何一个节点都可以,主要区别在于有的consumer连在master queue所在节点,有的连在非master queue节点上。文章源自JAVA秀-https://www.javaxiu.com/43822.html

因为mirror queue要和master queue保持一致,故需要同步机制,正因为一致性的限制,导致所有的读写操作都必须都操作在master queue上(想想,为啥读也要从master queue中读?和数据库读写分离是不一样的。),然后由master节点同步操作到mirror queue所在的节点。即使consumer连接到了非master queue节点,该consumer的操作也会被路由到master queue所在的节点上,这样才能进行消费。文章源自JAVA秀-https://www.javaxiu.com/43822.html

队列生产

RabbitMQ和Kafka到底怎么选?文章源自JAVA秀-https://www.javaxiu.com/43822.html

原理和消费一样,如果连接到非 master queue 节点,则路由过去。文章源自JAVA秀-https://www.javaxiu.com/43822.html

所以,到这里小伙伴们就可以看到 RabbitMQ的不足:由于master queue单节点,导致性能瓶颈,吞吐量受限。虽然为了提高性能,内部使用了Erlang这个语言实现,但是终究摆脱不了架构设计上的致命缺陷。文章源自JAVA秀-https://www.javaxiu.com/43822.html

Kafka

说实话,Kafka我觉得就是看到了RabbitMQ这个缺陷才设计出的一个改进版,改进的点就是:把一个队列的单一master变成多个master,即一台机器扛不住qps,那么我就用多台机器扛qps,把一个队列的流量均匀分散在多台机器上不就可以了么?注意,多个master之间的数据没有交集,即一条消息要么发送到这个master queue,要么发送到另外一个master queue。文章源自JAVA秀-https://www.javaxiu.com/43822.html

这里面的每个master queue 在Kafka中叫做Partition,即一个分片。一个队列有多个主分片,每个主分片又有若干副分片做备份,同步机制类似于RabbitMQ。RabbitMQ和Kafka到底怎么选?文章源自JAVA秀-https://www.javaxiu.com/43822.html

如上图,我们省略了不同的queue,假设集群上只有一个queue(Kafka中叫Topic)。每个生产者随机把消息发送到主分片上,之后主分片再同步给副分片。文章源自JAVA秀-https://www.javaxiu.com/43822.html

RabbitMQ和Kafka到底怎么选?文章源自JAVA秀-https://www.javaxiu.com/43822.html

队列读取的时候虚拟出一个Group的概念,一个Topic内部的消息,只会路由到同Group内的一个consumer上,同一个Group中的consumer消费的消息是不一样的;Group之间共享一个Topic,看起来就是一个队列的多个拷贝。所以,为了达到多个Group共享一个Topic数据,Kafka并不会像RabbitMQ那样消息消费完毕立马删除,而是必须在后台配置保存日期,即只保存最近一段时间的消息,超过这个时间的消息就会从磁盘删除,这样就保证了在一个时间段内,Topic数据对所有Group可见(这个特性使得Kafka非常适合做一个公司的数据总线)。队列读同样是读主分片,并且为了优化性能,消费者与主分片有一一的对应关系,如果消费者数目大于分片数,则存在某些消费者得不到消息。文章源自JAVA秀-https://www.javaxiu.com/43822.html

由此可见,Kafka绝对是为了高吞吐量设计的,比如设置分片数为100,那么就有100台机器去扛一个Topic的流量,当然比RabbitMQ的单机性能好。文章源自JAVA秀-https://www.javaxiu.com/43822.html

总结

本文只做了Kafka和RabbitMQ的对比,但是开源队列岂止这两个,ZeroMQ,RocketMQ,JMQ等等,时间有限也就没有细看,故不在本文比较范围之内。文章源自JAVA秀-https://www.javaxiu.com/43822.html

所以,别再被这些五花八门的队列迷惑了,从架构上找出关键差别,并结合自己的实际需求(比如本文就只单单从吞吐量一个需求来考察)轻轻松松搞定选型。最后总结如下:文章源自JAVA秀-https://www.javaxiu.com/43822.html

  • 吞吐量较低:Kafka和RabbitMQ都可以。文章源自JAVA秀-https://www.javaxiu.com/43822.html

  • 吞吐量高:Kafka。文章源自JAVA秀-https://www.javaxiu.com/43822.html

本文内容参考自RabbitMQ和KafKa官方文档,所以真要搞懂一个中间件的原理最好去看官方文档,文档里面有详细的设计方案,我们可以自己进行设计方案的对比,从而找出符合自己实际情况的中间件。文章源自JAVA秀-https://www.javaxiu.com/43822.html

- END -文章源自JAVA秀-https://www.javaxiu.com/43822.html

欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢文章源自JAVA秀-https://www.javaxiu.com/43822.html

RabbitMQ和Kafka到底怎么选?文章源自JAVA秀-https://www.javaxiu.com/43822.html

已在知识星球更新源码解析如下:文章源自JAVA秀-https://www.javaxiu.com/43822.html

RabbitMQ和Kafka到底怎么选?文章源自JAVA秀-https://www.javaxiu.com/43822.html

RabbitMQ和Kafka到底怎么选?文章源自JAVA秀-https://www.javaxiu.com/43822.html

RabbitMQ和Kafka到底怎么选?文章源自JAVA秀-https://www.javaxiu.com/43822.html

RabbitMQ和Kafka到底怎么选?文章源自JAVA秀-https://www.javaxiu.com/43822.html

最近更新《芋道 SpringBoot 2.X 入门》系列,已经 101 余篇,覆盖了 MyBatis、Redis、MongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能测试等等内容。文章源自JAVA秀-https://www.javaxiu.com/43822.html

提供近 3W 行代码的 SpringBoot 示例,以及超 6W 行代码的电商微服务项目。文章源自JAVA秀-https://www.javaxiu.com/43822.html

获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。文章源自JAVA秀-https://www.javaxiu.com/43822.html

文章源自JAVA秀-https://www.javaxiu.com/43822.html

文章有帮助的话,在看,转发吧。谢谢支持哟 (*^__^*)
文章源自JAVA秀-https://www.javaxiu.com/43822.html

阅读原文文章源自JAVA秀-https://www.javaxiu.com/43822.html

继续阅读
速蛙云 - 极致体验,强烈推荐!!!购买套餐就免费送各大视频网站会员!快速稳定、独家福利社、流媒体稳定解锁!速度快,全球上网、视频、游戏加速、独立IP均支持!基础套餐性价比很高!这里不多说,我一直正在使用,推荐购买:https://www.javaxiu.com/59919.html
weinxin
资源分享QQ群
本站是JAVA秀团队的技术分享社区, 会经常分享资源和教程; 分享的时代, 请别再沉默!
沙海
  • 版权声明:本站是JAVA秀团队的技术分享社区,我们会经常分享资源和教程。
  • 转载请注明:RabbitMQ和Kafka到底怎么选? - JAVA秀 ☜(ˆ▽ˆ)
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定