生产者生产消息到主题的某个分区,消者以消费者组的名义(组内有多个消费者)订阅主题进行接收消息。我们
都知道:同一分区,只能由同一个消费者组内的一个消费者消费,那么生产者的消发送给哪个分区?消费者组
消费哪个分区?
一、分区与主题
默认分区数量是通过 server properties的num. partitions获得,具体可在创建主题时指定,这里不在讲述。
二、分区与生产者
org.apache.kafka.clients.producer.internals.Default Partitioner
默认策略
- 如果在发消息的时候指定了分区,则消息投递到指定的分区
- 如果没有指定分区,但是消息的key不为空,则基于key的哈希值来选择一个分区
- 如果既没有指定分区,且消息的key也是空,则用轮询的方式选择一个分区
三、分区与消费者
其实就是组内的消费者负责主题下的分区,即消费者和分区是一对多的关系(同一消费组)。
分区数与组内消费者数
若分区数大于组内消费者数,那么就相当于有个别消费者会负责多个分
若相等消费者负责一个分区
若小于,说明有个别消费者空闲,获取不到消息。
以上只针对默认策略。自定义策略继承org.apache.kafka.clients.consumer.internals.AbstractPartitionAssignot
默认策略
Range
- 首先,将分区按数字顺序排好序,消费者按消费者名称的字典序排好序
- 然后,用分区总数除以消费者总数。如果能够除尽,则皆大欢喜,平均分配;若除不尽,则位于排序前面的消费者将多负责一个分区
Roundrobin(轮询)
以上就是简单入门,对 Kafka各个组件以及消费和生产有个大概了解