消息队列-Kafka 基本概念 | 青训营笔记

75 阅读3分钟

中间件-消息队列

消息队列的定义

以队列的形式存储的消息的容器,支持高并发、高可吞出,高可用

消息队列的发展历程

day14.png

消息队列从刚开始的TIB到现在的 ActiveMQ RabbitMQ等以及存算分离的 Pulsar 极大的促进互联网的发展(程序的互联互通 消息的订阅和发布)

  • Kafka - 分布式 分区多副本的日志服务,具备高吞吐的能力
  • RocketMQ - 低延迟 强一致 高性能 高可靠 万亿级容量和灵活的扩展性(实时场景运用)
  • Pulsar - 云原生分布式消息流平台 集合了消息 存储以及轻量化函数为一体的存算分离架构
  • BMQ - 和Pular也是采用存算分离的形式,适用于高吞吐离线的业务,在某些方面兼容 Kafka

消息队列 Kafka

适用场日志服务的场景

  • 搜索
  • 直播
  • 订单
  • 支付

Note:用户的搜索 点赞 评论和收藏等行为

Kafka 的使用的步骤

  1. 创建 Kafka 集群
  2. 在集群中创建 Topic
  3. 引入对应语言的 SDk 并配置集群以及 Topic等相关参数,初始化 Producer 然后调用 Send 方法
  4. 引入对应语言的 SDk 并配置集群以及 Topic等相关参数,初始化 Consumer 然后调用 Poll 方法

1.png

  • Topic 逻辑队列,每一个 Topic可以建立一个队列
  • Cluster 物理集群,一个集群可以建立多个 Topic
  • Producer 生产者,将消息发送到 Topic 中
  • Consumer 消费者,负责消费 Topic 的信息
  • ConsumerGroup 消费组 不同组 Consumer 的不互相干扰

20230209201446.png

Replica 一个分片存在多个 Replica 这之中的 领导者将会从 ISR 中进行选举

20230209201826.png

在 Kafka 中的 zookeeper 存储集群的相关数据的元信息以及分区的分配信息

在 Kafka 中 Producer 为了减少数据信息的大小,我们可能会通过Snappy(default) Gzip LZ4 ZSTD 压缩算法对数据进行压缩

为了加快数据的读写效率 Broker 采用的是顺序读写

Consumer 通过 FetchRequest 请求数据,Broker 则会将 offset 处的信息(采用二分法,找到小于目标 offset 的最大文件),按照时间窗口以及消息大小窗口进行响应

Borker 的零拷贝

  • 通常情况下数据的拷贝是通过系统调用对磁盘数据进行读取,返回给用户态的下的用户,而用户会再调用另一个系统调用进行数据的写入
  • 这个过程有多次系统调用,对资源的消耗是较大的
  • 所以我们可以直接在 Broker 中,读入缓冲区后直接写入 socket buffer,实现快速写入(采用 mmap 映射)

20230209204100.png 目前 Kafka 存在的问题

  • 运维成本较高
  • 对于负载均衡的场景,解决较为复杂
  • 过度依赖 Page Cache 没有缓存
  • Controller & Coordinstor 和 Broker 处于同一进程,IO 的性能不佳