[ 后端与 Go | 青训营笔记 ]

112 阅读7分钟

[ 后端与 Go | 青训营笔记 ]

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

课内:Go 走进消息队列

消息队列(Message Queue),是分布式系统中重要的组件,其通用的使用场景可以简单地描述为:. 当不需要立即获得结果,但是并发量又需要进行控制的时候,差不多就是需要使用消息队列的时候。. 消息队列主要解决了应用耦合、异步处理、流量削锋等问题。. 当前使用较多的消息队列有RabbitMQ、RocketMQ、ActiveMQ、Kafka、ZeroMQ、MetaMq等,而部分数据库如 Redis 、Mysql以及phxsql也可实现消息队列的功能。

重点

  • 背景;
  • 消息队列 - Kafka;
  • 消息队列 - BMQ;
  • 消息队列 - RocketMQ;

细节

背景

消息队列 - Kafka

发展历程

image-20230209163653333

对比
  • Kafka;
  • RocketMQ;
  • Pulsar;
  • BMQ;

image-20230209163722177

消息队列 - Kafka

使用场景
  • 搜索服务;
  • 直播服务;
  • 订单服务;
  • 支付服务;

image-20230209163908069

使用
  • 创建集群;
  • 新增 Topic;
  • 编写生产者逻辑;
  • 编写消费者逻辑;
基本概念
  • Topic:逻辑队列,不同 Topic 可以建立不同的 Topic;
  • Cluster:物理集群,每个集群中可以建立多个不同的 Topic;
  • Producer:生产者,发展将业务消息发送到 Topic 中;
  • Consumer:消费者,负责消费 Topic 中的消息;
  • ConsumerGrou:消费者组,不同组 Consumer 消费进度互不干涉;

image-20230209164303498

Offset

  • 消息在 partition 内的相对位置信息,可以理解为唯一 ID,在 partition 内部严格递增;

image-20230209164424151

Replica

  • 每个分片有多个 Replica,Leader Replica 将会从 ISR 中选出;

image-20230209164608698

数据复制

image-20230209164640814

Kafka 架构

ZooKeeper

  • 负责存储集群元信息,包括分区分配信息等;

image-20230209164906130

Producer

批量发送

image-20230209165005109

数据压缩

  • 通过压缩,减少消息大小;

image-20230209165025947

Broker

数据存储

image-20230209165117060

消息文件结构

image-20230209165137461

磁盘结构

image-20230209165158762

顺序写

  • 提高写入效率;

image-20230209165228679

搜索消息

image-20230209165253241

偏移量索引文件

  • 二分找到小于目标 offset 的最大文件;

image-20230209165353024

image-20230209165402003

时间戳索引文件

  • 二分找到小于目标时间戳最大的索引位置,在通过寻找 offset 的方式找到最终数据;

image-20230209165509877

传统数据拷贝

image-20230209165532246

零拷贝

image-20230209165550589

Consumer

消息的接收端

image-20230209165622164

Low Level

  • 通过手动分配,哪一个 Consumer 消费哪一个 Partition 完全由业务来决定;

image-20230209165742751

High Level

image-20230209165805491

Rebalance

image-20230209165825540

数据复制问题

image-20230209165910539

重启操作

image-20230209165936934

替换、扩容、缩容

image-20230209170006254

负载不均衡

image-20230209170551504

image-20230209170600511

问题总述
  • 运维成本高;
  • 对于负载不均衡的场景,解决方案复杂;
  • 没有自己的缓存,完全依赖 Page Cache;
  • Controller 和 Coordinator 和 Broker 在同一进程中,大量 IO 会导致其性能下滑;

消息队列 - BMQ

介绍

image-20230209171421103

运维操作对比

image-20230209171440948

HDFS 写文件流程

image-20230209171510166

文件结构

image-20230209171528520

Broker

Partition 状态机

image-20230209171603488

写文件流程

image-20230209171630511

写文件 Failover

image-20230209171655794

Proxy

image-20230209171724429

多机房部署

image-20230209171752827

高级特性

image-20230209171814432

泳道消息

开发流程

  • BOE;
  • PPE;

image-20230209171856742

BOE 测试

  • 多个人同时测试,需要等待上一个人测试完成;

image-20230209171940349

image-20230209171949780

PPE 验证

image-20230209172006523

image-20230209172014138

Databus

image-20230209172049868

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

image-20230209172155288

Mirror

image-20230209172218541

image-20230209172225568

Index

image-20230209172304178

image-20230209172312182

Parquet

image-20230209172331181

image-20230209172339918

image-20230209172348393

消息队列 - RocketMQ

使用场景

image-20230209172437217

基本概念

image-20230209172510138

image-20230209172517305

架构

image-20230209172535021

存储模型

image-20230209172549992

高级特性

事务场景

image-20230209172615668

事务消息

image-20230209172629651

延迟发送

image-20230209172648186

image-20230209172654842

延迟消息

image-20230209172711080

处理失败

image-20230209172727076

消费重试与死信队列

image-20230209172756783

总结

对消息队列有了一定的了解。