【发布时间】:2022-01-25 17:22:29
【问题描述】:
我正在尝试了解如何将 Kafka 用于实时通知。假设我有一个用于警报目的的 kafka 主题。各种服务使用此主题向用户发送更新。
有 10 个通知服务实例正在运行并使用来自该主题的消息。
在线用户将分布在 10 个实例中。例如:User1 可能通过 websocket 连接连接到实例 8。
那么如何确保正确通知用户呢?即如何保证只有Instance8在为User1处理消息?
【问题讨论】:
标签: apache-kafka
我正在尝试了解如何将 Kafka 用于实时通知。假设我有一个用于警报目的的 kafka 主题。各种服务使用此主题向用户发送更新。
有 10 个通知服务实例正在运行并使用来自该主题的消息。
在线用户将分布在 10 个实例中。例如:User1 可能通过 websocket 连接连接到实例 8。
那么如何确保正确通知用户呢?即如何保证只有Instance8在为User1处理消息?
【问题讨论】:
标签: apache-kafka
这个问题需要从多个角度来解决——让我们来看看每一个......
首先 - 消费者方面...
您需要与消费者应用程序实例(即通知服务)一样多的分区 - 在您的情况下,您有 10 个实例,因此主题有 10 个分区(或 10 的倍数)。这将确保没有任何服务实例处于空闲状态。此外,他们需要属于同一消费者群体。现在,有几种不同的分区分配方法可用,您可能需要研究这些方法以找出适合您情况的方法 - 这是一个很好的 reference article。
user-1 到user-10 必须由notification-service-1 处理,那么StickyAssignor 可能最适合你。第二个 - 制作方...
将数据写入给定 Kafka 主题的生产者应用程序应确保将与特定用户相关的数据发送到特定分区。
由于 Kafka 消息由 key-value 对组成,因此您需要确保密钥不是 null。最好是使用一些user-related-information 作为key - 这样您可以确保任何分区中的消息都被指定的消费者实例消费。
最后,请注意,我省略了用户(套接字连接)映射到哪个通知服务实例的部分,因为它超出了 Kafka,我不确定该部分是否设计是否严格。
【讨论】: