Kafka核心技术与实战 09 生产者消息分区机制原理剖析

本文介绍了Kafka的分区策略,包括默认的轮询和按消息键保序策略,以及自定义分区策略如随机策略。在消息重试时,分区策略不会改变,确保消息仍发送到同一分区。Kafka与RocketMQ相比,Kafka侧重大数据场景,吞吐量大,而RocketMQ适合金融业务,国内技术支持更优。若要避免消息乱序,可设置`max.in.flight.requests.per.connection=1`。在生产消息时,可通过`producer.send(newProducerRecord(my-topickeyvalue))`指定消息键。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

分区

分区提供负载均衡、高性能

分区策略

所谓分区策略是决定生产者将消息发送到哪个分区的算法,Kafka 为我们提供了默认的分区策略,同时它也支持你自定义分区策略。

  • 自定义分区策略
  • 轮询策略
  • 随机策略
  • 按消息键保序策略,Key-ordering 策略

轮询

随机

Kafka 允许为每条消息定义消息键,简称为 Key。这个 Key 的作用非常大,它可以是一个有着明确业务含义的字符串,比如客户代码、部门编号或是业务 ID 等;也可以用来表征消息元数据。特别是在 Kafka 不支持时间戳的年代,在一些场景中,工程师们都是直接将消息创建时间封装进 Key 里面的。一旦消息被定义了 Key,那么你就可以保证同一个 Key 的所有消息都进入到相同的分区里面,由于每个分区下的消息处理都是有顺序的,故这个策略被称为按消息键保序策略,如下图所示。

前面提到的 Kafka 默认分区策略实际上同时实现了两种策略:如果指定了 Key,那么默认实现按消息键保序策略;如果没有指定 Key,则使用轮询策略。

Java客户端默认的生产者分区策略的实现类为org.apache.kafka.clients.producer.internals.DefaultPartitioner。默认策略为:如果指定了partition就直接发送到该分区;如果没有指定分区但是指定了key,就按照key的hash值选择分区;如果partition和key都没有指定就使用轮询策略。而且如果key不为null,那么计算得到的分区号会是所有分区中的任意一个;如果key为null并且有可用分区时,那么计算得到的分区号仅为可用分区中的任意一个

常见问题

  • 在消息重试的时候,分区策略会重新再计算一次吗?比如一开始选择到5号分区,但是5号分区有问题导致重试,重试的时候可以重试发送到别的分区上吗?

不会的。消息重试只是简单地将消息重新发送到之前的分区

  • kafka和rocketMQ的对比

\1. Kafka吞吐量大,多是面向大数据场景。RocketMQ吞吐量也很强, 不过它号称是金融业务级的消息中间件,也就是说可以用于实际的业务系统;2. RocketMQ毕竟是阿里出品,在国内技术支持力度要比Kafka强;3. Kafka现在主要发力Streaming,RocketMQ在流处理这块表现如何我不太清楚,至少streaming不是它现阶段的主要卖点。

  • 一个生产者,发两次消息,但是网络原因,消息到达的顺序和消息发送的顺序不一致

防止乱序可以通过设置max.in.flight.requests.per.connection=1来保证

  • key在哪指定,怎么指定啊

Producer发送消息的时候可以直接指定key,比如producer.send(new ProducerRecord(“my-topic”, “key”, “value”));

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lakernote

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值