消息队列(1) | 青训营笔记

43 阅读3分钟

消息队列

1、什么是消息队列?

消息队列(Message Queue,MQ),指保存消息的一个容器,本质是个队列。这个队列需要支持高吞吐高并发高可用

2、消息队列的发展历程

image.png

3、业界消息队列对比

Kafka: 分布式的、分区的、多副本的日志提交服务,在高吞吐场景下发挥较为出色。

RocketMQ: 低延迟、强一致、高性能、高可靠、万亿级容量和灵活的可扩展性,在一些实时场景中运用较广。

Pulsar: 是下一代云原生分布式消息流平台,集消息、存储、轻量化函数式计算为一体、采用存算分离的架构设计。

BMQ: 和Pulsar架构类似,存算分离,初期定位是承接高吞吐的离线业务场景,逐步替换掉对应的Kafka集群。

消息队列-kafka

1、使用场景

kafka可以用在搜索服务直播服务订单服务支付服务等等。它提供了日志信息Metrics数据用户行为

2、如何使用kafka

kafka官方文档。使用kafka一般有以下流程:

graph TD
创建集群 --> 新增Topic
新增Topic --> 编写生产者逻辑
编写生产者逻辑 --> 编写消费者逻辑

3、基本概念

image.png

  • Topic:逻辑队列,不同Topic可以建立不同的Topic
  • Cluster:物理集群,每个集群中可以建立多个不同的Topic
  • Producer:生产者,负责将业务消息发送到Topic中
  • Consumer:消费者,负责消费处理Topic中的消息
  • ConsumerGroup:消费者组,不同组Consumer消费进度互不干涉

Topic内部

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

image.png

Replica: 每个Partition多个Replica,Leader Replica 将会从ISR中选出。Follower与leader差距过大会在ISR中被剔除。kafka的Replica机制介绍

image.png

ZooKeeper:复制存储集群元信息,包括分区分配信息等。ZooKeeper与kafka

image.png

4、kafka能支撑高吞吐量的原因

Producer

批量发送、数据压缩,如图:

image.png

Broker

Broker通过顺序写入磁盘,提高写入效率。Broker消息文件结构如下:

image.png

消息索引。Consumer通过发送FetchRequest请求消息数据,Broker会指定Offset处的消息,按照时间窗口和消息大小窗口发送给Consumer。通过二分法寻找小于目标Offset的最大文件,然后二分寻找小于目标Offset的最大索引位置。

零拷贝。将数据直接从磁盘文件复制到网卡设备中,而不需要经由应用程序之手 。 零拷贝大大提高了应用程序的性能,减少了内核和用户模式之间的上下文切换。

Consumer

如何解决Partition在Consumer Group中的分配问题?

1、手动分配(Low-Level)。哪个Consumer消费哪个Partition完全由业务决定。优点在于速度快,其缺点在于无法自动容灾,如果要增加Consumer可能造成机器的启停。

2、自动分配(High-Level)。对于不同的Consumer Group选取一个Broker作为Coordinator服务,帮助某个Consumer Group内部的每个consumer自动分配(rebalance)。

Rebalance过程

移步Kafka重平衡—Rebalance 你了解吗? - 掘金 (juejin.cn)

5、kafka的缺点

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