消息队列原理与实战 | 青训营笔记

115 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第15天。

0、重点

  • 消息队列
    • Kafka
    • BMQ
    • RocketMQ

1、消息队列

1.1 什么是消息队列

消息队列(MQ),指保存消息的一个容器,本质是一个队列。但这个队列需要支持高吞吐,高并发并且高可用

1.2 发展历程

image.png

业界消息队列对比

  • Kafka:分布式的、分区的、多副本的日志提交服务,在高吞吐场景下发挥较为出色
  • RocketMQ:低延迟、强一致、高性能、高可靠、万亿级容量和灵活的可扩展性,在一些实时场景中运用较广
  • Pulsar:是下一代云原生分布式消息流平台,集消息、存储、轻量化函数式计算为一体、采用存算分离的架构设计
  • BMQ:和Pulsar架构类似,存算分离,初期定位是承接高吞吐的离线业务场景,逐步替换掉对应的Kafka集群

2、Kafka

2.1 使用场景

  • 搜索服务
  • 直播服务
  • 订单服务
  • 支付服务

2.2 如何使用

graph TD
 创建集群  --> 新增topic --> 编写生产者逻辑 --> 编写消费者逻辑

2.3 基本概念

  • Topic

  • Cluster

  • Producer

  • Consumer

  • ConsumerGroup

  • Offset

    • 消息在partition内的相对位置信息,可理解为唯一ID,在partition内部严格递增
  • Replica

    • 每个分片有多个Replica,Leader Replica会从ISR中选出

2.4 数据复制

2.5 Kafka架构

D163E38E71030FBA921C685A80567691.jpg

ZooKeeper:负责存储集群元信息,包括分区分配信息等

2.6 思考

2.7 Producer

2.8 Broker

  • 消息文件结构

image.png

  • 磁盘结构

    • 移动磁头找到对应磁道,磁盘转动,找到对应扇区,最后写入。寻道成本比较高,因此顺序写可以减少寻道所带来的时间成本。

image.png

2.9 Consumer

上述可以帮助Kafka提高吞吐或者稳定性的功能有

  • Producer:批量发送、数据压缩
  • Broker:顺序写、消息索引、零拷贝
  • Consumer:Rebalance

Kafka问题总结

  • 运维成本高
  • 对于负载不均衡的场景,解决方案复杂
  • 没有自己的缓存,完全依赖Page Cache
  • Controller和Coordinator在同一进程中,大量IO会造成其性能下降

3、BMQ

3.1 BMQ文件结构

BD788025E45DA4BF26C82E2BB6A8E24A.png

3.2 Broker

  • 写文件流程

C146C83B3D0A91CE2FC67307A733119D.jpg

  • BMQ的架构模型(解决Kafka存在的问题)
  • BMQ读写流程(Failover机制,写入状态机)
  • BMQ高级特性(泳道、Databus、Mirror、Index、Parquet)

4、RocketMQ

4.1 基本概念

名称KafkaRocketMQ
逻辑队列TopicTopic
消息体MessageMessage
标签Tag
分区PartitionConsumerQueue
生产者ProducerProducer
生产者集群ProducerGroup
消费者ConsumerConsumer
消费者集群ConsumerGroupConsumerGroup
集群控制器ControllerNamesever

4.2 RocketMQ的高级特性

事物场景

事物消息

延迟发送

延迟消息

处理失败

消费重试和死信队列

  • RocketMQ的基本概念(Queue、Tag)
  • RocketMQ的底层原理(架构模型、存储模型)
  • RocketMQ的高级特性(事物消息、重试和死信队列、延迟队列)