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

141 阅读2分钟

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

01. 前世今生

02. 消息队列-Kafka

2.1 使用场景

搜索服务、直播服务、订单服务、支付服务
日志信息、Metrics数据、用户行为

2.2 如何使用Kafka

创建集群-新增Topic-编写生产者逻辑-编写消费者逻辑

2.3 基本概念

Topic:逻辑队列
Cluster:物理集群 Producer:生产者
Consumer:消费者
ConsumerGroup:消费者组,不同组Consumer消费进度互不干涉
Partition:Topic分区,消息可以并发处理
Offset:消息在Partition内的相对位置信息,严格递增
每个Partition有多个Replica,Leader Replica将会从ISR(In-Sync Replicas)中选出。

image.png

2.4 数据复制

Producer-Broker-Consumer

2.5 Kafka架构

image.png

2.6 一条消息的自述

为什么Kafka能支持高吞吐?

2.7 Producer-批量发送

Batch批量发送可以减少IO次数,从而增强发送能力
带宽?
通过压缩,减少消息大小

2.8 Broker-数据的存储

Broker消息文件结构

image.png

Broker磁盘结构

image.png 顺序写减少寻道时间

如何找到消息
Consumer通过发送FetchRequest请求消息数据,Broker会将指定Offset处的消息,按照时间窗口和消息大小窗口发送给Consumer。

传统数据拷贝
零拷贝

2.9 Consumer-消息的接收端

Low Level

image.png

High Level

image.png

2.10 Consumer Rebalance

Producer:批量发送、数据压缩
Broker:顺序写、消息索引、零拷贝
Consumer:Rebalance

2.11 Kafka-数据复制问题

2.12 Kafka-重启操作

image.png

2.13 Kafka-替换、扩容、缩容

2.14 Kafka-负载不均衡

Kafka问题:

  1. 运维成本高
  2. 对负载不均衡的场景,解决方案复杂
  3. 没有自己的缓存,完全依赖Page Cache
  4. Controller和Broker和Coordinator在同一进程中,大量IO会造成性能下降

03. 消息队列-BMQ

3.1 BMQ简介

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

image.png

3.2 运维操作对比

3.3 HDFS写文件流程

3.4 BMQ文件接口

3.5-Broker-Partition状态机

保证对于任意分片在同一时刻只能在一个Broker上存活
写文件流程
写文件Failover

3.6 Proxy

3.7 多机房部署

3.8 高级特性

3.9 泳道消息

开发流程:开发——BOE——PRE-Prod
BOE:Bytedance Offline Environment,是一套完全独立的线下机房环境
PRE:Product Preview Environment,即产品预览环境

3.10 Databus

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

3.11 Mirror

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

3.12 Index

Query By: 1. Offset 2. Timestamp
直接在BMQ中将数据结构化,配置索引DDL,异步构建索引后,通过Index Query服务读出数据。

3.14 Parquet

04. RocketMQ

使用场景:电商业务线

4.1 基本概念

image.png

4.2 架构

image.png

4.3 存储模型

image.png

4.4 高级特性-事务场景

延迟发送

消费重试和死信队列