这是我参与「第五届青训营 」笔记创作活动的第10天。消息队列提供一系列开发问题的解决方法:解耦,削峰,异步,日志处理等。
消息队列定义:(MQ),保存消息的一个容器,本质是个队列,支持高吞吐,高并发,高可用。
业界的几个出名消息队列:Kafka,RocketMQ,Pulsar,BMQ。
Kafka:
使用场景:搜索服务,直播服务,订单服务,支付服务。 使用一个Kafka的过程:
Offset:消息在partttion内的相对位置信息,可理解为唯一ID,在partition内严格递增。 Replica:分片的副本,Leader会从ISR中选出。
数据复制过程如下:
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是新型消息队列,具有很多高级特性。