您现在的位置是:网站首页 > 心得笔记
Kafka、RabbitMQ、RocketMQ选型问题
Kafka是一个基于zookeeper的高吞吐量,低延迟的分布式发布与消息订阅系统。它可以实时处理大量消息数据以满足各种需求。即便使用非常简单的硬件,Kafka也可以每秒处理数百万条消息,其延迟最低只有几毫秒。
Kafka的消息传递流程
生产者将消息发送给Kafka集群
Kafka集群将消息转发给消费者
举生活中放鸡蛋例子说明
生产者生产鸡蛋,消费者消费鸡蛋。假设消费者消费鸡蛋时噎住了(系统宕机了),而生产者还在生产鸡蛋,那么新生产的鸡蛋就丢失了; 再比如,生产者1秒生产100个鸡蛋(大交易量的情况),而消费者1秒只能消费50个鸡蛋,那么过不了多长时间,消费者就“吃不消”了 (消息堵塞,最终导致系统超时),导致鸡蛋又丢失了。此时,我们放1个篮子在生产者与消费者中间,生产者生产出来的鸡蛋都放到篮子里, 消费者去篮子里拿鸡蛋,这样鸡蛋就不会丢失了,这个篮子就相当于Kafka。
上述例子中的鸡蛋则相当于Kafka中的消息(Message);篮子相当于存放消息的消息队列,也就是Kafka集群;当篮子满了,鸡蛋放不下时,再加几个篮子,就是Kafka集群扩容。
RabbitMQ是一个开源的消息代理和消息队列系统,用于在分布式系统中传递消息。它是用 Erlang 语言编写的,专为高可用和多协议支持设计,非常适合在电商系统中使用。
Rabbit MQ的核心组件
生产者Producer
交换器(Exchange)
队列(Queue)
消费者(Consumer)
绑定(Binding)
通过这些组件,RabbitMQ能够实现消息的创建、路由、存储和处理。
RabbitMQ的工作流程如下
(1)生产者发送消息。生产者创建消息并将其发送到指定的交换器,同时指定一个路由键。例如,当用户下单后,下单服务(生产者)会生成一条订单消息,并将其发送到RabbitMQ的交换器。
(2)交换器路由消息。交换器收到消息后,根据路由键(例如order.created)和绑定规则决定将消息发送到哪个队列。如果匹配多个队列,则消息会被复制并发送到每个匹配的队列,例如订单处理队列和库存更新队列。
(3)队列存储消息。消息到达队列后,会被存储在队列中,等待消费者处理。如果队列没有消费者,则消息会一直保存在队列中,直到有消费者连接并处理消息。例如,订单处理队列和库存更新队列分别存储这条订单消息,等待相应的消费者进行处理。
(4)消费者处理消息。消费者连接队列,获取消息并进行处理。处理完成后,消费者会向RabbitMQ发送确认信息,表示消息已经被成功处理。RabbitMQ会将消息从消息队列中删除,确保消息不被重复处理。例如,订单处理服务(消费者)从订单处理队列中获取消息,更新订单状态并生成发货单;
RocketMQ是一个开源的分布式消息中间件,专为高吞吐量、低延迟和高可靠性的场景设计。它支持多种消息通信模式,包括发布/订阅、点对点、延时消息和事务消息等,能够满足不同场景下的业务需求。
RocketMQ广泛应用于金融、电商、物流、大数据等领域,帮助企业构建高效、稳定的分布式系统。
RocketMQ消息通信模式1——发布/订阅模式
RocketMQ的发布/订阅模式是一种消息通信模式,使得消息的生产者(发布者)不直接发送消息给特定的消费者(订阅者),而是通过一个中间件——Broker。在这个模式下,生产者发布消息到Broker的特定主题上,而消费者则向Broker订阅感兴趣的主题。当Broker收到消息后,它负责将消息推送给订阅了该主题的所有消费者。
发布订阅模式工作流程如下
(1)生产者发送消息。生产者发布消息到broker的特定主题上
(2)消费者向broker订阅感兴趣的主题
(3)当broker收到消息后,它负责将消息推送给订阅了该主题的所有消费者
RocketMQ消息通信模式2——点对点模式
RocketMQ的点对点(Point-to-Point,P2P)模式,也称为队列模式(Queue Model),是一种简单的消息通信模式。在这种模式下,消息被发送到一个队列,每条消息只能被一个消费者接收和处理。这意味着,即使有多个消费者订阅了同一个队列,一条消息也只会被其中一个消费者消费。
总结
如果需要高吞吐量和实时数据处理,Kafka是一个很好的选择;如果需要传统的消息队列功能和易用性,RabbitMQ是一个不错的选择;如果需要高可用和事务消息支持,则可以考虑RocketMQ。