消息队列-kafka札记|青训营

56 阅读4分钟

消息队列

(一)在同一时刻出现庞大的业务量时,如果出现系统崩溃、服务处理能力有限、链路耗时长和日志问题时应该如何处理?

场景一:系统崩溃 image.png 方案:解耦 image.png 通过增加消息队列的方式,减少模块之间的耦合,为系统提供信息备份,避免系统崩溃带来的损失

场景二:服务处理能力有限 image.png 方案:削峰 图片1.png 通过增加消息队列的方式,请求存在消息队列之后,进行请求的批量处理。

场景三:链路耗时长 image.png 方案:异步 image.png 同时处理多个订单的不同阶段,缩短多个订单的处理时间,提高订单处理效率。

场景四:日志问题 方案:暂存 image.png

(二)消息队列:保存信息的一个容器,本质是一个队列,但是需要支持高吞吐,高并发和高可用性。

(三)业界消息队列的对比

1.Kafka:分布式的、分区的、多副本的日志提交服务,在高吞吐场景下发挥较为出色。

2.RocketMQ(阿里):低延迟、强一致性、高性能、高可靠,万亿级的容量和灵活的可扩展性,在一些实时场景中运用较广。

3.Pulsar(腾讯):是下一代云原生分布式信息流平台,集信息、存储,轻量化函数式计算为一体,采用存算分离的架构设计。

4.BMQ:和Pulsar类似。

(四)Kafka

业务场景:日志信息处理、Metrics数据和用户行为的处理。

1.如何使用kafka

创建集群->新增Topic->编写生产者逻辑->编写消费者逻辑

2.基本概念

整体: image.png

Topic: Kakfa中的逻辑队列,可以理解成每一个不同的业务场景就是一个不同的topic,对于这个业务来说,所有的数据都存储在这个topic中。 Cluster: Kafka的物理集群,每个集群中可以新建多个不同的topic。 Producer:顾名思义,也就是消息的生产端,负责将业务消息发送到Topic当中。 Consumer:消息的消费端,负责消费已经发送到topic中的消息。 Partition:通常topic会有多个分片,不同分片直接消息是可以并发来处理的,这样提高单个Topic的吞吐。 ConsumerGroup:消费者组,不同组Consumer消费进度互不干涉。

Topic内部:

image.png 对于每一个Partition来说,每一条消息都有一个唯一的Offset Offset:消息在partition内的相对位置信息,可以理解为唯一ID,在partition内部严格递增。

Partition内部:

image.png 每个副本有多个partition

Replica:分片的副本,分布在不同的机器上,可用来容灾,Leader对外服务,Follower异步去拉取Leader的数据进行一个同步,如果Leader挂掉了,可以将Follower提升威Leader再华外进行服务

ISR:意思是同步中的副本,对于Follower来说,始终和Leader是有一定差距的,但当这个差距比较小的时候,我们就可以将这个Follower副本加入到ISR中,不在ISR中的副本是不允许提升成Leader的

在ISR当中如果Leader这个副本所在的机器宕机了,那么可以在ISR当中选择一个副本重新成为Leader,继续为生产者或者消费者提供服务,保证其高可用性。

3.Kafka副本分布:

image.png Broker代表每一个kafka的节点,所有的Broker节点最终组成了一个集群。整个图表示,图中整个集群,包含了4个Broker机器节点,集群有两个Topic,分别是Topic1和Topic2,,Topic1有两个分片,Topic2有1个分片,每个分片都是三副本的状态。这里中间有一个Broker同时也扮演了Controller的角色,Controller是整个集群的大脑,负责对副本和Broker进行分配

4.kafka架构

image.png

ZooKeeper:负责存储集群元信息,包括分区分配信息等

5.一条消息的处理流程

image.png

(1)Producer:

image.png

生产者将消息发送给Broker,途中采用批量发送的方式,目的是减少IO次数,加强发送能力,当一条消息很大的时候通过压缩,减少消息的大小

(2)Broker

image.png

Broker如何将文件写入本地磁盘

① Broker信息文件结构:

image.png

.Index文件:也就是Offset的映射。

.timeindex文件:与index文件类似。

将LogSegment的第一条offset作为右边的文件的命名