KafkaProducer将消息列表或中断列表发送到单个消息中

时间:2018-04-16 19:02:06

标签: apache-kafka kafka-producer-api

是否可以将100个消息批量处理到单个对象并将这些对象发送到kafka,或者我应该将这100个消息拆分成单个消息然后将它们放入kafka 比方说,我有一个包含List的对象。我可以在该列表中放入100个字符串并将该对象发送到kafka。这样做是否更好,或者我应该拆分字符串列表并将单个字符串发送到kafka 上述方法有哪些优点和缺点

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

您希望发送超过kafka代理的max.message.bytes配置的巨大消息(假设您无法更改它)。你把它分解并在消费者一方把它重新组合在一起。

到目前为止,这需要围绕kafka部署的局限性进行一些工作。例如  您的消费者是否应该处理所有这100个字符串,就像它们是一批一样?您的消费者何时决定为这些消息提交抵消?您的消费者处理是否是幂等的?您是否有一个消费者或多个消费者实例?如果100个字符串分成5个分区怎么办?哪个消费者获得这100个字符串的哪个子集?

一种方法是使用相同的批次ID创建100个消息标记,如此

  (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还会将具有相同密钥的消息分配给同一分区。考虑到这两个属性,您可以设计一个系统,可以批量使用消息,并有一些明显的权衡和限制。