走进消息队列|青训营笔记

136 阅读4分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第16篇笔记

  • 背景
    • 场景
      • 系统崩溃
      • 服务处理能力有限
      • 链路耗时长尾
      • 日志如何处理
    • 解决方案
      • 解耦
      • 削峰
      • 异步
  • 消息队列
    • 保存消息的一个容器,本质是个队列,需要支持高吞吐,高并发,高可用
    • 常用消息队列
      • Kafka
        • 分布式的、分区的、多副本的日志提交服务,在高吞吐场景下发挥较为出色
      • RocketMQ
        • 低延迟、强一致、高性能、高可靠、万亿级容量和灵活的可扩展性,在一些实时场景中运用较广
      • Pulsar
        • 下一代云原生分布式消息流平台,集消息、存储、轻量化函数式计算为一体,采用存算分离的架构设计
      • BMQ
        • 和Pulsar架构类似,存算分离,初期定位是承接高吞吐的离线业务场景,逐步替换掉对应的Kafka集群
  • Kafka
    • 基本概念
      • Topic
        • 逻辑队列,不同Topic可以建立不同的partition
      • Cluster
        • 物理集群,每个集群中可以建立多个不同的Topic
      • Producer
        • 生产者,负责将业务消息发送到Topic中
      • Consumer
        • 消费者,负责消费Topic中的消息
      • ConsumerGroup
        • 消费者组,不同组Consumer消费进度互不干涉
      • Offset
        • 消息在partition内的相对位置信息,可以理解为唯一ID,在partition内部严格递增
      • Replica
        • 每个分片有多个Replica(副本),Leader Replica将会从ISR(In-Sync Replicas)中选出
    • 架构
      • ZooKeeper
        • 负责存储集群元信息,包括分区分配信息
      • Producer
        • 批量发送
          • 可以减少IO次数,从而加强发送能力
        • 数据压缩
          • 通过压缩,减少消息大小,目前支持Snappy,Gzip,LZ4,ZSTD压缩算法
      • Broker-数据存储
        • 消息文件结构
          • Topic-Partition-Replica-Log-LogSegment
            • .log 日志文件
            • .index 偏移量索引文件
            • .timeindex 时间戳索引文件
            • 其他文件
        • 磁盘结构
          • 移动磁头找到对应磁道,磁盘转动,找到对应扇区,最后写入,寻道成本比较高,因此顺序写可以减少寻道所带来的时间成本
        • 顺序写
          • 采用顺序写的方式进行写入,提高写入效率
      • Broker-找到消息
        • Consumer通过发送FetchRequest请求消息数据,Broker将会指定Offset处的消息,按照时间窗口和消息大小窗口发送给Consumer
        • 偏移量索引文件
          • 二分找到小于目标offset的最大文件
          • 二分找到小于目标offset的最大索引位置
        • 时间戳索引文件
          • 二分找到小于目标时间戳最大的索引位置,在通过寻找offset的方式找到最终数据
      • Broker-零拷贝
        • 不需要从内核态转换到用户态
      • Consumer
        • 消息的接收
          • Low Level
            • 通过手动进行分配,哪一个Consumer消费哪一个Partition完全由业务来决定
            • 缺点
              • 不能容灾
          • High Level
            • 选取一个broker当coordinator协调者
          • Consumer Rebalance
    • 帮助kafka提高稳定性的功能
      • Producer
        • 批量发送
        • 数据压缩
      • Broker
        • 顺序写
        • 消息索引
        • 零拷贝
      • Consumer
        • Rebalance
    • 问题总结
      • 运维成本高
      • 对于负载不均衡的场景,解决方案复杂
      • 没有自己的缓存,完全依赖Page Cache
      • Controller和Coordinator和Broker在同一进程中,大量IO会造成其性能下降
  • BMQ
    • 兼容Kafka协议,存算分离,云原生消息队列
    • HDFS写文件流程
      • 随机选择一定数量的DataNode进行写入
    • Broker-Partition状态机
      • 保证对于任意分片在同一时刻只能在一个Broker上存活
    • Broker
      • 写文件Failover
        • 如果DataNode节点挂了或者是其他原因导致写文件失败,随机选择另一可用节点写入
    • 泳道消息
      • 解决主干泳道流量隔离问题以及泳道资源重复创建问题
    • Databus
      • 简化消息队列客户端复杂度
      • 解耦业务与Topic
      • 缓解集群压力,提高吞吐
    • Mirror
      • 解决跨域读写
    • Index
      • 在BMQ中将数据结构化,配置索引DDL,异步构建索引后,通过Index Query服务读出数据
    • Parquet
      • 在BMQ中将数据结构化,通过Parquet Engine,可以使用不同方式构建Parquet格式文件
  • RocketMQ
    • 高级特性
      • 事务场景
      • 延迟发送
      • 消费重试和死信队列