Apache kafka 卡夫卡流消息消费顺序

Apache kafka 卡夫卡流消息消费顺序,apache-kafka,apache-kafka-streams,Apache Kafka,Apache Kafka Streams,本主题包含10个分区,每个分区每3到4秒由各种物联网设备生成一次消息。消息上的键是LocationId和DeviceId。该值是与设备相关的详细信息 流拓扑部署到4个EC2实例。该过程必须确定每个设备的最新更新值,并分析关键性 我看到的是,由于消息分布在多个分区中,流消费者看到的是较旧的消息,而它们并没有按顺序排列 如何确定特定密钥的最新消息 我在Kafka集群上看到以下消息行为- L1D1 at 1:00 am - critical=false (P1) L2D2 at 1:00 am - c

本主题包含10个分区,每个分区每3到4秒由各种物联网设备生成一次消息。消息上的键是LocationId和DeviceId。该值是与设备相关的详细信息

流拓扑部署到4个EC2实例。该过程必须确定每个设备的最新更新值,并分析关键性

我看到的是,由于消息分布在多个分区中,流消费者看到的是较旧的消息,而它们并没有按顺序排列

如何确定特定密钥的最新消息

我在Kafka集群上看到以下消息行为-

L1D1 at 1:00 am - critical=false (P1)
L2D2 at 1:00 am - critical=false (P1)
L1D1 at 1:02 am - critical=**true** (P2)
L2D2 at 1:05 am - critical=false (P1)
L1D1 at 1:03 am - critical=false (P2)
L2D2 at 1:03 am - critical=false (P1)
请注意,在1:02时,设备D1发出严重警报,但在1:03时没有。如果流处理消息是1:03、1:02(基于分区的任意随机顺序)


由于订单无法保证,我如何有效地确定特定设备的最新消息?

您的流处理策略是什么?KSQL还是SDK? 如果您使用KSQl,您只需要创建一个流/表

检查:
您的流处理策略是什么?KSQL还是SDK? 如果您使用KSQl,您只需要创建一个流/表

检查:

由于订单无法保证,如何有效地确定特定设备的最新消息

Kafka保证消息在主题分区内排序,但不能跨多个主题分区排序。您需要做的是确保来自同一设备的消息被发送到同一主题分区。如果尚未更改Kafka的默认设置,则可以通过使用特定于设备的标识符(想想:
DeviceId
)来实现这一点

我看到的是,由于消息分布在多个分区中,流消费者看到的是较旧的消息,而它们并没有按顺序排列

如果使用类似于
(LocationId,DeviceId)
的复合键,则无法按顺序获取同一设备的更新,因为该设备的消息分布在多个分区中,因为消息键还包括
LocationId

该过程必须确定每个设备的最新更新值,并分析关键性。[…]由于订单无法保证,我如何有效地确定特定设备的最新消息

在您的情况下,我会将消息键从
(LocationId,DeviceId)
更改为仅
DeviceId
。让我们称之为“D流”

如果您仍然需要按
(LocationId,DeviceId)
进行原始分组,则可以通过随后将流D从
DeviceId
重新分组(也称为重新键控,也称为重新分区)到
(LocationId,DeviceId)
到新的派生流LD来实现这一点

由于订单无法保证,如何有效地确定特定设备的最新消息

Kafka保证消息在主题分区内排序,但不能跨多个主题分区排序。您需要做的是确保来自同一设备的消息被发送到同一主题分区。如果尚未更改Kafka的默认设置,则可以通过使用特定于设备的标识符(想想:
DeviceId
)来实现这一点

我看到的是,由于消息分布在多个分区中,流消费者看到的是较旧的消息,而它们并没有按顺序排列

如果使用类似于
(LocationId,DeviceId)
的复合键,则无法按顺序获取同一设备的更新,因为该设备的消息分布在多个分区中,因为消息键还包括
LocationId

该过程必须确定每个设备的最新更新值,并分析关键性。[…]由于订单无法保证,我如何有效地确定特定设备的最新消息

在您的情况下,我会将消息键从
(LocationId,DeviceId)
更改为仅
DeviceId
。让我们称之为“D流”


如果您仍然需要按
(LocationId,DeviceId)
进行原始分组,您可以通过随后将流D从
DeviceId
重新分组(也称为重新键控,也称为重新分区)到
(LocationId,DeviceId)
到新的,派生流LD.

此表在内存中是否会继续增长?否,取决于您对它的分组方式,它将只获取每个组的最新值,请查看一些KSQL视频。KSQL需要额外的服务器。这是可以通过其他方式实现的吗?那么你需要使用kafka sdk,这个表在内存中会继续增长吗?不,取决于你如何分组,每个组只获取最新的值,看看一些KSQL视频。KSQL需要额外的服务器。这可以通过其他方式实现吗?那么您需要使用kafka sdk