消息队列 | 青训营笔记

51 阅读3分钟

消息队列

问题引入

  • 系统崩溃了(存储服务宕机了
  • 同时有多个请求?
  • 链路耗时长尾(操作的最后一步耗时长,一致再加载
  • 日志存储(服务器坏了,日志丢掉了,该怎么办

image-20230811195047150

先加入消息队列,算是一个缓存的

image-20230811195103859

可以根据处理能力,从消息队列中取数据

image-20230811195121269

下单后先加入消息队列,然后异步处理

image-20230811195258757

这个时使用的什么软件好像???

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

image-20230811195450903

常用消息队列

image-20230811195817130

Kafka

使用场景

  • 离线消息处理。例如日志信息---》kafka----》各种下游
  • Metrics数据,一些程序的运行数据
  • 用户消费数据,点赞,浏览

如何使用

创建集群-----》新建topic------》编写生产者逻辑--------》编写消费者逻辑

image-20230811200235945

topic也可以看作是一个业务,partition算是一个业务里的不同分区,实现高并发,提高一个topic的吞吐能力。

partition下还有offset,消息在分区的相对位置,理解为唯一ID

image-20230811200700089

partition下还有副本的概念,分布在集群的不同机器上,这样可以实现容灾的功能,高可用

image-20230811200828776

副本有leader和follower,leader是进行读写的,follower拉取数据,努力保证与leader相同。follower与leader差距过大就会被剔除,例如上图的副本3。如果leader崩了,会从ISR冲选一个新的成为leader。

Controller

controller决定了集群的分配,哪个topic的哪个partition的哪个leader和follower归controller管

image-20230811201236712

上层可能还有Zookeeper,与controller配合使用

image-20230811201421254

一条消息的自述(运行流程

image-20230811201536149

Broker缓存代理,Kafka集群中的一台或多台服务器统称broker.
Kafka的生成者、消费者、broker的基本概念kafka broker
Producer
  1. 批量发送(Batch

image-20230811202511276

有一个弊端是等待成功后再发送下一个,如果消息量大,网络带宽不够用-----》压缩,减少消息大小,目前支持Snappy,Gzip,LZ4,ZSTD压缩算法,现在ZSTD可能更常用一些

Broker

2.Broker--数据的存储,如何存到磁盘上

image-20230811203136092

Broker消息文件结构

对于每一个logsegment文件,是以文件内部的第一条消息的offset作为文件名的

image-20230811203211509

Broker顺序写写入,减少磁盘寻道的时间,提高写入效率。