Skip to content

消息队列有什么用?

  • 异步:请求后立刻返回,后续慢慢处理,如订单等复杂业务,后续通过邮件等进行通知。
  • 削峰/限流:短时间高并发请求放在消息队列中,慢慢消费,避免被打垮
  • 降低系统耦合性:业务拆分,每个模块实现自己的业务,通过消息队列联通。
  • 分布式事务:如 RocketMQ,允许将生产、消费、处理定义成一个原子操作。
  • 顺序保证:按顺序消费。
  • 延时/定期处理
  • 数据流处理:如日志、监控数据等。

使用消息队列会带来哪些问题?

  • 系统可用性降低:消息可能会丢失或者消息队列挂掉
  • 系统复杂性提高: 需要克服消息丢失、重复消费、消费顺序混乱等问题
  • 一致性问题: 需要保证消息正确消费。

分布式消息队列技术选型

常见的消息队列都支持持久化到磁盘。

比对

语言

  • Kafka:采用Scala语言开发
  • RabbitMQ:由Erlang语言开发(定制比较麻烦),但是比较适用于高并发,且延时较低(语言特性)
  • RocketMQ:采用Java语言开发(定制比较容易)

性能和可靠性

  • Kafka:吞吐量极高,使用了零拷贝
    • TPS可达百万条/秒
    • 支持同步和异步复制消息,但异步复制存在丢消息的可能。
    • 采用分布式架构,一个数据多个副本
    • 可能处在重复消费的问题(在大数据或者日志领域可以忽略)
  • RocketMQ:性能较高
    • 单机写入TPS单实例约7万条/秒
    • 采用分布式架构
    • 支持强一致性
  • RabbitMQ:性能稍逊于Kafka和RocketMQ
    • 可靠性较好,支持确认机制、事务、委托和备份交换器等机制。
    • 采用主从架构
    • 数据丢失的概率最低

正在精进