ITPub博客

首页 > 架构设计 > 数据架构 > rabbitmq和kafka的选型

rabbitmq和kafka的选型

原创 数据架构 作者:贺子_DBA时代 时间:2025-08-24 00:32:31 0 删除 编辑

一、rabbitmq的设计理念:

1、RabbitMQ主要设计用于消息的可靠传递和快速消费,而不是作为长期数据存储解决方案。它的核心功能是确保消息能够高效地从生产者传递到消费者,并在消息被消费后尽快释放资源。

2、高吞吐量与低延迟:基于Erlang的并发模型,单节点可处理数千至数万条消息/秒,集群模式下可线性扩展,满足高并发场景;

3、内存优先:RabbitMQ在处理消息时,优先将消息存储在内存中,以提高消息的处理速度。虽然支持消息持久化到磁盘,但主要目的是确保消息在系统故障时不会丢失,而不是为了长期存储。

4、可靠性保障:当业务对消息的可靠性要求极高,不能容忍消息丢失,RabbitMQ提供的消息持久化、事务机制、发布确认等特性能够确保消息在各种故障情况下不会丢失。rabbitmq 4.*基于raft协议,可靠性进一步提升。

5、顺序性保证:通常情况下,单个队列同一时间只允许一个消费者消费,虽然支持多个消费者同时连接到同一个队列,但消息会被逐个分发给不同的消费者(这样其实也有一定概率不是顺序的,除非使用单活消费者模式),而不是像Kafka那样多个消费者可以并行消费同一分区中的消息,所有如果业务要求消息按照发送顺序被消费,RabbitMQ在单个队列中能够保证消息的顺序性,适合对消息顺序有严格要求的场景。

6、实现消费者高可用:

单活消费者模式:RabbitMQ支持单活消费者模式(Single Active Consumer),在这种模式下,队列中可以注册多个消费者,但同一时间只允许一个消费者消费消息,其他消费者会处于待命状态,等待活跃消费者死亡或失去连接,然后RabbitMQ会自动将消费权转移到下一个可用的消费者。

非单活消费者模式:队列中的消息会被轮询分发给所有连接到该队列的消费者。每个消费者都可以同时消费消息。RabbitMQ会根据消费者的处理能力(通过basic.qos设置的预取值)将消息轮询分发给所有消费者。如果某个消费者死亡,RabbitMQ会将该消费者未处理的消息重新分配给其他消费者。所有消费者都积极参与消息的消费,没有消费者处于待命状态。每个消费者都有机会处理消息。

7、rabbitmq 交换机的设计理念:

由于rabbitmq没有像kafka那样,允许不同消费者组(业务)来消费同一个队列,如果有的两个业务都想消费同一个队列的消息,那么就可以选择不同的交换机来满足需求,例如选择Fanout Exchange类型的交换机,这样同一个消息,发送到多个队列中,然后不同的业务消费不同的队列。

RabbitMQ交换机的设计理念是基于AMQP协议,实现灵活的消息路由和分发。其工作原理是接收生产者发送的消息,并根据预设的路由规则将消息转发到一个或多个队列中。

二、kafka和rabbitmq的选型标准:

1、吞吐量:Kafka在处理大规模数据流时表现出色,单机环境下每秒可处理数十万条消息,分布式集群中吞吐量可达数百万条。RabbitMQ的吞吐量相对较低,通常在万级/秒。

2、消息顺序性:RabbitMQ在单个队列中能够保证消息的顺序性(通过使用单活消费者模式),适合对消息顺序有严格要求的场景。而Kafka通过分区机制,可以在分区级别保证消息的顺序;

3、延迟: Kafka的延迟通常在毫秒级别,适合对延迟要求不高的场景。RabbitMQ的延迟更低,可达到微秒级别,适合需要快速响应的业务;

4、集群与扩展:Kafka通过分区和副本机制实现负载均衡和并行处理,更友好的支持水平扩展,rabbitmq需要借助插件sharding来实现分片(Sharding 插件允许将消息分布到多个队列中,从而实现消息的并行处理,提高系统的吞吐量和响应速度),配置维护相对更复杂。

三、适用场景

RabbitMQ 更适合中小规模、对消息可靠性、顺序性要求高、需要复杂消息路由和灵活消费者模型的场景。

Kafka则更适合大规模、高吞吐量、需要消息持久化和长期存储、实时流处理和事件驱动架构、分布式系统和微服务架构的场景,以及对消息顺序性要求不高或可容忍一定程度顺序性问题的场景

1、优先选择Kafka的场景:

实时数据管道:如用户行为追踪、IoT传感器数据流等,需要处理高吞吐量的实时数据。

事件溯源:如金融交易审计、游戏状态回放等,需要长期存储和回放历史数据。

流处理集成:与Flink、Spark等流处理框架集成,进行实时计算。

2、优先选择RabbitMQ的场景:

任务队列:如异步发送邮件、生成报表等,需要可靠的消息传递和任务调度。

严格消息顺序:如股票交易订单处理、抢票等,需要在单个队列中保证消息的顺序。

微服务通信:服务间低延迟的RPC调用,需要快速响应

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29654823/viewspace-3094108/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
10年数据库管理员从业经历,熟悉Oracle、mysql、tidb、oceanbase、redis、 mongodb 、python等技术栈,持有11g ocm 、mysql 5.7 ocp 、tidb 5.0 ptcp、tidb 6.0 ptca、oceanbase obcp等

注册时间:2014-05-12

  • 博文量
    327
  • 访问量
    2149018