一、消息队列应用场景
最常见的是:解耦、削峰、异步、日志处理
- 解耦:各个模块只需要对消息队列进行操作,业务逻辑相对独立。
- 削峰:可以控制流量,避免业务挂掉。
- 异步:如果下游接口返回的数据不是必要的,则可以将用户请求交给消息队列,消息队列交给下游的模块接口处理,用户不必等待所有接口处理完成返回,也可以缓解串行处理的时延问题。
- 日志处理:可以处理大规模日志数据的传输问题(类似于削峰)
二、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 会导致性能下降。