信息队列及 Kafka信息队列系统|青训营笔记

51 阅读3分钟

青训营笔记|消息队列

前提引入

问题:

  1. 删库跑路。系统崩溃
  2. 服务处理能力有限
  3. 服务连服耗时长
  4. 日志如何处理

解决方法

  1. 引入信息队列,解耦。
  2. 引入信息队列,削峰。
  3. 引入信息队列,异步处理。
  4. 引入信息队列,日志处理。

概念

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

业界消息队列

  1. Kafka
  2. RocketMQ
  3. Pulsar
  4. BMQ

Kafka

使用 Kafka

  1. 创建集群
  2. 新增 Topic,设置分片数量
  3. 引入对应语言 SDK,配置参数,编写生产者逻辑
  4. 引入对应语言 SDK,配置参数,编写消费者逻辑

基本概念

  • Topic:逻辑队列,业务场景-topic
  • Cluster:物理集群,集群中可以新建多个不同的 topic
  • Producer:生产端,发送业务信息到 topic 中
  • Consumer:消费端,消费已经发送到 topic 中的信息
  • Partition:topic 中有多个分片,不同分片信息可以并发处理。
  • Offset:消息在 partition 内的相对位置,唯一 ID。
  • Replica::分片的副本,每个分片有多个 Replica,其中 Leader 对外服务,Follower 同步 Leader 数据(副本)。
  • ISP:同步中的副本,在 ISP 中的副本可以提升为 Leader
  • Broker:Kafka 的节点,所有的 Broker 节点组成一个集群。
  • Controller:负责对副本和 Broker 进行分配
  • ZooKeeper:集群的基础上,模块,这个模块储存了集群的元数据信息,包括分区分配信息等。

Kafka 过程

image.png

Producer

  • 批量发送
  • 数据压缩

Broker数据存储

image.png

  • Topic
    • Partition
      • Replica
        • Log
          • LogSegment
            • .log(日志文件)
            • .index
            • .timeindex
            • 其他文件

顺序写入

Broker 数据查找

  1. offset 索引,二分找到小于目标 offset 的最大索引位置,再遍历找到目标 offset
  2. 若是时间戳索引,通过二分找到时间戳对应的 offset 重复以上步骤

Broker传统数据拷贝与零拷贝

详情见 ppt

Consumer 与 Partition 分配问题

  • 手动分配(Low Level)
  • 自动分配(High Level)

在 Broker 集群中,对于 Consumer Group 来讲,选取 一台 Broker 作为 coordinator,coordinator 帮助 Consumer Group 进行分片的分配(rebalance)

image.png

Kafka数据复制问题

Kafka重启

首先 leader发生切换,切换到其他节点上的并且在 ISR 上的Follower副本,在进行关闭重启操作中,存在数据的滞后,新的 Broker 追赶数据,避免leader分布在少数的 Broker 上,要进行leader 的回切。

Kafka替换,扩容,缩容

替换:本质上是需要更多数据的重启操作。

扩容:分片分配到新的 Broker 上,从新复制新的副本

缩容:缩容节点上的分片分配到Broker中的剩余节点,从新复制新的副本

Kafka负载不均衡

需要权衡IO 设计出极其复杂的负载均衡策略

Kafka问题总结

  1. 运维成本高
  2. 对于负载不均衡的场景,解决方案复杂
  3. 没有缓存,完全依赖 page cache
  4. Controller、coordinator、Broker 在同一进程