【问题标题】:ordering of data in Kafka for primary and priority queueKafka 中主要和优先级队列的数据排序
【发布时间】:2018-03-17 03:26:15
【问题描述】:

我需要按顺序处理产品 ID,并计划为此使用 kafka,现在如果 kafka 或我的代码丢失数据,我将所有这些产品 ID 保存在可能的数据库中,因此如果记录未在给定时间让我们说 24 小时我需要在队列中重新发布它们,但由于 kafka 对队列中的数据没有优先级概念,所以我可以有另一个可以充当优先级队列的队列。

我面临的问题是我还需要在优先队列中订购产品。因此,如果我基于散列分布在分区中,并且我的消费者再次按顺序处理消息,即维护消费者中每个线程的队列并基于产品 ID 的散列,我可以主要在内存队列中的这些之间分布数据。但是在 2 个队列的情况下,1 个作为主队列,1 个优先级 I 在这些队列中排序。所以来自两个队列的数据应该发送给同一个消费者,这样我就可以在我的代码中保持顺序。

如果我走错了路,或者我应该如何继续,请提出建议。

【问题讨论】:

    标签: java apache-kafka kafka-consumer-api apache-kafka-connect


    【解决方案1】:

    如果您需要,可以这样做。如果您有合理的保留策略和复制因子,您将不会丢失 kafka 中的数据。


    还是怎么做:

    1.设置:

    您可以有两个主题。让我们称它们为正常和优先。你有相同数量的分区,让我们有 4 个。你有相同的分区策略,假设产品 id mod 4。

    2.制作人:

    现在您有了 ID 为 3 的产品的事件。它被发送到正常的主题分区 3。您出于任何原因没有收到它。您现在使用相同的逻辑在优先主题上重新发布有关同一产品的事件,以便它进入同一分区。

    3.消费者:

    在消费者方面,您必须手动分配给特定分区。假设您有两个消费者。您只需为两个主题分配第一个分区 0 和 1(并听两个主题)。第二个分配剩余的两个分区 2 和 3。

    我希望这能回答你的问题。祝你好运!

    【讨论】:

    • 我这里有一个额外的要求。当优先级消息到达时,该组中的所有其他消费者都应等待该优先级消息被处理。是否可以让消费者互相交谈?我的调查表明它没有。
    • 可以的。即使在stackoverflow上也有很多关于“kafka pause consumer”查询的答案。消费者 API 上暴露了暂停,您也可以停止消费者并重新启动它或继续消费相同但不处理和重置偏移量。只要您在一个应用程序中拥有所有 kafka 消费者,它就可以工作。如果没有,您需要为他们提供外部沟通渠道。
    • 谢谢。在分析了利弊之后,我得出的结论是,这是不必要的,不值得努力。因为这实际上将异步系统转换为同步。
    猜你喜欢
    • 2014-08-05
    • 1970-01-01
    • 1970-01-01
    • 2012-11-01
    • 1970-01-01
    • 2011-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多