消息队列 | 青训营笔记

111 阅读2分钟
  • Kafka 1684584623224.png

    1. 基本概念 1684584506490.png
      • Topic:逻辑队列,每个Topic可以建立不同的Partition
      • Cluster:物理集群,每个集群中可以建立多个不同的Topic
      • Producer:生产者,负责将业务消息发送到Topic中
      • Consumer:消费者,负责消费Topic中的消息
      • ConsumerGroup:消费者组,不同组Consumer消费进度互不干涉
      • Offset:消息在partition内的相对位置信息,ID,严格递增 1684584396090.png
      • Replica:每个分片有多个Replica副本,一个Leader多个Follower 1684584573359.png
    2. Producer
      • 批量发送:减少IO次数,提高吞吐量 1684584782736.png
      • 数据压缩:减少消息大小,支持Snappy、Gzip、LZ4、ZSTD压缩算法 1684584835643.png
    3. Broker
      • 消息文件结构 1684584882153.png
      • 磁盘结构:顺序写减少寻道时间
      • 偏移量/时间戳索引文件:二分法查找 1684584928462.png image.png
      • 零拷贝技术 1684585149878.png
    4. Consumer
      • Low Level(手动分配):线上业务决定哪个Consumer消费哪个Partition 1684585649966.png
      • High Level(自动分配):Coordinator(协调者)实现Rebalance 1684585690040.png
    5. 缺点
      • 运维成本高
      • 对于负载不均衡的场景,解决方案复杂
      • 没有自己的缓存,完全依赖Page Cache
      • Controller、Coordinator和Broker在同一进程中,大量IO会造成性能下降
  • BMQ

    1. 定义:兼容Kafka协议,存算分离,云原生消息队列 1684585690040.png

      Producer -> Consumer -> Proxy -> Broker -> HDFS -> Controller -> Coordinator -> Meta(ZooKeeper)

    2. HDFS写文件流程:随机选择一定数量的DataNode进行写入 1684585984913.png

    3. Broker

      • Partition状态机:保证对于任意分片在同一时刻只能在一个Broker上存活 1684586031589.png
      • 写文件流程 1684586122181.png
      • 写文件Failover:如果某个DataNode节点挂了或其他原因导致写文件失败,则重新找正常的节点创建新的文件进行写入
    4. Proxy 1684586152012.png

    5. 多机房部署(高可用) 1684586176684.png

    6. 高级特性:泳道、Databus、Mirror、Index、Parquet

      1. 泳道消息

        • 开发流程:开发 -> BOE -> PPE -> Prod
        • BOE:Bytedance Offline Environment,一套完全独立的线下机房环境
        • PPE:Product Preview Environment,产品预览环境
      2. Databus 1684586662264.png

        • 简化消息队列客户端复杂度
        • 解耦业务与Topic
        • 缓解集群压力,提高吞吐
      3. Mirror 1684586704472.png

        通过最终一致的方式,解决跨Region读写问题。

      4. Index 1684586760356.png

        问题:只能Query By Offset or Timestamp,如何实现通过写入的其他字段进行查询?

        方案:直接在BMQ中将数据结构化,配置索引DDL,异步构建索引后,通过Index Query服务读出数据

      5. Parquet——新型列式存储格式 1684586787218.png

        方案:直接在BMQ中将数据结构化,通过Parquet Engine,可以使用不同的方式构建Parquet格式文件

  • RocketMQ

    1. 场景:电商业务线、业务峰值时刻(秒杀活动、周年庆)

    2. 架构 1684586855395.png 1684586879626.png

    3. 存储模型 1684586903444.png

      ConsumerQueue存储的并不是真实的数据,只是这个Queue所有消息在CommitLog上面的的位置(索引),真实数据在CommitLog中

    4. 高级特性:事务消息、消费重试和死信队列、延迟队列

      1. 事务消息 1684586936244.png
      2. 消费重试和死信队列 1684586992417.png
      3. 延迟队列 1684586966267.png