利用正交方式,来概括所有的生产消费模型,如下:
单生产者P | 多生产者NP | |
单消费者C | CP | CNP |
多消费者NC | NCP | NCNP |
在kafka中,生产和消费可以概括为如上四种模型,分别是
一、一个生产者,一个消费者
二、一个生产者,多个消费者
三、多个生产者,一个消费者
四、多个生产者,多个消费者
其中一个生产者,一个消费者,我们可以理解为单向数据传递,生产者将数据推送至队列中,消费者向队列中获取。
其实在这里还是要讲一个新的概念,广播和订阅。这是两种不同的模式。我们主要从消费者角度去解释,广播,其实就是生产者将数据推送至kafka,然后满足条件的消费者需要主动去获取。而订阅则不同,订阅是数据被推送到kafka后,kafka会将数据推给订阅的消费者。
从生产者角度而言,其实没有太多的变化,还是往指定的topic中写数据。这个也是从代码角度去出发的,因为生产者端的代码不需要改变。消费者则不同,需要消费多个生产者所生产的消息,如果是以多个窗口去获取,其实也没有什么差别,差别是需要在一个窗口下去获取多个topic的信息。
consumer = KafkaConsumer('temp',auto_offset_reset='earliest',bootstrap_servers='localhost:9092')
for msg in consumer:
print(msg.value.decode())
kafka读取历史消息,有点像我们一直不停的从文件中读取消息,按照常规的逻辑来说,我们不停的读取文件中的数据,为了不重复读取数据,而且提升效率,我们会在文件中进行标记,标记我们上次读到了那个位置,然后下次打开的时候,就会直接从我们打开的地方获取。在这里感觉kafka也是这个逻辑,因为你不仅可以读取到最新的消息,也可以获取到历史消息。不过在这里,kafka可以有更好的逻辑去处理,就是使用队列,先进先出,这样数据只要在取用后就没有了,所以对于数据不需要做标记,直接取,按照逻辑来说,只要是可以取到的数据,就说明是原来没有被取用过的。
Python操作kafka消费多个topic的消息(订阅)
consumer = KafkaConsumer(bootstrap_servers=brokerlist) consumer.subscribe(topics=('test','test0'))
for message in consumer:
print(message.value.decode())
如果同时有多个生产者和多个消费者,从模型上看,这应该是最复杂的一种模型了,但其实梳理清楚就不会觉得复杂了