使用kafka partitioner作为锁
Use kafka partitioner as a lock
我有一个 spring 引导应用程序将消息发送到 Kafka 主题,例如:
public class Message {
@JsonProperty("customer_id")
@SerializedName("customer_id")
private String customerId;
...
}
为了一些业务逻辑,我不想并行处理同一客户的2条消息。我想使用 Kafka 分区顺序作为某种锁。
据我所知,我可以使用 customerId 作为消息的键,并使用自定义分区程序(实现 Kafka 分区程序)将具有相同键的消息定向到同一分区。
虽然我假设我不是历史上第一个寻求这种功能的人,但我发现很难找到某种 library/documentation 来实现这种功能。
谁能指导我找到满足我需求的现有解决方案?
这是默认分区程序的行为;查看它的 javadocs:
/**
* The default partitioning strategy:
* <ul>
* <li>If a partition is specified in the record, use it
* <li>If no partition is specified but a key is present choose a partition based on a hash of the key
* <li>If no partition or key is present choose the sticky partition that changes when the batch is full.
*
* See KIP-480 for details about sticky partitioning.
*/
public class DefaultPartitioner implements Partitioner {
更改主题中的分区数会更改目标分区,因此您可能需要考虑自定义分区程序。
我有一个 spring 引导应用程序将消息发送到 Kafka 主题,例如:
public class Message {
@JsonProperty("customer_id")
@SerializedName("customer_id")
private String customerId;
...
}
为了一些业务逻辑,我不想并行处理同一客户的2条消息。我想使用 Kafka 分区顺序作为某种锁。 据我所知,我可以使用 customerId 作为消息的键,并使用自定义分区程序(实现 Kafka 分区程序)将具有相同键的消息定向到同一分区。 虽然我假设我不是历史上第一个寻求这种功能的人,但我发现很难找到某种 library/documentation 来实现这种功能。 谁能指导我找到满足我需求的现有解决方案?
这是默认分区程序的行为;查看它的 javadocs:
/**
* The default partitioning strategy:
* <ul>
* <li>If a partition is specified in the record, use it
* <li>If no partition is specified but a key is present choose a partition based on a hash of the key
* <li>If no partition or key is present choose the sticky partition that changes when the batch is full.
*
* See KIP-480 for details about sticky partitioning.
*/
public class DefaultPartitioner implements Partitioner {
更改主题中的分区数会更改目标分区,因此您可能需要考虑自定义分区程序。