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

114 阅读3分钟

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

介绍

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

Kafka

  • 使用场景:搜索、直播、订单、支付 -> 日志、Metrics数据、用户行为
  • 使用:创建集群,新增topic、编写生产者逻辑、编写消费者逻辑
  • 基本概念
    • Topic:逻辑队列,不同Topic可以建立不同的Topic
    • Cluster:物理集群,每个集群中可以建立多个不同的Topic
    • Producer:生产者,负责将业务消息发送到Topic中
    • Consumer:消费者,负责消费Topic中的消息
    • ConsumerGroup:消费者组,不同组Consumer消费进度互不干涉
    • Partition:Topic内的分区
    • Offset:消息在partition内的相对位置信息,可以理解为唯一ID,在partition内部严格递增
    • Replica:副本,容灾。每个分片有多个replica,leader replica将会从ISR(In-Sync Replicas)中选出
  • 消息的视角:producer --生产--> broker --消费--> consumer
    • producer:Batch批量发送减少IO次数,从而加强发送能力;通过压缩减少消息大小(Snappy,ZSTD)
    • broker:.long日志文件,.index偏移量索引文件,.timeindex时间索引文件。采用顺序写的方式进行写入以提高写入效率。(消息索引)通过发送FetchRequest请求消息数据,Broker将会指定Offset处的消息,按照时间窗口和消息大小窗口发送给Consumer。(零拷贝)二分找到小于目标offset的最大索引位置。二分找到小于目标时间戳最大的索引位置,在通过寻找offset的方式找到最终数据。
    • consumer:partition在consumer group中的分配问题--自动分配方式:选取一个broker作为coordinator(rebalance

BMQ

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

  • producer -> proxy cluster -> broker cluster -> distributed storage system(HDFS) -> consumer group
  • HDFS写文件流程:随机选择一定数量的DataNode进行写入
  • Broker
    • partition状态机:保证对于任意分片在同一时刻只能在一个broker上存活
    • 写文件Failover:重新找一个可用的节点
  • 多机房部署
  • 高级特性
    • 泳道:开发 -> BOE(Bytedance Office Environment,是一套完全独立的线下机房环境)->PPE(Product Preview Environment,即产品预览环境)->Prod。泳道Topic:解决主干泳道流量隔离问题以及泳道资源重复创建问题。
      • BOE测试:串行测试,若并行会造成人力和资源的浪费
      • PPE验证:对于PPE的消费者来说,资源没有生成环境多,所以无法承受生产环境的流量
    • Databus:Application上加一个Databus Agent,每一个Agent还有一个Databus Server。简化消息队列客户端复杂度,解耦业务与Topic,缓解集群压力提高吞吐
    • Mirror:使用mirror通过最终一致的方式解决跨Region读写问题
    • Index:直接在BMQ中将数据结构化,配置索引DDL,异步构建索引后,通过Index Query服务读出数据。
    • Parquet:Hadoop生态圈中一种新型列示存储格式,可以兼容Hadoop生态圈中大多数计算框架(Hadoop、Spark等),被多种查询引擎支持(Hive、Impala、Drill等)

RocketMQ

  • 使用场景:低延时,针对电商业务线,秒杀等
  • ConsumerQueue -- Partitio(Kafka)
  • producer group
  • nameserver -- controller(Kafka)