【问题标题】:Can Kafka be used for real time notification?Kafka可以用于实时通知吗?
【发布时间】:2022-01-25 17:22:29
【问题描述】:

我正在尝试了解如何将 Kafka 用于实时通知。假设我有一个用于警报目的的 kafka 主题。各种服务使用此主题向用户发送更新。

有 10 个通知服务实例正在运行并使用来自该主题的消息。

在线用户将分布在 10 个实例中。例如:User1 可能通过 websocket 连接连接到实例 8。

那么如何确保正确通知用户呢?即如何保证只有Instance8在为User1处理消息?

【问题讨论】:

    标签: apache-kafka


    【解决方案1】:

    这个问题需要从多个角度来解决——让我们来看看每一个......

    首先 - 消费者方面...

    您需要与消费者应用程序实例(即通知服务)一样多的分区 - 在您的情况下,您有 10 个实例,因此主题有 10 个分区(或 10 的倍数)。这将确保没有任何服务实例处于空闲状态。此外,他们需要属于同一消费者群体。现在,有几种不同的分区分配方法可用,您可能需要研究这些方法以找出适合您情况的方法 - 这是一个很好的 reference article。

    • 举个例子 - 如果你有 100 个用户并且user-1 到user-10 必须由notification-service-1 处理,那么StickyAssignor 可能最适合你。
    • 或者,您甚至可以编写自定义分区分配器,上面提到的参考文章也提供了一些相关信息

    第二个 - 制作方...

    将数据写入给定 Kafka 主题的生产者应用程序应确保将与特定用户相关的数据发送到特定分区。

    由于 Kafka 消息由 key-value 对组成,因此您需要确保密钥不是 null。最好是使用一些user-related-information 作为key - 这样您可以确保任何分区中的消息都被指定的消费者实例消费。

    最后,请注意,我省略了用户(套接字连接)映射到哪个通知服务实例的部分,因为它超出了 Kafka,我不确定该部分是否设计是否严格。

    【讨论】:

    • 我猜到了。但我不想在用户和相应的通知服务实例之间保持粘性会话。好像没有办法了。
    • 我担心的是 - 如果 instance8 出现故障怎么办。?在建议的方法中,user1 客户端应用程序将等待 instance8 再次建立会话。
    • 好的。因此,如果 notification-service-instance-{1-10} 不一定是严格的,那么你很好,即你的设计变得更加简单。如果一个实例出现故障,其他可用实例之一将拾取空闲分区,直到该实例恢复运行。在这段时间内,它将继续为这些用户提供服务。
    • 你没有明白这一点! “它将继续为这些用户服务”——保证是什么?例如:instance8 出现故障。所以 websocket 会话将被杀死。客户端应用程序将尝试重新建立连接。它可能会落在instance6上。现在,instance6 正在为用户处理分区的保证是什么。
    • 因此,如果您需要绝对可预测性(一致性)和实例获取空闲分区的顺序,您可能需要编写自己的分区分配器(执行此操作的各种方法)。另一种选择,如果您不想编写自定义分区分配器,那么您可以用可用性换取一致性,即受影响的用户保持断开连接,直到预期的服务实例恢复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-12
    • 2010-09-23
    • 2010-12-08
    • 1970-01-01
    • 1970-01-01
    • 2023-01-26
    相关资源
    最近更新 更多