gpt4 book ai didi

apache-kafka - 当使用多个分区时,在 kafka 处标记逻辑部分的结尾

转载 作者:行者123 更新时间:2023-12-04 10:54:17 24 4
gpt4 key购买 nike

我想分享一个我使用的问题和解决方案,因为我认为它可能对其他人有益,如果人们有任何其他解决方案,请分享。
我有一个包含 1,000,000 行的表,我想将其发送到 kafka,并将数据分布在 20 个分区之间。
我想在生产者到达数据末尾时通知消费者,我不想在生产者和消费者之间建立直接联系。
我知道kafka被设计为逻辑上无穷无尽的数据流,但我仍然需要标记特定表的末尾。
有人建议计算每个逻辑部分的项目数,并将此数据发送(到元数据主题),这样消费者将能够计算项目数,并知道逻辑部分何时结束。
这种方法有几个缺点:

  • 由于数据在分区之间分布,我可以知道我的逻辑部分共有 x 个项目,但是如果有多个消费者(每个分区一个),他们将需要共享每个逻辑部分的消耗消息计数器。我想避免这种复杂性。此外,当消费者停止并恢复时,它需要知道已经消费了多少项目并保持上下文。
  • 常规生产者 session 保证至少一次交付,这意味着我可能有重复的消息。计算消息需要考虑到这一点(并避免计算重复的消息)。
  • 还有一种情况,我事先不知道每个逻辑 session 的项目数,(我也是一种消费者,消费事件流并在数据结束时发出信号),所以在这种情况下,生产者也会需要有一个计数器,在停止和恢复时保持它等。有几个生产者需要共享计数器等。所以它给过程增加了很多复杂性。
  • 最佳答案

    解决方案1:

    我实际上希望每个分区的最后一条消息表明它是最后一条消息。

    我可以提前做一些工作,创建一些随机消息 key ,发送按 key 分区的消息,并测试每条消息指向哪个分区。由于按键分区是确定性的(对于给定数量的分区),我想准备一个键和目标分区的映射。例如键:'xyz'指向分区#0,键'hjk'指向分区#1等等,最后有反向映射,所以对于分区0,使用键'xyz',对于分区1,使用键'hjk' 等

    现在我可以使用随机分区策略发送整个表(最后 20 行除外),因此几乎整个表的数据都分布在分区之间。
    当我来到最后 20 行时,我将使用分区键发送它们,我将为每个消息设置分区键,它将消息散列到不同的分区。这样,20 个分区中的每一个都将获得最后 20 条消息之一。对于最后 20 条消息中的每一条,我将设置一个相关的 header ,表明它是最后一条。

    解决方案2:
    与解决方案 1 类似,但将整个表传播到随机分区。现在发送 20 条元数据消息,我将使用按键分区策略(通过设置适当的键)将这些消息定向到 20 个分区。

    解决方案 3:
    有额外的控制主题。在表完全发送到数据主题后,向控制主题发送一条消息,说表已完成。消费者需要不时地测试控制主题,当它收到“数据结束”消息时,它会知道如果它到达分区的末尾,它实际上到达了该分区的数据的末尾。这个解决方案不太灵活,也不太推荐,但我也写了它。

    关于apache-kafka - 当使用多个分区时,在 kafka 处标记逻辑部分的结尾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59304389/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com