kafka基础

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 与消费者,以及消费进度的关系。
kafka基础

下图说明了多个消费 group 的消费进度保存情况
kafka基础

所以,我们可以得出下结论:

一条消息只能存在于一个 partition
一个 partition 只能由一个 group 中的唯一消费者消费(一个消费者可以同时消费多个 partition)
同 group 中的消费者相互竞争消费,共享消费进度信息;不同 group 的消费者并行消费,互不影响
适当增加 partition 的数量和同 group 消费者数量可以提高消费速度
同一个 group 的消费者会按顺序消费同一个 partition 的消息
FAQ
如何选取 partition 数量?
一般取 24。

如何实现生产一条消息通知多个业务方?
不同业务方使用自己的消费 group。

如何提高消息吞吐量?
增加 partition 数量,增加 consumer 数量,message key 尽量随机(保证各 partition 消息数量均衡)。

如何实现有序消费?
需要按顺序消费的消息需要使用相同的 message key,比如 uid 或 room_id,保证消息都投递到相同的 partition,进而保证有序消费。