走进消息队列 | 青训营笔记

66 阅读2分钟

前言

案例:

  1. 系统崩溃
  2. 服务能力有限
  3. 链路耗时长尾
  4. 日志存储丢失

解决方案:

  1. 解耦
  2. 削峰
  3. 异步
  4. 日志处理

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

Kafta

使用场景

  1. 日志信息
  2. Metrics数据(程序状态的采集,QPS、latency)
  3. 用户行为

如何使用Kafta

  1. 创建集群
  2. 新增Topic,设置分区数量
  3. 编写生产者逻辑,用SDK实现
  4. 编写消费者逻辑,业务处理

Replica

Leader:负责写入和读取
Follower:努力和Leader保持一致
ISR(In-Sync Replicas):follower和leader差距在一定范围外就踢出

数据复制

Kafka的Controller Broker是什么 - 简书 (jianshu.com)

Producer

Producer 批量发送,减少IO次数,加强发送能力

Producer 数据压缩,减少消息大小

Broker

Broker 消息文件结构

Broker 磁盘结构

Broker 顺序写

Broker 如何找到消息

Broker 偏移量索引文件

Broker 时间戳索引文件

Broker 传统数据拷贝

零拷贝:sendfile,mmap
Consumer从Broker中读取数据,通过sendfile的方式,将磁盘读到os内核缓冲区后,直接转到socket buffer进行网络发送
Producer生产的数据持久化到broker,采用mmap文件映射,实现顺序的快速写入
【深入浅出Linux】零拷贝技术sendfile - 简书 (jianshu.com)

Consumer

Consumer 消息的接收端

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

手动分配的缺点:

  1. 原来的会中断,产生错误
  2. 新加入Consumer需要先暂停

优点:快

自动分配:Coordinator Rebalance

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

可以帮助Kafka提高吞吐或稳定性的功能:

  1. Producer 批量发送,数据压缩
  2. Broker 顺序写,消息索引,零拷贝
  3. Consumer Rebalance

问题

  1. 数据复制
  2. 重启操作
  3. 替换、扩容、缩容
  4. 负载不均衡,又会引入替换等等问题

问题总结

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