这是我参与「第五届青训营 」笔记创作活动的第13天
案例一 系统崩溃
搜索直播间 搜索行为记录 点击商品 点击行为记录 记录存储
案例二 服务能力有限
发起订单 处理订单
案例三 链路耗时长尾 发起订单 库存记录-1 订单记录+1 通知商家 下单成功
案例四 日志存储
四个场景 系统崩溃 服务处理能力有限 链路耗时长尾 日志如何处理
案例一 解决方案 解耦
案例二:解决方案 削峰
案例三:解决方案 异步
案例四:解决方案 日志处理
消息队列MQ 保存消息的一个容器 支持高吞吐 高并发 且高可用
1前世今生 -消息队列发展历程
-业界消息队列对比 Kafka 高吞吐 RocketMQ 低延迟 实时场景 Pulsar BMQ
2消息队列-Kafka 2.1使用场景 日志信息 Metrics数据 用户行为
2.2如何使用Kafka 创建集群 新增Topic 编写生产者逻辑 编写消费者逻辑
2.3基本概念
Topic:逻辑队列,不同Topic可以建立不同的Topic Cluster:物理集群,每个集群可建立多个不同的Topic Producer:生产者 负责将业务发送到Topic中 Consumer:消费者负责Topic中的消息 Consumergroup:消费者组 不同组Consumer消费进度互不干涉
-Offset 消息在partition内的相对位置信息 可以理解为唯一ID 在partition内部严格递增
-Replica 每个分片有多个Replica Leader Replica将会从ISR中选出 (In-Sync Replicas)
2.4数据复制
2.5Kafka架构 ZooKeeper:负责处理存储集群元信息,包括分区分配信息等
2.6消息视角
思考
Producer-批量发送 批量发送减少IO次数 增强发送能力
思考 消息量很大 网络带宽如何解决?
Producer-数据压缩 通过压缩减少消息大小 AZTD压缩算法
Broker-数据的存储 消息文件结构
-磁盘结构 顺序写的方式写入 以提高写入效率
-如何找到消息
-Broker偏移量索引文件 二分找到小于目标offset的最大索引位置
-Broker时间戳索引文件 二分找到小于目标时间戳最大的索引位置 通过寻找offset的方式找到最终数据
Broker-传统数据拷贝
-零拷贝
2.9Consumer-消息的接收端 如何解决Partition在Consumer Group中的分配问题?
-Low Level 手动进行分配
-High Level Coodinator Rebalance
2.10Consumer Rebalance
帮助Kafka提高吞吐或稳定性的功能 Producer:批量发送、数据压缩 Broker:顺序写,消息索引、零拷贝 Consumer:Rebanlance
2.11Kafka-数据复制问题
-重启操作 -替换、扩容、缩容
-负载不均衡
-问题总结 1运维成本高 2对于负载不均衡的场景 解决方案复杂 3没有自己的缓存 完全依赖Page Cache 4Controller Coodinator和Broker在同一进程中 大量IO会造成性能下降
3消息队列BMQ
3.1BMQ简介 兼容Kafka协议 存算分离 云原生消息队列
3.1BMQ介绍 架构图
3.2运维操作对比 BMQ重启替换扩容缩容后可直接对外服务 秒级完成
3.3HDFS写文件流程 随机选择一定数量的DataNode进行写入
3.4文件结构
3.5-Broker-Partition状态机 保证对于任意分片同一时刻只能在一个Broker上存活
3.5Broker写文件流程
-写文件Failover
DataNode节点挂了该如何处理?
3.6Proxy
3.7多机房部署
3.8MBMQ高级特性
3.9泳道消息
BOE:Bytedance Office Environment一套完全独立的线下机房环境 PPE:Product Preview Environment产品预览环境 多个人同时测试 需要等待上一个人完成测试
BOE测试 每多一个测试人员 都需要重新搭建一个相同配置的Topic造成人力和资源的浪费 PPE验证 对于PPE的消费者来说 资源没有生产环境多 所以无法承受生产环境的流量
解决泳道流量隔离问题及泳道资源重复创建问题
3.10Databus 直接使用原生SDK有什么问题 1客户端配置较为复杂 2不支持动态配置 更改配置需要停掉服务 3对于latency不是很敏感的业务 batch效果不佳
1简化消息队列客户端复杂度 2解耦业务与Topic 3缓解集群压力,提高吞吐
3.11Mirror 是否可以通过多机房部署的方式 解决跨Region读写的问题?
使用Mirror通过最终一致的方式 解决跨Region读写问题 3.12Index 3.13Index 在BMQ中将数据结构化 配置索引DDL 异步索引构建后 通过Index Query服务读出数据
2023年2月9日 22:21 已保存 3.14Parquet Hadoop生态圈的一种新型列式存储格式 可以兼容Hadoop生态圈中大多数计算框架
行式/列式存储
直接在BMQ中将数据结构化 通过Parquet Engine 使用不同方式构建Parquet格式文件
3小结 BMQ架构模型(解决Kafka存在的问题) BMQ读写流程(Failover机制 写入状态机) BMQ高级特性(泳道、Databus、Mirror、Index、Parquet)
4消息队列RocketMQ 使用场景 低延时 电商业务线 业务峰值时刻
4.1RocketMQ基本概念
4.2RocketMQ架构
4.3存储模型
4.4-高级特性 -事务场景 最终一致性 -事务消息
-延迟发送
-处理失败 -消费重试和死信队列
4小结 基本概念(Queue、Tag) 底层原理(架构模型、存储模型) 高级特性(事务消息、重试和死信队列、延迟队列)