消息队列 | 青训营笔记

41 阅读2分钟

这是我参与「第五届青训营 」笔记创作活动的第10天。消息队列提供一系列开发问题的解决方法:解耦,削峰,异步,日志处理等。

消息队列定义:(MQ),保存消息的一个容器,本质是个队列,支持高吞吐,高并发,高可用。

业界的几个出名消息队列:Kafka,RocketMQ,Pulsar,BMQ。

Kafka:

使用场景:搜索服务,直播服务,订单服务,支付服务。 使用一个Kafka的过程:

image.png

重要概念: - topic 逻辑队列 - cluster 物理集群 - producer:生产者 - consumer:消费者 - consumerGroup消费者组

Offset:消息在partttion内的相对位置信息,可理解为唯一ID,在partition内严格递增。 Replica:分片的副本,Leader会从ISR中选出。

数据复制过程如下:

image.png

Kafka架构有一个Zoo keeper,负责存储集群元信息,包括分区分配信息等。

Producer支持:

  • 批量发送,减少IO次数,增强发送能力
  • 数据压缩:通过压缩减少消息大小,目前支持Snappy,Gzip,LZ4,ZSTD等压缩算法。

用Broker存储数据,每个Broker都有不同Topic的分片。顺序写的方式写入,以提高效率。寻找消息:二分法,找到小于Broker的最大文件。COnsumer从Broker读出数据后采用sendfile的形式,将磁盘读到OS内核缓冲区后,直接转到socket buffer进行网页发送。Producer产生的数据持久化到broker,采用mmap进行文件映射,实现顺序的快速写入。

COnsumer分配:手动分配,自动分配

手动(low level):完全由业务决定。自动(high level):有Coordinator帮助Consumer Group进行分片的分配。(Rebalance)

Kafka有其自己的问题:运维成本高,对于负载不均衡的情况,使用复杂,缓存完全依赖page cache等。

引入BMQ:兼容Kafka协议,存算分离,云原生消息队列。重启,替换,缩容,扩容后可直接对外服务。写入:随机选取一定的DataNode

(Parquet)BMQ中可以将数据结构化,配置索引ddl,异步构建索引之后,通过Index Query读出数据。

ROcketMQ是新型消息队列,具有很多高级特性。