一、生产者

1、分区的原因

方便在集群中扩展:

每个分区都可以通过调整副本数,改变分区副本所占的kafka节点。
每个topic又有多个分区,这样就可以灵活的改变集群的大小和所占的机器数

可以提高并发:

同一个topic的数据,可以分散到不同的分区,
而不同的分区数据可以被不同的Consumer并发消费。

2、分区的原则

我们需要将producer发送的数据封装成一个ProducerRecord对象。

在这里插入图片描述

(1)、指明 partition 的情况下,数据往指定分区里面发送。

(2)、没有指明 partition 值但有 key 的情况下,通过key进行hash计算,
  	 算出对应的partition进行发送数据

(3)、既没有 partition 值又没有 key 值的情况下,
  	 使用round-robin算法(轮询),进行发送数据。


(4)、Partition:

	 ProducerRecord可以只包含Topic和消息的value,
	 key默认是null,但是大多数应用程序会用到key。
	
	 key可以用以区分数据要发送到那个分区。
	
	 如果为null,则使用轮询算法发送到不同的分区
	 如果有key,则相同key的数据发送到同一个分区,保持消息的顺序性。
	 还可以实现partitioner接口,来自定义算法发送到那个分区。

3、数据可靠性保证

三种ack模式:

1、acks参数为0:

发送完就不管了,不管leader和follower是否接收到了消息,
效率最高,但是可能会丢失数据。

2、acks参数为1:

发送完成之后,需要leader副本收到消息之后,返回一个应答。

3、 acks参数为2:

发送完成之后,需要leader和follow副本收到消息之后,
返回一个应答。

二、生产者

1、消费者和消费者组

(1)、生产者把数据发送到同一个topic的不同分区,
 	 然后consumer组去监听这个topic,consumer组里面的
 	 多个consumer去分别消费不同分区里面的消息。

(2)、topic对应consumer组,topic里面不管有多少个分区,consumer组都可以接收,
     但是一个分区数据,只能被组内的一个consumer消费。

(3)、topic也可以往多个consumer组发送,多个consumer组消费相同的topic数据,
	 每个组的消费逻辑和上面的(2)一样。

(4)、组中 consumer 的数量超过分区数,多出的 consumer 会被闲置。
 	 因此,如果想提高消费者的并行处理能力,需要设置足够多的 partition 数量。

在这里插入图片描述

2、同一系统kafka集群处理高并发消费问题:

一个topic多设置分区,消费组里面设置对应数量的消费者,这样就可以将同一个topic的数据分散到不同的分区,
然后由消费组里面的不同的消费者分别消费不同的分区数据,达到并发消费效果。

3、不同系统和kafka集群的负载均衡

只要保证每个应用程序有自己的 consumer group,就可以获取到 Topic 所有的消息:

在这里插入图片描述

同一个topic中的不同分区数据,会发送到不同的 consumer group,
这些 consumer group里面的多个consumer去消费不同分区的数据,
同一个分区的数据只能被一个consumer 消费到。

不同的系统去消费不同的consumer group,这样就实现了多系统之间的消息共享。

4、创建 Kafka 消费者

(1)、在读取消息之前,需要先创建一个 KafkaConsumer 对象
在这里插入图片描述

<1>、设置kafka集群消息,
<2>、设置消费者所属组
<3>、设置key和value序列化

(2)、创建了消费者之后,需要订阅 Topic,
subscribe() 方法接受一个主题列表作为参数:
在这里插入图片描述

5、关于消息顺序

(1)、不关注消息顺序的情况下:


生产者像topic发送数据,不指定key,不指定分区,
这样消息会被负载到多个分区上去。
消费者组里面有多个消费者,这些消费者去会主动去消费不同的分区数据,
这样就可以提高效率。

(2)、关注消息顺序的情况下:

生产者向topic发送数据的时候,就需要指定key或者
自己实现Partition接口计算发送到那个分区。

这种需要顺序的数据,肯定是只能往一个分区发送,
因为kafka只能保证分区内的顺序。

消费者从固定分区读取数据,这个时候是可以保持顺序的,
但是读取之后一般会使用多线程的方式来处理消息,
这个时候就保证不了顺序了。

可以加一个内存 queue队列,消费者的数据先往内存 queue里面存,
然后用多线程的方式去处理内存 queue里面的数据,
这样就可以保证消息顺序。

在这里插入图片描述

三、总结

1、单独一个系统处理

(1)、乱序并发处理

一个topic分区多个,每个分区按照副本数,最终在不同的kafka节点上生成分区副本。

生产者发消息不指定对应的分区,数据会分散到不同的分区上
(实际上会落在每个分区的leadrd副本上)。

消费者组指定消费topic数据,组内的消费者就会各自消费一个
(并且同组的消费者也只能消费一个分区数据)分区的数据。

因为消费者只能记录一个分区的偏移量,所以当数据被拆分成多个分区的时候,
数据的偏移量就失去意义了

(2)、顺序处理

生产者发消息指定特定的分区

消费者组里面的消费者也会只消费者一个分区的数据,从而确保消费消息的顺序。


2、多个系统处理

只要保证每个应用程序有自己的 consumer group,就可以获取到 Topic 所有的消息,
各个系统就可以各种处理消息。
Logo

Kafka开源项目指南提供详尽教程,助开发者掌握其架构、配置和使用,实现高效数据流管理和实时处理。它高性能、可扩展,适合日志收集和实时数据处理,通过持久化保障数据安全,是企业大数据生态系统的核心。

更多推荐