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

67 阅读2分钟

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

什么是消息队列

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

Kafka

使用场景

  • 业务日志
  • Metrics数据
  • 用户行为数据

基本概念

  • Topic:逻辑队列,不同Topic可以建立不同的Topic
  • Cluster:物理集群,每个集群中可以建立多个不同的Topic
  • Producer:生产者,负责将业务消息发送到Topic中
  • Consumer:消费者,负责消费Topic中的消息
  • ConsumerGroup:消费者组,不同组Consumer消费进度互不干涉
  • Partition:通常Topic会有多个分片,不同分片之间消息的消息可以并发处理,以提高单个Topic的吞吐
  • Offset:消息在Partition内的相对位置信息,可以理解为唯一ID,在Partition内部严格递增
  • Replica:分片的副本,分布在不同的机器上,可用来容灾。每个分片有多个Replica,Leader Replica将会从ISR中选出。Leader对外服务,Follower异步去拉取Leader的数据进行同步,如果Leader挂掉,可以将Follower提升为Leader来对外进行服务
  • ISR(In-Sync Replicas):同步中的副本。对于Follower来说,始终和Leader有一定差异,当差距较小时,可以将这个Follower副本加入到ISR中,不在ISR中的副本是不允许提升成Leader的

Producer行为

  • 批量发送
  • 数据压缩

Broker行为

  • 顺序写
  • 偏移量索引文件
  • 时间戳索引文件
  • 零拷贝

Consumer行为

  • 手动分配
  • 自动分配
  • Rebalance

Kafka问题总结

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

BMQ

BMQ兼容Kafka协议,存算分离,云原生消息队列

读写流程

  • Failover机制
  • 写入状态机

高级特性

  • 泳道
  • Databus
  • Mirror
  • Index
  • Parquet

RocketMQ

高级特性

  • 事务消息
  • 重试和死信队列
  • 延迟队列