走进消息队列 | 青训营

108 阅读3分钟

一、消息队列应用场景

最常见的是:解耦、削峰、异步、日志处理

  • 解耦:各个模块只需要对消息队列进行操作,业务逻辑相对独立。
  • 削峰:可以控制流量,避免业务挂掉。
  • 异步:如果下游接口返回的数据不是必要的,则可以将用户请求交给消息队列,消息队列交给下游的模块接口处理,用户不必等待所有接口处理完成返回,也可以缓解串行处理的时延问题。
  • 日志处理:可以处理大规模日志数据的传输问题(类似于削峰)

二、Kafka

1.适用场景

直播、订单、搜索服务

2.使用方法

创建Kafka集群->创建Topic->设计生产者逻辑,初始化生产者,发送消息->设计消费者逻辑,初始化消费者,接收消息

3.基本概念

Kafka的基础架构为:

  • Topic:逻辑队列,一个 Topic 中拥有多个Partition(Kafka的物理分区)。一个Topic看作是一组具有相同主题的消息。
  • Cluster:物理集群,每个集群中可以建立多个不同的 Topic。
  • Producer:生产者,负责将业务消息发送到 Topic 中。
  • Consumer:消费者,负责接收并处理Topic 中的消息。
  • ConsumerGroup:消费者组,包含多个消费者,每个消费者的消费进度互不干涉。 Kafka中的其他基本概念
  • Offset:消息在 Partition 内的相对位置信息,可以理解为唯一 ID,在 Partition 内部严格递增。我们可以利用 Partition 和Offset唯一地定位一个消息
  • Replica:Partition 的副本,主要作用是容灾,这些副本有着不同的角色,分别是 Leader 和 Follower。Leader 对外提供数据;Follower 会拉取 Leader 的数据进行同步,但不提供服务,如果 Leader 挂掉了,可以将 Follower 提升成 Leader 再对外进行服务。
  • ISR(In-Sync Replica):当Follower与Leader差距较小时,可以被纳入ISR。ISR中的Follower可以升为Leader。
  • ZooKeeper :存储集群元数据

4.Kafka运行流程

4.1 数据流

主要流程是Producer->Broker->Consumer

4.2 Producer 端

在Producer端的主要优化是批量发送。因为Producer将消息发送给Broker后,需要接收确认消息,批量发送可以有效减少交互次数,减少IO次数,提高交互效率 在消息容量太大,带宽较小的场景下,Kafka会对数据进行压缩,减少消息的大小,有效利用带宽资源

4.3 Broker端

Broker写入使用顺序写入,减少磁盘寻道成本 Consumer 请求消息时会发送 FetchRequest ,Broker 通过索引取出消息,按照时间窗口和信息大小发送给 Consumer。 Broker的有两种文件索引方式,通常使用二分法查找目标的位置 kafka 拷贝数据的流程不经过用户态空间,而是在读取磁盘后直接将 Read Buffer 中的数据传输到 NIC Buffer,通过 NIC Buffer 直接交付给消费者进程。这种方式减少了拷贝次数,有效提高了效率。

4.4 缺点

  • 运维成本高
  • 负载不均衡
  • 需要依赖于Page Cache
  • 若Controller和Coordinator与Broker在同一个进程中,大量 I/O 会导致性能下降。