Java Kafka流、流程API和使用密钥的调度

Java Kafka流、流程API和使用密钥的调度,java,apache-kafka,apache-kafka-streams,Java,Apache Kafka,Apache Kafka Streams,我有一个卡夫卡主题,由256个分区组成,其中存储的数据格式如下,ID用作键 { "id":<UUID>, "userId":<Users-UUID>, // rest of the key-value are omitted for brevity } { “id”:, “用户ID”:, //为简洁起见,省略了键值的其余部分 } 由于资源可用性和其他系统限制,对于给定用户,我们每秒最多可以处理N个事件 我正在使用带有状态存储的Kafka Str

我有一个卡夫卡主题,由256个分区组成,其中存储的数据格式如下,ID用作键

{
    "id":<UUID>,
    "userId":<Users-UUID>,
    // rest of the key-value are omitted for brevity
}
{
“id”:,
“用户ID”:,
//为简洁起见,省略了键值的其余部分
}
由于资源可用性和其他系统限制,对于给定用户,我们每秒最多可以处理N个事件

我正在使用带有状态存储的Kafka Streams进程API希望为每个用户创建一个调度任务。

根据资源可用性,将处理给定用户的事件。如果没有可用的资源,则不会处理任何内容

由于ID用作键,并且应用程序是水平缩放的,我如何能够使用用户ID按流分组,以便属于用户的所有事件登录到特定应用程序实例,并仅存储在一个应用程序的状态存储中


我不想在多个应用程序实例中安排用户任务,因为我不想稍后进入与协调相关的实现

将用户id作为密钥发送,将消息作为值发送。因此,所有具有相同用户ID的事件/消息都将进入同一分区,那么分配给该特定用户的用户应用程序将处理该特定用户的所有消息。即使在水平扩展应用程序时,分区也将仅分配给消费者应用程序。不幸的是,使用用户id作为密钥不是一个选项,因为1)用户id没有为我们提供正确和必需的密钥分配和并行性2)更改这是不可能的,因为它会影响生产中的其他应用程序。1)然后编写您自己的产品无此选项,因为生产商在系统之外运行,我无法控制。您在问题中说:
id是用作键
——那么数据应该已经按键分区了吗?如果没有,数据是如何分布的?将用户id作为键发送,将消息作为值发送。因此,所有具有相同用户ID的事件/消息都将进入同一分区,那么分配给该特定用户的用户应用程序将处理该特定用户的所有消息。即使在水平扩展应用程序时,分区也将仅分配给消费者应用程序。不幸的是,使用用户id作为密钥不是一个选项,因为1)用户id没有为我们提供正确和必需的密钥分配和并行性2)更改这是不可能的,因为它会影响生产中的其他应用程序。1)然后编写您自己的产品无此选项,因为生产商在系统之外运行,我无法控制。您在问题中说:
id是用作键
——那么数据应该已经按键分区了吗?如果没有,数据是如何分布的?