四种消息队列,如何选型?

最近发现很多号主发消息队列的文章,质量参差不齐,相关文章我之前也写过,建议直接看这篇 。
这篇文章,主要讲述 Kafka、RabbitMQ、RocketMQ 和 ActiveMQ 这 4 种消息队列的异同,无论是面试 , 还是用于技术选型,都有非常强的参考价值 。
不 BB,上文章目录:

四种消息队列,如何选型?

文章插图
图片
01 消息队列基础1.1 什么是消息队列?消息队列是在消息的传输过程中保存消息的容器 , 用于接收消息并以文件的方式存储,一个消息队列可以被一个也可以被多个消费者消费,包含以下 3 元素:
  • Producer:消息生产者,负责产生和发送消息到 Broker;
  • Broker:消息处理中心 , 负责消息存储、确认、重试等,一般其中会包含多个 Queue;
  • Consumer:消息消费者,负责从 Broker 中获取消息,并进行相应处理 。

四种消息队列,如何选型?

文章插图
图片
1.2 消息队列模式
  • 点对点模式:多个生产者可以向同一个消息队列发送消息,一个具体的消息只能由一个消费者消费 。

四种消息队列,如何选型?

文章插图
图片
  • 发布/订阅模式:单个消息可以被多个订阅者并发的获取和处理 。

四种消息队列,如何选型?

文章插图
图片
1.3 消息队列应用场景
  • 应用解耦:消息队列减少了服务之间的耦合性,不同的服务可以通过消息队列进行通信,而不用关心彼此的实现细节 。
  • 异步处理:消息队列本身是异步的,它允许接收者在消息发送很长时间后再取回消息 。
  • 流量削锋:当上下游系统处理能力存在差距的时候,利用消息队列做一个通用的”载体”,在下游有能力处理的时候,再进行分发与处理 。
  • 日志处理:日志处理是指将消息队列用在日志处理中,比如 Kafka 的应用,解决大量日志传输的问题 。
  • 消息通讯:消息队列一般都内置了高效的通信机制 , 因此也可以用在纯的消息通讯 , 比如实现点对点消息队列,或者聊天室等 。
  • 消息广播:如果没有消息队列,每当一个新的业务方接入,我们都要接入一次新接口 。有了消息队列,我们只需要关心消息是否送达了队列 , 至于谁希望订阅 , 是下游的事情 , 无疑极大地减少了开发和联调的工作量 。
02 常用消息队列由于官方社区现在对 ActiveMQ 5.x 维护越来越少,较少在大规模吞吐的场景中使用,所以我们主要讲解 Kafka、RabbitMQ 和 RocketMQ 。
2.1 KafkaApache Kafka 最初由 LinkedIn 公司基于独特的设计实现为一个分布式的提交日志系统,之后成为 Apache 项目的一部分,号称大数据的杀手锏,在数据采集、传输、存储的过程中发挥着举足轻重的作用 。
它是一个分布式的,支持多分区、多副本,基于 Zookeeper 的分布式消息流平台,它同时也是一款开源的基于发布订阅模式的消息引擎系统 。
重要概念