(1)单队列模型:所有生产者把生产的消息都写入到同一个队列中,所有的消费者都竞争同一个队列中的消息,也就是说一份消息只能被一个消费者消费,不可被多个消费者多次消费。
(2)多队列模型:生产者把同一个消息写入到多个队列中,每个消费者只从一个队列中消费消息,解决了单队列模型中一条消息不可被多次消费的问题。引入的新问题是,多队列模型下生产者必须知道下游有多好个消费者需要消费它的消息,相当于没有实现消息队列服务解耦的功能。
(3)发布/订阅模型:发布者将消息发送到主题中,订阅者在接收消息之前需要先“订阅主题”。“订阅”在这里既是一个动作,同时还可以认为是主题在消费时的一个逻辑副本,每份订阅中,订阅者都可以接收到主题的所有消息。
在 Topic 的消费过程中,由于消息需要被不同的组进行多次消费,所以消费完的消息并不会立即被删除,这就需要 kafka 为每个消费组在每个队列上维护一个消费位置(Consumer Offset),这个位置之前的消息都被消费过,之后的消息都没有被消费过,每成功消费一条消息,消费位置就加一。这个消费位置是非常重要的概念,我们在使用消息队列的时候,丢消息的原因大多是由于消费位置处理不当导致的。