跳转至

消息队列

RabbitMQ、RocketMQ、Kakfa 对比

  • 功能特性
    • RabbitMQ:支持多种消息协议,如 AMQP、STOMP 等,以可靠性和灵活性著称,适用于对消息可靠性要求高、业务逻辑复杂的场景。
    • RocketMQ:具有高吞吐量、高可用性和低延迟的特点,支持分布式事务消息和顺序消息,在电商、金融等领域应用广泛。
    • Kafka:以高吞吐量和可扩展性为核心优势,主要用于处理大规模的实时数据,如日志收集、实时流计算等场景。
  • 性能
    • RabbitMQ:在消息吞吐量上相对较低,但能保证消息的可靠传递和事务性。
    • RocketMQ:性能较高,能处理大量的消息,延迟较低。
    • Kafka:吞吐量极高,能轻松处理每秒数十万甚至数百万条消息,适合处理大数据量的实时消息。
  • 应用场景
    • RabbitMQ:常用于企业级应用中,如订单系统、库存系统等,对消息的可靠性和准确性要求较高。
    • RocketMQ:适用于分布式系统中的异步消息处理、订单处理、消息通知等场景。
    • Kafka:常用于日志收集、实时数据处理、流计算等场景,如电商网站的用户行为日志收集、金融系统的实时交易数据处理等。

RabbitMQ 如何解决数据积压问题

  • 增加消费者数量:通过增加消费者实例,提高消息的消费速度,从而减少积压。
  • 优化消费逻辑:检查消费端的业务逻辑,减少不必要的处理时间,提高消费效率。
  • 提高 RabbitMQ 性能:可以通过增加服务器资源,如内存、CPU 等,优化 RabbitMQ 的配置参数,提高其处理能力。
  • 消息持久化:确保消息在队列中不会丢失,即使 RabbitMQ 服务器重启或崩溃,也能保证数据的可靠性。

RabbitMQ 怎么保证消息可靠

  • 消息持久化:将消息持久化到磁盘,确保在服务器重启或故障时消息不丢失。
  • 确认机制:生产者发送消息后,通过等待 RabbitMQ 的确认回执,确保消息已被正确接收。消费者在处理完消息后,也向 RabbitMQ 发送确认消息,防止消息被重复消费。
  • 事务机制:在生产者发送消息和消费者接收消息时,可以使用事务来确保操作的原子性,避免部分消息丢失或处理不一致的情况。

说说 RabbitMQ 延迟队列

概念

RabbitMQ 延迟队列是一种能够实现消息延迟消费的队列。在实际业务场景中,经常会有需要在一段时间后才处理消息的需求,比如订单超时未支付自动取消、定时提醒等,延迟队列就可以很好地解决这类问题。

实现方式

  • TTL + DLX:TTL(Time-To-Live)即消息的存活时间,可给消息或队列设置 TTL。DLX(Dead Letter Exchange)即死信交换器,当消息过期、队列达到最大长度、消息被拒绝且不重新入队时,消息会成为死信并被发送到 DLX。结合 TTL 和 DLX 就能实现延迟队列。例如,给队列设置 TTL,当消息在队列中存活时间超过 TTL 后,消息会被发送到绑定的 DLX,进而被路由到相应的队列进行消费。
  • 插件实现:RabbitMQ 有一些插件可以直接支持延迟队列功能,如 rabbitmq_delayed_message_exchange 插件。该插件允许在发送消息时指定消息的延迟时间,当延迟时间到达后,消息才会被投递到队列中供消费者消费。

优缺点

  • 优点:实现简单,能满足大多数延迟消息处理需求;基于成熟的消息队列,具有高可靠性和稳定性。
  • 缺点:TTL + DLX 方式下,如果队列中有大量消息且前面的消息 TTL 较长,后面的消息即使 TTL 较短也需等待前面的消息过期,可能会导致延迟不准确;插件方式需要额外安装和配置插件,增加了系统的复杂度。

RabbitMQ的队列类型

  • 简单队列:这是最基础的队列类型,消息生产者将消息发送到队列,消费者从队列中按顺序获取消息进行处理。
  • 工作队列:也叫任务队列,多个消费者可以同时从一个队列中获取消息并进行处理,适用于将耗时任务分配给多个工作者处理的场景,能提高任务处理的并发能力。
  • 发布/订阅队列:消息生产者将消息发送到交换机,交换机将消息广播到所有绑定的队列,每个绑定到该交换机的队列都会收到完整的消息副本,适用于需要将消息同时通知多个不同消费者的场景。
  • 路由队列:消息生产者将消息发送到交换机时,会附带一个路由键,交换机根据路由键将消息路由到与之匹配的队列。只有绑定到交换机且路由键匹配的队列才能接收到消息,这种队列类型可以实现更精准的消息路由。
  • 主题队列:类似于路由队列,但路由键的匹配规则更加灵活,支持通配符模式。可以根据消息的主题进行更灵活的路由,适用于需要根据不同主题进行消息分发的场景。

