消息队列初探| 青训营笔记

68 阅读2分钟

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

Kafka

BMQ

RocketMQ

0.消息队列是什么

  • 解耦
  • 削峰
  • 异步
  • 日志处理

0.1 当前主流产品

Kafka:分布式的、分区的、多副本的日志提交服务,在高吞吐场景下发挥较为出色

RocketMQ:低延迟、强一致、高性能、高可靠、万亿级容量和灵活的可扩展性,在一些实时场景中运用较广

Pulsar:是下一代云原生分布式消息流平台,集消息、存储、轻量化函数式计算为一体、采用存算分离的架构设计(本笔记未涉及)

BMQ:和Pulsar架构类似,存算分离,初期定位是承接高吞吐的离线业务场景,逐步替换掉对应的Kafka集群

1. 消息队列-Kafka

创建集群-新增topic-编写生产者逻辑-编写消费者程序 kafka使用场景,业务日志、用户行为数据、Metrics数据

1.1 基本概念

  • Cluster 物理集群
  • Topic 逻辑队列
  • Partition,单个topic可有多个分片并发处理,提高吞吐
  • Offset 消息在partition内部的相对位置信息,严格递增且唯一
  • replica 分片的副本,分布在不同的机器可用于容灾 分为leader(从ISR同步副本中选出)和follower,有效数据恢复
  • Zookeeper,存储集群元信息,包括分区分配信息等

1.2 一条消息从生产到消费是如何处理的

  • Producer端逻辑:批量发送 数据压缩

  • Broker端逻辑

    • 存储 topic-partition-replica-log-logSegment(.log+.timeIndex+.index)
    • 磁盘: 磁头-磁道-扇区
    • 顺序写,方便寻道
    • 消息索引
    • 零拷贝:
  • Consumer端逻辑

    • 手动分配low level
    • 自动分配high level 分片分rebalance

1.3 问题

  • 重启/替换/扩容/缩容,运维成本高
  • 负载不均衡时 解决方案复杂
  • 没有自己的缓存,只依赖page cache
  • controller/coordinator/broker在同一进程中,大量IO导致性能下降

2.消息队列-BMQ

存算分离,云原生消息队列

Producer、Consumer、Proxy、Broker、HDFS、controller、coordinator、meta

读写机制

  • Failover机制,写入状态机

高级特性

  • 泳道/databus/mirror/parquet/index

3.消息队列-RocketMQ

Partion->quene

高级特性:事务消息/ 重试和死信队列/延迟队列