topic 与 partition
kafka 生产和消费消息的逻辑单位是 topic。每个 Topic 对应多个 partition。每个 partition 对应多个磁盘文件。同一 Partition 内的消息在磁盘上是顺序保存的。
生产者生产的时候需要指定一个 message key。kafka 会根据 message key 按照一定算法选择 partition 并写入对应磁盘文件。message key 相同的消息会写入到相同的 partition。kafka sdk 也提供底层接口,可以在生产的时候直接指定 partition,但很少使用。
一个 topic 可以同时有多个消费者,每个消费者有一个 group,消费者需要自行提交自己的消费进度(partition 偏移量)到 kafka,同一个 group 的所有消费者共享一组消费进度信息,同一个 group 中消费者的数量不能超过 partition 的数量。
下面的图片说明了 partition 与消费者,以及消费进度的关系。
下图说明了多个消费 group 的消费进度保存情况
所以,我们可以得出下结论:
一条消息只能存在于一个 partition
一个 partition 只能由一个 group 中的唯一消费者消费(一个消费者可以同时消费多个 partition)
同 group 中的消费者相互竞争消费&#x