[kafka]看这一篇文章就够了

94 阅读6分钟

参考网址

juejin.cn/post/744438…

感谢大佬分享, 仅仅供自己学习使用.

图片.png

producer: 生产者, 往topic中发送消息, 具体来说, 是往topic中的分区partition中发送消息, 一条msg只能写入到同一个topic中的一个p中, 不能同时写入到同一个topic中的多个p中. 分区同时有备份机制, 包含leader和flower, 只需要往leader角色的p中写入msg即可, 系统会自动同步到flower角色的p中.

consumer: 消费者, 接收并处理消息

consumergroup: 消费者组, 可以并行的消费同一个topic, 一个消费者组包括多个消费者实例, 这些消费者实例是属于同一个组的, 他们订阅的是同一个topic(集群模式和广播模式)

broker: 一个独立的kafka服务器被称为broker, 它接收来自生产者的消息, 为消息设置偏移量offset, 并提交消息到[磁盘]进行保存. broker也为消费者提供服务, 对读取分区的请求做出响应, 返回已经提交到磁盘的消息, 可起到负载均衡和容错的作用. 一个broker会管理多个topic,

topic: 主题,可以理解为按照消息的分类把消息划分为不同的topic.

partition : 分区, topic的物理分组, 一个topic可以分为多个p, 每一个p是一个有序队列, 可以起到可扩展性, 应对高并发的情况.每一个p都有副本replication,有主从之分.

replication: 副本, 保证集群的高可用性, fafka提供副本机制, 一个topic中的每个p都有若干个副本, 一个leader和若干个flower.如果leader挂了, 那么会从众多个flower中重新选择一个当做leader

leader: 每个分区多个副本的主节点, 生产者发送消息的对象, 以及消费者消费数据的对象,都是leader 生产者在发送msg的时候, 只需要往leader这个p中发送就可以了, 服务会自动同步到flower中.

offset: 对于kafka中额分区p而言, 它里面的每条msg都有唯一的offset, 用来表示msg在分区中对应的位置.

为什么要使用 Kafka 消息队列?

解耦削峰:(解耦: 你发你的, 我按照自己的节奏消费我的, 这就是解耦)

传统的方式上游发送数据下游需要[实时]接收,如果上游在某些业务场景:例如上午十点会流量激增至顶峰,那么下游资源可能会扛不住压力。

但如果使用消息队列,就可以将消息暂存在消息管道中,下游可以按照自己的速度逐步处理;

可扩展:通过横向扩展生产者、消费者和broker, Kafka可以轻松处理巨大的消息流;

高吞吐、低延迟:在一台普通的服务器上既可以达到10W/s的吞吐速率;

容灾性:kafka通过副本replication的设置和leader/follower的容灾机制保障了消息的安全性。

生产流程

图片.png

1.先从zk获取对应分区的leader在哪个broker

2.broker进程上的leader将消息写入到本地log中

3.follower从leader上拉取消息,写入到本地log,并向leader发送ACK

4.leader接收到所有的ISR中的Replica的ACK后,并向生产者返回ACK

消费流程

图片.png

1.每个consumer都可以根据分配策略,获得要消费的分区

2.获取到consumer对应的leader处于哪个broker以及offset

3.拉取数据

4.消费者提交offset

分区策略

相信上面的内容已经让大家大致了解了消息生产及消费的过程:一个topic内的消息会被发送到不同的分区以供不同的消费者拉取消息。

那么在这个过程中就涉及到了两个问题:

1.生产者按照什么策略将数据分配到分区中呢?

2.消费者按照什么策略去不同的分区拉取消息呢?

生产者分区策略

生产者写入消息到topic,Kafka将依据不同的策略将数据分配到不同的分区中:

1. 轮询分区策略

即按消息顺序进行分区顺序分配,是默认的策略,也是使用最多的策略,可以最大限度保证所有消息平均分配到一个分区;

key为null,则使用轮询算法均衡地分配分区;

2. 按key分区分配策略

key不为null,key.hash() % n

但是按照key决定分区有可能会造成数据倾斜

3. 随机分区策略(不建议使用)

随机分区,不建议使用

4. 自定义分区策略

根据业务需要制定以分区策略

乱序问题在Kafka中生产者是有写入策略,如果topic有多个分区,就会将数据分散在不同的partition中存储当partition数量大于1的时候,数据(消息)会打散分布在不同的partition中如果只有一个分区,消息是有序的

消费者分区策略

同一时刻,一条消息只能被组中的一个消费者实例消费:

1.消费者数=分区数:一个分区对应一个消费者

2.消费者数<分区数:一个消费者对应多个分区

3.消费者数>分区数:多出来的消费者将不会消费任何消息

分区分配策略:保障每个消费者尽量能够均衡地消费分区的数据,不能出现某个消费者消费分区的数量特别多,某个消费者消费的分区特别少

1. Range分配策略(范围分配策略): Kafka默认的分配策略

图片.png

副本的ack机制

producer是不断地往Kafka中写入数据,写入数据会有一个返回结果,表示是否写入成功。这里对应有一个ACKs的配置。

•acks = 0:生产者只管写入,不管是否写入成功,可能会数据丢失。性能是最好的

•acks = 1:生产者会等到leader分区写入成功后,返回成功,接着发送下一条(不管flow是否给leader返回成功同步的信号)

•acks = -1/all:确保消息写入到leader分区、还确保消息写入到对应副本都成功后,接着发送下一条,性能是最差的

根据业务情况来选择ack机制,是要求性能最高,一部分数据丢失影响不大,可以选择0/1。如果要求数据一定不能丢失,就得配置为-1/all。

分区中是有leader和follower的概念,为了确保消费者消费的数据是一致的,只能从分区leader去读写消息,follower做的事情就是同步数据。