案例一:系统崩溃
搜索直播间-搜索行为记录-点击商品-点击行为记录
解决方案:解耦
案例二:服务能力有限
面对庞大的请求量,服务难以完成
解决方案:消峰
案例三:链路耗时长尾
解决方案:异步
案例四:日志存储
什么是消息队列
消息队列:MQ,指保存消息的一个容器,本质是个队列,但这个队列需要支持高吞吐、高并发并且高可用
消息队列的发展历程
TIB-IMB MQ-MSMQ-JMS-AMQP-Kafka(开源)-RocketMQ-Puslar
常见的消息队列:Kafka分布式、分区的,在高吞吐的场景下发挥出色;RocketMQ低延迟、强一致、高性能、高可靠,在一些实时场景中运用较广
消息队列Kafka
使用场景:搜索服务、直播服务、订单服务、支付服务
如何使用Kafka:创建集群-新增Topic-编写生产者逻辑-编写消费者逻辑
基本概念
Offset:消息在partition内的相对位置信息,可以理解为唯一ID,在partition内部严格递增
Replica:每个分片有多个Replica,Leader Replica将会从ISR中选出
Zookeeper:负责存储集群元信息,包括分区分配信息等
为什么Kafka能支持高吞吐
批量发送可以减少IP次数,从而加强发送能力
数据压缩:通过压缩,减少消息大小,目前支持Snappy,Gzip,LZ4,ZSTD等压缩算法
磁盘结构
磁盘磁头找到对应磁道,磁盘转动,找到对应扇区,最后写入,寻道成本较高,程序应该减少寻道所花费的时间成本
Consumer通过发送FetchRequest请求消息数据,Broker会将指定Offset处的消息,按照时间窗口和消息大小窗口发送给Consumer
二分找到小于目标offset的最大文件
Kafka采用了稀疏索引
对于时间索引与之相似,通过二分找到小于目标时间戳最大的索引位置,再通过寻找offset的方式找到最终数据