今天这篇文章要介绍的是消息队列(MQ),消息队列指保存消息的一个容器,本质上是一个队列,但这个队列需要支持高吞吐、高并发、高可用。在日常生活中,我们网购下单时,消息队列正在后台默默发挥着作用...
一、初看消息队列
1.1 消息队列发展历程
1.2 业界消息队列对比
Kafka:分布式的、分区的、多副本的日志提交服务,在高吞吐场景下发挥较为出色
RocketMQ:低延迟、强一致、高性能、高可靠、万亿级容量和灵活的可扩展性,在一些实时场景中运用较广
Pulsar:是下一代云原生分布式消息流平台,集消息、存储、轻量化函数式计算为一体、采用存算分离的架构设计
BMQ:和Pulsar架构类似,存算分离,初期定位是承接高吞吐的离线业务场景,逐步替换掉对应的Kafka集群
二、消息队列-Kafka
2.1 使用场景
2.2 使用Kafka四步曲
①首先创建一个Kafka集群
②在集群中创建一个Topic,并且设置好分区数量
③编写生产者逻辑,引入Kafka的SDK,分别去实现上游的生产逻辑
④编写消费者逻辑,调用Poll方法
2.3 基本概念
-Offset:消息在partition内的相对位置信息,可以理解为唯一ID,在partition内部严格递增。
-Replica(每个分片有多个Replica,Leader Replica将会从ISR中选出)
2.4 Kafka架构
2.5 Producer
-批量发送:批量发送可以减少IO次数,从而加强发送能力。
-数据压缩:减少消息大小,目前支持Snappy、Gzip、LZ4、ZSTD压缩算法。
2.6 Broker偏移量索引文件
二分找到小于目标offset的最大文件,找到小于目标offset的最大索引位置
2.7 Consumer
消息的接收端,Rebalance。
2.8 Kafka存在的问题
①运维成本高
②对于负载不均衡的场景,解决方案复杂
③没有自己的缓存,完全依赖Page Cache
④Controller和Coordinator和Broker在同一进程中,大量IO会造成其性能下降
三、消息队列-BMQ(兼容Kafka协议,存算分离,云原生消息队列)
3.1 BMQ架构
3.2 HDFS写文件流程-随机选择一定数量的DataNode进行写入
3.3 BMQ文件结构
3.4 Broker-写文件流程
3.5 Proxy读取数据流程
注:Wait流程由两个配置决定:①设置数据大小窗口;②设置时间窗口。
3.6 多机房部署
3.7 BMQ-高级特性
3.7.1 泳道消息
3.7.2 Databus
①简化消息队列客户端复杂度
②解耦业务与Topic
③缓解集群压力,提高吞吐
3.7.3 Mirror
使用Mirror通过最终一致的方式,解决跨Region读写问题。
3.7.4 Index
直接在BMQ中将数据结构化,配置索引DDL,异步构建索引后,通过Index Query服务读出数据。
3.7.5 Parquet
Apache Parquet是Hadoop生态圈中一种新型列式存储格式,可以兼容Hadoop生态圈中大多数计算框架,被多种查询引擎支持。
直接在BMQ中将数据结构化,通过Parquet Engine,可以使用不同的方式构建Parquet格式文件。
四、消息队列-RocketMQ
4.1 基本概念
4.2 RocketMQ架构
4.3 高级特性
①事务消息
②延迟发送
③消费重试和死信队列
消息队列在网购后台发挥了重要的作用,像商家的库存显示等都依赖着消息队列的实现。通过阅读这篇文章,相信大家对消息队列有了初步的认知,能够与实际生活相联系,理解一些消息队列在日常生活当中的运用。