使用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 {

更改主题中的分区数会更改目标分区,因此您可能需要考虑自定义分区程序。