消息队列选型之 Kafka vs RabbitMQ
在面对众多的消息队列时,我们往往会陷入选择的困境:“消息队列那么多,该怎么选啊?Kafka 和 RabbitMQ 比较好用,用哪个更好呢?”想必大家也曾有过类似的疑问。对此本文将在接下来的内容中以 Kafka 和 RabbitMQ 为例分享消息队列选型的一些经验。
1.什么是消息队列
2.消息队列的应用场景
2.1 异步
2.2 解耦
2.3 削峰
3.消息队列发展历程
- ActiveMQ 是 Apache 出品的、采用 Java 语言编写的完全基于 JMS1.1 规范的面向消息的中间件,为应用程序提供高效的、可扩展的、稳定的和安全的企业级消息通信。不过由于历史原因包袱太重,目前市场份额没有后面三种消息中间件多,其最新架构被命名为 Apollo,号称下一代 ActiveMQ,有兴趣的同学可自行了解。
- RabbitMQ 是采用 Erlang 语言实现的 AMQP 协议的消息中间件,最初起源于金融系统,用于在分布式系统中存储转发消息。RabbitMQ 发展到今天,被越来越多的人认可,这和它在可靠性、可用性、扩展性、功能丰富等方面的卓越表现是分不开的。
- Kafka 起初是由 LinkedIn 公司采用 Scala 语言开发的一个分布式、多分区、多副本且基于 Zookeeper 协调的分布式消息系统,现已捐献给 Apache 基金会。它是一种高吞吐量的分布式发布订阅消息系统,以可水平扩展和高吞吐率而被广泛使用。目前越来越多的开源分布式处理系统如 Cloudera、Apache Storm、Spark、Flink 等都支持与 Kafka 集成。
- RocketMQ 是阿里开源的消息中间件,目前已经捐献个 Apache 基金会,它是由 Java 语言开发的,具备高吞吐量、高可用性、适合大规模分布式系统应用等特点,经历过双十一的洗礼,实力不容小觑。
- Pulsar 是 Apache 软件基金会的顶级项目,是下一代云原生分布式消息流平台,集消息、存储、轻量化函数式计算为一体,采用计算与存储分离架构设计,支持多租户、持久化存储、多机房跨区域数据复制,具有强一致性、高吞吐、低延时及高可扩展性等流数据存储特性。
4.选型考虑
- 功能:能否开箱即用;优先级队列;延迟队列;死信队列;消息重试;消息回溯;消息堆积 + 持久化;消息跟踪;消息过滤;消息顺序性;安全机制;消息幂等性;事务性消息等。
- 性能:时延;吞吐率等。
- 运维:高可用;异地容灾;集群扩容;使用成本等。
- 业务需求:要明确你的业务需要什么样的消息队列功能。例如,是否需要支持延时消息、死信队列、事务消息等高级功能,还是只需要基本的生产和消费功能。
- 数据量:考虑你的数据量是否大,是否需要高吞吐率和持久性。如果数据量较小,可以考虑使用非标准消息队列产品,如 Redis 或 MySQL,以减少复杂性和成本。
- 架构和性能需求:如果你的业务涉及大消息和大流量,需要考虑选择具有高吞吐率、高并发、持久性和稳定性的消息队列产品,如 Kafka 或 Pulsar。
- 云原生 和 Serverless 需求:随着云计算的发展,云原生和 Serverless 架构变得越来越重要。一些消息队列产品开始朝这个方向演进,因此你可能需要考虑是否需要与云原生或 Serverless 架构集成。
- 生态系统:考虑消息队列产品的生态系统和社区活跃度。一个活跃的生态系统通常会提供更多的支持和工具。
- 成本:最后,要考虑成本因素。不同的消息队列产品在许可费用、维护成本和学习成本方面有所不同,需要根据你的预算和资源来选择合适的产品。
5.Kafka vs RabbitMQ
5.1 二者架构
- Producer:生产者,负责将消息投递到 kafka 中。
- Consumer:消费者,通过拉的方式获取消息进行业务处理。
- Broker :一个独立的 Kafka 服务节点或实例,多个 Broker 组成 Kafka 集群。
- 主题(Topic):是一类消息的集合。
- 分区(Partition):每个主题被分成多个分区,每个 Partition 在存储层面是 Append Log 文件。
- 偏移量(Offset):消息在分区中的位置称为偏移量,它唯一标记分区内的一条消息。
- Producer:主要就是生成消息,通过信道(Channel),把消息发送给交换机(Exchange)。
- Consumer:监听 RabbitMQ 中的(Queue)队列中的消息,然后去消费。
- Queue:用于存储消息。
- Exchange:生产者将消息发送到 Exchange,由交换器将消息路由到一个或者多个队列中。
- Broker:可以将一个 RabbitMQ Broker 看作一台 RabbitMQ Server。
- RoutingKey :生产者将消息发给交换器的时候,一般会指定一个 RoutingKey,用来指定这个消息的路由规则。
- BindingKey:RabbitMQ 中通过绑定将交换器与队列关联起来,在绑定的时候一般会指定一个 BindingKey,这样 RabbitMQ 就知道如何正确地将消息路由到队列了。
5.2 消息的顺序
- 消息的顺序:对于同一笔订单来说,状态的变化都是有严格的先后顺序的。
- 吞吐量:如订单业务是希望订单越多越好。订单越多,吞吐量就越大。
- 为了实现发布订阅功能,从而使用的消息复制会降低性能并耗费更多资源;
- 多个消费者无法严格保证消息顺序;
- 大量的订单集中在一个队列,吞吐量受到了限制。
5.3 消息的匹配
5.4 消息的超时
rabbitmq delayed message exchange
插件能解决这个问题。 - 用了这个插件,我们在发送消息的时候,把消息发往一个特殊的 Exchange。
- 同时,在消息头里指定要延迟的时间。
- 收到消息的 Exchange 并不会立即把消息放到队列里,而是在消息延迟时间到达后,才会把消息放入。
5.5 消息的保持
5.6 消息的错误处理
5.7 消息的吞吐量
- 配置复杂、维护复杂
- 用好,用对存在门槛
6.总结
-
https://note.dolyw.com/mq/00-MQ-Select.html#_5-%E7%BC%BA%E7%82%B9
-
https://cloud.tencent.com/developer/article/1944357
-
https://mp.weixin.qq.com/s/G1NySYP7MdtO8HJ1uPs3Ag

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
openKylin 社区 SIG 突破 100!引领技术创新发展新阶段
近日,在openKylin社区全体单位会员、高校组织和开发者的共建下,社区SIG组已突破100个,覆盖了内核/硬件/架构/驱动、基础组件、桌面环境/设计、开发框架、系统安全、人工智能等多个技术方向,全面推动操作系统创新发展。 社区已成立的100个SIG中,50%以上长期保持活跃,为社区提供文档、代码合入、平台支撑、答疑解惑各维度的贡献。其中以UKUI、RISC-V、Input-method、SecurityGovernance、Kernel、Infrastructure、CompatWinApp、QT、QA、FAQ等为代表的20+个SIG组保持稳定输出,为社区的发展提供持续的生产力。以Wayland、KaiMing、KARE、Virtualization、UpdateManager等为代表的SIG组坚持前沿技术探索,为操作系统融入领先的技术成果。 截止目前,社区各SIG组累计在各仓库提交PR11244个,提交Issue8797个,组织召开SIG会议171次,其中提交PR贡献排名前30的情况如下: 01企业SIG创新成果 01 Intel主导成立Intel SIG,完成openKyli...
- 下一篇
Linux 基金会创建 Redis 分支:Valkey
Linux 基金会宣布创建了一个 Redis 的开源分支,名为 Valkey;基于 Redis 7.2.4 进行开发,并将保持该项目在 BSD-3-Clause 许可下的使用和发布。 “自 2009 年 Redis 项目成立以来,成千上万的开源开发人员为其发展和成功做出了巨大贡献......为了继续改进这项重要的技术,并允许不受限制地分发该项目,社区创建了 Valkey,这是一个开源的高性能键值存储。Valkey 支持 Linux、macOS、OpenBSD、NetBSD 和 FreeBSD 平台。此外,社区还将继续努力实现现有的路线图,包括更可靠的 slot migration、集群系统可扩展性和稳定性的大幅提升、多线程性能提升、触发器、新命令、向量搜索支持等新功能。” 目前,谷歌、AWS、甲骨文等公司均参与了该项目。Linux 基金会表示,Valkey 将遵循开放的治理模式,保持社区驱动并欢迎所有用户和贡献者。该项目已经组建了一个由几位前 Redis 贡献者组成的技术领导委员会,还获得了数百名社区成员的支持意愿。 前 Redis 维护者、Valkey 的共同创建者、AWS 首席工程...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Hadoop3单机部署,实现最简伪集群
- CentOS7安装Docker,走上虚拟化容器引擎之路
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS7设置SWAP分区,小内存服务器的救世主
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作