【问题标题】:KafkaProducer send a list of messages or break list into individual messagesKafkaProducer 发送消息列表或将列表拆分为单个消息
【发布时间】:2018-04-17 10:36:12
【问题描述】:

可以将 100 条消息批处理到单个对象中并将这些对象发送到 kafka,还是应该将这 100 条消息拆分为单独的消息,然后将它们放入 kafka 例如,我有一个包含列表的对象。我可以在该列表中放入 100 个字符串并将对象发送到 kafka。这样做更好还是我应该拆分字符串列表并将单个字符串发送到kafka 上述方法有哪些优缺点

【问题讨论】:

    标签: apache-kafka kafka-producer-api


    【解决方案1】:

    在异步处理时批处理总是好的,直到您需要部分处理批处理以防出错。 如果您正在处理一个订单并且 100 的列表是项目。将它们一起发送,因为它们将一起处理。如果您要发送 100 个订单,并且将独立处理,请逐个处理,因为一个订单中的错误不应阻塞其他订单。 至于消息大小,kafka 有一些消息大小限制,但这些都是可配置的。 毫无疑问,您需要改进您的问题。

    【讨论】:

      【解决方案2】:

      你想发送一个超过你的 kafka 代理的 max.message.bytes 配置的巨大消息(假设你不能改变它)。您将其分解并在消费者端重新组合在一起。

      到目前为止,这需要一些解决 kafka 部署限制的工作。例如 您的消费者是否应该像处理一批一样处理所有这 100 个字符串?您的消费者应该何时决定提交这些消息的偏移量?你的消费者处理是幂等的吗?您有一个消费者还是多个消费者实例?如果 100 个字符串被分成 5 个分区会怎样?哪个消费者得到这 100 个字符串的哪个子集?

      一种方法是创建 100 条消息,所有消息都具有相同的批次 ID,就像这样

        (batch1:message1, batch1:message2, batch1:message3)
      

      在消费者端使用相同的密钥收集所有这些消息

        (batch1: (message1, message2, message3))
      

      但是,您怎么知道批次何时结束? message1、message2、message3 的顺序重要吗?

      所以你做这样的事情

        (batch1:message1of3, batch1:message2of3, batch1:messsage3of3)
      

      现在,如果您收到 message1of3 和 message2of3 但没有收到 message3of3 怎么办?你要等多久?

      如您所见,在每一步都有多种方法可以解决此问题,您必须针对您的问题做出正确的选择。也许,你会使用超时,也许在你的情况下批次是这样交错的

        (batch1:message1of3, batch2:message2of5, batch1:message2of3...)
      

      希望做出一些妥协。使用 Kafka,您的消费者组可以保证接收所有消息,并且在它运行时,任何消费者都被分配一个或多个分区(意味着单个分区不会同时分配给多个消费者)。 Kafka 还会将具有相同 key 的消息分配给同一个分区。考虑到这两个属性,您可以设计一个可以批量使用消息的系统,但有一些明显的权衡和限制。

      【讨论】:

        猜你喜欢
        • 2016-09-21
        • 1970-01-01
        • 2021-07-23
        • 1970-01-01
        • 1970-01-01
        • 2017-03-30
        • 1970-01-01
        • 1970-01-01
        • 2020-12-05
        相关资源
        最近更新 更多