RocketMQ的队列类型

  • 普通队列:消息按照先进先出的顺序在队列中存储和被消费,是RocketMQ中最常用的队列类型,适用于大多数对消息顺序性有要求的场景。
  • 延迟队列:支持消息在指定的延迟时间后才被消费。RocketMQ通过将延迟消息发送到特定的延迟队列,并根据延迟时间进行排序和投递,实现延迟消费的功能。
  • 事务性队列:用于支持分布式事务场景。消息生产者在发送消息时,可以将消息的发送与本地事务进行绑定,确保消息的发送和本地事务的执行要么都成功,要么都失败,从而保证数据的一致性。

RabbitMQ和RocketMQ的区别

  • 功能特性
    • RabbitMQ支持多种队列类型和灵活的路由机制,适用于各种复杂的消息路由场景。同时,它在消息可靠性方面有完善的机制,如消息确认、持久化等。
    • RocketMQ具有高吞吐量、低延迟的特点,尤其在大规模分布式系统中表现出色。它还支持分布式事务、顺序消息等高级特性,适用于对消息处理性能和一致性要求较高的场景。
  • 性能
    • RabbitMQ在处理大量小消息时表现较好,但在高并发、大吞吐量场景下性能相对RocketMQ略逊一筹。
    • RocketMQ经过优化,能够在高并发环境下提供非常高的吞吐量和较低的延迟,适合处理大规模的消息队列场景,如电商系统中的订单消息处理、物流系统中的物流信息推送等。
  • 社区生态与应用场景
    • RabbitMQ社区成熟,有丰富的插件和工具,在中小企业的各种业务场景中广泛应用,如金融领域的交易通知、电商系统的库存管理等。
    • RocketMQ是阿里巴巴开源的,在国内互联网公司中应用广泛,特别是在大规模分布式电商、金融科技等领域,如阿里巴巴的双十一购物节等大型活动中,RocketMQ能够稳定地处理海量的消息。
  • 部署与运维
    • RabbitMQ的部署相对简单,单机模式和集群模式都比较容易搭建和配置。但在大规模集群部署时,运维复杂度会有所增加。
    • RocketMQ的部署和运维相对复杂,需要考虑多个组件的协调运行,如NameServer、Broker等。但它提供了一些运维工具和监控指标,有助于对集群进行管理和监控。

MQ 的应用场景

MQ(消息队列)是一种应用间的通信方式,主要用于解耦、异步和削峰,以下是一些常见的应用场景:

  • 电商系统
    • 订单处理:用户下单后,订单系统可以将订单信息发送到MQ队列。库存系统、物流系统、支付系统等作为消费者从队列中获取订单信息,各自进行相应的处理,如扣减库存、安排物流配送、处理支付等。这样可以避免各个系统之间的直接耦合,提高系统的可扩展性和稳定性。例如,当库存系统出现故障时,订单系统仍然可以正常接收订单,将订单信息存入MQ,待库存系统恢复后再进行处理,不会影响整个下单流程。
    • 异步通知:用户完成支付后,系统可以通过MQ异步地向用户发送支付成功通知、订单发货通知等。这样可以提高系统的响应速度,让用户感觉操作更流畅,同时也减轻了主业务系统的负担。例如,电商系统可以将通知消息发送到MQ,由专门的通知服务从MQ中获取消息并发送短信或推送通知给用户,而无需在支付成功的业务逻辑中直接发送通知,避免因通知发送失败而影响支付流程的正常结束。
  • 社交媒体系统
    • 用户行为处理:当用户发布一条动态、点赞、评论或关注其他用户时,相关的行为数据可以发送到MQ。然后,不同的系统组件可以从MQ中获取这些数据进行处理,如更新用户动态列表、计算用户活跃度、推荐相关内容等。以用户发布动态为例,发布动态的请求将动态信息发送到MQ后,动态展示系统、搜索系统等可以同时从MQ获取该信息,分别进行更新展示和索引等操作,实现不同功能模块之间的解耦和异步处理。
    • 消息推送:当用户收到新的消息、好友请求或系统通知时,消息推送系统可以从MQ中获取相关信息,并推送给用户。通过MQ可以实现消息的异步推送,提高系统的性能和可靠性。例如,当有大量用户同时在线时,消息推送系统可以从MQ中按照一定的策略获取消息并推送给用户,避免因同时处理大量推送请求而导致系统崩溃。
  • 金融系统
    • 交易处理:在金融系统中,如银行转账、证券交易等场景,MQ可以用于处理交易请求。当用户发起一笔转账交易时,交易请求可以先发送到MQ队列,然后由后台的交易处理系统从队列中获取请求进行处理,包括验证账户信息、扣减余额、增加对方账户余额等操作。这样可以实现交易请求的异步处理,提高系统的处理能力和响应速度,同时保证交易的可靠性和一致性。
    • 风险监控:金融系统需要实时监控各种交易数据和用户行为数据,以进行风险评估和预警。通过将相关数据发送到MQ,风险监控系统可以从MQ中获取数据并进行分析,及时发现异常交易和风险事件。例如,当用户的交易行为出现异常时,如大额频繁交易、异地登录交易等,相关数据会被发送到MQ,风险监控系统从MQ中获取这些数据后,通过分析模型进行判断,若发现风险,则及时发出预警信息,以便工作人员进行处理。