Skip to content

消息队列技术

消息队列是异步通信的基础设施,用于解耦系统组件、提高系统的可扩展性和可靠性。

  • 消费者:向消息队列投递消息的是生产者

  • 生产者:消费消息的是消费者

  • 队列模型:

    • 队列模型:所有的消息放在一个先进先出的队列中,如果想要多个消费者消费同一个消息,需要复制
    • 主题模型(发布订阅模型):类似于观察者模式
      • 生产者成为发布者,消费者成为订阅者,存放消息的成为主题,消费者发送消息到特定主题,消费者订阅特定主题处理消息
  • Queue:

    • RabbitMQ:队列,类似于链表的进程,按照消息进入到先后顺序存放消息
    • RocketMQ:类似于 Kafka 的 Partition,不过 RocketMQ 在队列中只存放偏移,实际消息放在 commitlog 上,需要两次读取,但是全部顺序读写,性能也不差

RabbitMQ

  • Exchange:交换器,类似于 APIGW,生产者生产的消息通过这个分发到对应的 Queue,可以通过类似正则的方式绑定想要分发到 Queue,这个绑定关系称为元数据
  • 优先级队列:一个最小堆,投递消息时,为消息标上优先级,消费者总是先消费高优先级的消息

Kafka

  • Topic:消息的分类,不同的类别的消息分别生产和消费,一个 topic 一个队列
  • Partition:将单个队列拆分成多段,每段就是一个 partition,类似于 mysql 的水平分表,还可以分库,将不同的 partition 放在不同的机器
    • 底层通过多个 segment 存放消息,单个 segment 内部是顺序读写,多个之间是随机读写,有性能瓶颈
  • broker:
    • kafka/RabbitMQ:多个 partition 的集合,一个 broker 包含一个队列的部分 partition
    • rabbitMQ:多个 Queue+1 个 Exchange 的集合
  • replicas:partition 的副本,分为 leader 和 follower,保证高可用,不同的 replicas 放在不同的 broker 上
  • retention policy:消息持久化的保留策略,比如超过多长时间进行清理
  • consumer group:消费组,多个消费者分成多个组,不同的组维护自己的消费进度,互不打搅
  • ZooKeeper:通用的分布式协调服务,可以用作服务注册和发现,还可以用于分布式锁、配置管理等场景

RocketMQ

  • nameserver:ZooKeeper 的轻量化实现

功能:

  • 异步:对于一些不那么重要比如短信的推送,或者耗时很长比如一些数据的下载、构建,可以先对用户的请求立刻返回,这些业务异步进行(总耗时基本不变,但是用户的等待变短)
    • 业界用的比较多的同步通信是 Dubbo(一个 RPC 框架)
  • 解耦:主业务不去关心一些下游的业务如认证、消息推送,只要管好自己的业务,每个需要依赖更加宽松。
  • 削峰填谷:避免上游流量忽高忽低导致服务不可用
  • 降低系统耦合:系统过大,拆解组件
  • 保护服务:如秒杀活动

副作用:

  • 复杂度提高:需要额外维护一个高可用的消息队列服务
  • 消息重复消费、投递问题
  • 消息的顺序消费问题
  • 分布式事务问题
  • 消息堆积问题

📋 主要技术

Kafka

  • 定位:高吞吐量分布式流处理平台
  • 特点:支持大规模数据流处理,具备优秀的性能和可扩展性
  • 适用场景:大数据处理、实时流计算、日志收集

RabbitMQ

  • 定位:功能丰富的消息代理
  • 特点:支持多种消息协议,提供丰富的路由功能
  • 适用场景:企业应用集成、复杂路由需求、事务消息

RocketMQ

  • 定位:阿里巴巴开源的分布式消息中间件
  • 特点:支持事务消息、顺序消息、定时消息
  • 适用场景:电商业务、金融支付、订单处理

🎯 核心概念

消息模型

  • 点对点模式(Queue):一对一消息传递
  • 发布订阅模式(Topic):一对多消息广播
  • 消息分区:提高并发处理能力
  • 消费者组:实现负载均衡和故障转移

可靠性保证

  • 消息持久化:防止消息丢失
  • 消息确认机制:确保消息被成功处理
  • 重试机制:处理失败消息的重新投递
  • 死信队列:处理无法消费的消息

性能优化

  • 批量处理:提高吞吐量
  • 异步处理:减少响应时间
  • 消息压缩:减少网络传输开销
  • 分区策略:优化负载分布

💡 面试要点

技术选型

  • 不同MQ的技术特点和适用场景对比
  • 如何根据业务需求选择合适的消息队列
  • 性能、可靠性、复杂度的权衡

架构设计

  • 消息队列在微服务架构中的作用
  • 如何设计高可用的消息系统
  • 消息顺序性和幂等性的保证

实战经验

  • 大流量场景下的性能调优
  • 常见问题的排查和解决
  • 监控和运维的最佳实践

🔍 深入学习

  • 消息语义:至少一次、至多一次、恰好一次
  • 一致性模型:最终一致性、强一致性
  • 分布式事务:基于消息的分布式事务实现
  • 流处理:实时数据处理和分析

正在精进