【问题标题】:Kafka : Does Kafka provide support for application level state transition?Kafka:Kafka 是否提供对应用程序级状态转换的支持?
【发布时间】:2016-08-09 18:51:39
【问题描述】:

假设,我有一个包含 6 个分区和 2 个消费者的主题,其中 P1、P2、P3 由 C1 处理,P4、P5、P6 由 C2 处理。假设用户数据 U1 总是到 P1,U2 到 P2 等等。

所以,

C1 maintains state of users U1, U2, U3
C2 maintains state of users U4, U5, U6.

现在让我们假设我们再添加一个消费者 C3,以便重新平衡发生,现在

P1, P2, P3 -> C1
P4, P5 -> C2
P6 -> C3

所以我的应用程序在 C2 中维护用户 U6 状态,但现在 U6 数据正在流向 C3

现在不知何故,U6 状态从 C2 流向 C3。那么这是如何在 Kafka 中实现的,知道这是一个非常常见的问题

如果Kafka不提供任何支持,那么这个问题一般是怎么解决的……有什么设计模式可以解决吗?

【问题讨论】:

    标签: apache-kafka messaging kafka-producer-api advanced-queuing kafka-python


    【解决方案1】:

    Kafka 不会为您这样做——您需要为此开发自己的逻辑。是的,这是一个常见问题,但在某些方面,您要做的事情与 Kafka 的设计目标背道而驰。想要大开眼界,请参阅 Kafka 设计的一些背景知识here

    具体来说,请阅读“不要害怕文件系统”部分。通过构建(我假设是复杂的)内存数据结构来维护状态,您正在使您的问题变得更加困难。为什么不将该状态记录到 Kafka,然后消费者可以从前一个消费者停止的地方继续?

    一旦你的想法变成了——首先我将数据放入 Kafka,然后我在我的应用程序中使用它——那么这意味着你的所有消费者都可以访问相同的数据。内存缓存中没有“私有”。而且你的问题更容易解决。

    【讨论】:

    • 谢谢!好像你是在问我通过 __consumer_offsets 主题在 Kafka 中提交“偏移量”的方式?
    • 类似的解决方案,是的。我什么都做。实际上,另一种方法是不打扰保持状态。 Kafka 针对读取大量消息进行了优化。只需让(新)消费者从头开始阅读来建立自己的状态。以后再优化吧。
    • 另一种选择是使用Zookeeper,这是Kafka在__consumer_offsets之前使用的。不久前我问了一个与此相关的问题,您可能会感兴趣:stackoverflow.com/questions/35869786/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多