这是我参与「第五届青训营 」伴学笔记创作活动的第 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等)
- 泳道:开发 -> BOE(Bytedance Office Environment,是一套完全独立的线下机房环境)->PPE(Product Preview Environment,即产品预览环境)->Prod。泳道Topic:解决主干泳道流量隔离问题以及泳道资源重复创建问题。
RocketMQ
- 使用场景:低延时,针对电商业务线,秒杀等
- ConsumerQueue -- Partitio(Kafka)
- producer group
- nameserver -- controller(Kafka)