键的主要用途有两个:一,用来决定消息被写往主题的哪个分区,拥有相同键的消息将被写往同一个分区,二,还可以作为消息的附加消息 。
如果键值为 null,并且使用默认的分区器,分区器使用轮询算法将消息均衡地分布到各个分区上 。
如果键不为空,并且使用默认的分区器,Kafka 对键进行散列(Kafka 自定义的散列算法,具体算法原理不知),然后根据散列值把消息映射到特定的分区上 。很明显,同一个键总是被映射到同一个分区 。但是只有不改变主题分区数量的情况下,键和分区之间的映射才能保持不变,一旦增加了新的分区,就无法保证了,所以如果要使用键来映射分区,那就要在创建主题的时候把分区规划好,而且永远不要增加新分区 。
2.6.1.自定义分区器某些情况下,数据特性决定了需要进行特殊分区,比如电商业务,北京的业务量明显比较大,占据了总业务量的 20%,我们需要对北京的订单进行单独分区处理,默认的散列分区算法不合适了,我们就可以自定义分区算法,对北京的订单单独处理,其他地区沿用散列分区算法 。或者某些情况下,我们用 value 来进行分区 。
3.Kafka 的消费者3.1.消费者的入门消费者的含义,同一般消息中间件中消费者的概念 。在高并发的情况下,生产者产生消息的速度是远大于消费者消费的速度,单个消费者很可能会负担不起,此时有必要对消费者进行横向伸缩,于是我们可以使用多个消费者从同一个主题读取消息,对消息进行分流 。(买单的故事,群组,消费者的一群人,消费者:买单的,分区:一笔单,一笔单能被买单一次,当然一个消费者可以买多个单,如果有一个消费者挂掉了<跑单了>,另外的消费者接上)
3.2.消费者群组Kafka 里消费者从属于消费者群组,一个群组里的消费者订阅的都是同一个主题,每个消费者接收主题一部分分区的消息 。
文章插图
上图,主题 T 有 4 个分区,群组中只有一个消费者,则该消费者将收到主题 T1 全部 4 个分区的消息 。
文章插图
如上图,在群组中增加一个消费者 2,那么每个消费者将分别从两个分区接收消息,上图中就表现为消费者 1 接收分区 1 和分区 3 的消息,消费者 2接收分区 2 和分区 4 的消息 。
文章插图
如上图,在群组中有 4 个消费者,那么每个消费者将分别从 1 个分区接收消息 。
文章插图
但是,当我们增加更多的消费者,超过了主题的分区数量,就会有一部分的消费者被闲置,不会接收到任何消息 。
往消费者群组里增加消费者是进行横向伸缩能力的主要方式 。所以我们有必要为主题设定合适规模的分区,在负载均衡的时候可以加入更多的消费者 。但是要记住,一个群组里消费者数量超过了主题的分区数量,多出来的消费者是没有用处的 。
如果是多个应用程序,需要从同一个主题中读取数据,只要保证每个应用程序有自己的消费者群组就行了 。
文章插图
3.3.消费者配置消费者有很多属性可以设置,大部分都有合理的默认值,无需调整 。有些参数可能对内存使用,性能和可靠性方面有较大影响 。可以参考
org.apache.kafka.clients.consumer 包下 ConsumerConfig 类 。
auto.offset.reset
消费者在读取一个没有偏移量的分区或者偏移量无效的情况下,如何处理 。默认值是 latest,从最新的记录开始读取,另一个值是 earliest,表示消费者从起始位置读取分区的记录 。
注意:如果是消费者在读取一个没有偏移量的分区或者偏移量无效的情况(因消费者长时间失效,包含的偏移量记录已经过时并被删除)下,默认值是 latest 的话,消费者将从最新的记录开始读取数据( 在消费者启动之后生成的记录),可以先启动生产者,再启动消费者,观察到这种情况 。观察代
码,在模块 kafka-no-spring 下包 hellokafka 中 。
enable .auto.commit
默认值 true,表明消费者是否自动提交偏移 。为了尽量避免重复数据和数据丢失,可以改为 false,自行控制何时提交 。
partition.assignment.strategy
推荐阅读
- 程序员遭遇:一觉睡来7个未接电话,到公司时发现已被踢出群
- 程序员为什么一定要进大公司,除了薪资,这些才是决定性因素
- 某程序员跳槽到银行9天后辞职,晒出技术水平后留言:太落后了
- 成都与盖碗茶,饮盖碗茶有五道程序先容盖碗茶品饮程序
- 高级程序员到底长什么样子?
- 第一个登月的地球人是谁?
- 程序员工作必备:10个超实用的GitHub库
- 应用程序加固Tomcat篇
- 公众号小程序有什么用?
- 程序员用Python实现自动化控制键盘和鼠标