kafka sticky partitioner介绍及java和c++ librdkafka代码示例

背景:

kafka在2.4.0版本合入的一个KIP-480,它的核心逻辑就是当存在无key的序列消息时,我们消息发送的分区优先保持粘连,如果当前分区下的batch已经满了或者 linger.ms延迟时间已到开始发送,就会重新启动一个新的分区。这种策略使得每个batch更大,能够显著地降低给消息指定分区过程中的延时和请求数。

冲突:

sticky策略在kafka2.4版本以后在java和c++客户端的default partitioner(c++中为consistent random partitioner)中是默认使用的,对于无key的消息会使用sticky partitioner的逻辑,但针对有key的消息,kafka还是会使用default partitioner。这使得我们无法让有key的消息也使用sticky partitioner,在kafka官方文档中也没有示例。

解决方案:

1. java kafka客户端
首先想要使用带有sticky策略的kafka clients就需要在pom.xml引入2.6及以上版本的依赖。然后通过kafka producer的config设定partitioner,代码如下所示。

Properties props = new Properties();
props.put(ProducerConfig.PARTITIONER_CLASS_CONFIG, UniformStickyPartitioner.class);

通过这段代码将partitioner设定为UniformStickyPartitioner,就可以将所有消息都通过sticky策略发送了,无论消息是否有key。
2. c++ librdkafka客户端
不幸的是在librdkafka中的kafka client和java版本完全不同,也没有UniformStickyPartitioner而使用一个rd_kafka_msg_sticky_partition的方法来实现sticky策略,所以如果想要仅使用sticky策略就需要更改librdkafka的代码,比如说增加一个参数,然后更改consistent random partitioner的部分逻辑,将有key的消息也通过调用rd_kafka_msg_sticky_partition来选择分区。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值