消息队列(一) | 豆包MarsCode AI刷题

56 阅读2分钟

1、引言

如何解决以下4个场景:

  • 系统崩溃
  • 服务器处理能力有限
  • 链路耗时长
  • 日志如何处理 解决方案:
  • 1、解耦

图片.png

  • 2、削峰 图片.png
  • 3、异步

图片.png

  • 4、日志处理

图片.png 总的来说:消息队列(MQ),是指保持消息的一个容器,本质上是一个队列。该队列需要支持高吞吐、高并发、并且高可用

图片.png

2、消息队列-Kafka

2.1、使用场景:

  • 日志信息
  • Metrics数据
  • 用户行为

2.2、如何使用Kafka

图片.png

2.3、基本概念:

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

图片.png

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

图片.png

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

图片.png

2.4 数据复制

图片.png

2.5 Kafka 架构

图片.png ZooKeeper:负责存储集群元信息,包括分区分配信息等

2.6、一条消息的自述

  • Producer--生产-->Broker--消费-->Consumer

图片.png

2.7、Producer-批量发送

  • 批量发送可以减少IO次数,从而加强发送能力
  • 缺点:如果消息量很大,网络带宽不够用,效率低下

数据压缩:

  • 通过压缩技术,减少消息大小,目前支持Snappy、Gzip、LZ4、ZSTD压缩算法

2.8 Broker消息文件结构

图片.png

Broker-磁盘结构

图片.png

Broker-如何找到消息

Consumer通过发送FetchRequest请求消息数据,Broker会将指定Offset处的消息,按时间窗口和消息大小窗口发送给Consumer:

图片.png

偏移量索引文件

  • 采用二分找到目标offset的最大文件

图片.png

Broker时间戳索引文件

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

2.9、Consumer-消息的接收端

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

缺点:不能自动容灾,不能自主启频

  • High Level:自动分配: 图片.png

Consumer Rebalance

图片.png

小结:哪些方法可以提高Kafka吞吐量或者稳定的功能?

  • Producer:批量发送、数据压缩
  • Broker:顺序写,消息索引、零拷贝
  • Consumer:Rebalance

2.10、 Kafka-数据复制问题

图片.png

2.11、Kafka-重启操作

图片.png

2.13、Kafka- 替换、扩容、缩容

图片.png

流程:

  • 关机,重启
  • Leader切换、追赶数据
  • 数据同步完成
  • Leader回切

2.14、Kafka-负载不均衡

图片.png

Kafka-问题总结

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