前言
案例:
- 系统崩溃
- 服务能力有限
- 链路耗时长尾
- 日志存储丢失
解决方案:
- 解耦
- 削峰
- 异步
- 日志处理
消息队列(MQ),指保存信息的一个容器,本质是个队列。但这个队列需要支持高吞吐,高并发,并且高可用。
Kafta
使用场景
- 日志信息
- Metrics数据(程序状态的采集,QPS、latency)
- 用户行为
如何使用Kafta
- 创建集群
- 新增Topic,设置分区数量
- 编写生产者逻辑,用SDK实现
- 编写消费者逻辑,业务处理
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的分配问题
手动分配的缺点:
- 原来的会中断,产生错误
- 新加入Consumer需要先暂停
优点:快
自动分配:Coordinator Rebalance
Kafka重平衡—Rebalance 你了解吗? - 掘金 (juejin.cn)
可以帮助Kafka提高吞吐或稳定性的功能:
- Producer 批量发送,数据压缩
- Broker 顺序写,消息索引,零拷贝
- Consumer Rebalance
问题
- 数据复制
- 重启操作
- 替换、扩容、缩容
- 负载不均衡,又会引入替换等等问题
问题总结
- 运维成本高
- 对于负载不均衡的场景,解决方案复杂
- 没有自己的缓存,完全依赖 Page Cache
- Controller 和 Coordinator 和 Broker 在同一进程中,大量 IO 会造成其性能下降