是否可以将100个消息批量处理到单个对象并将这些对象发送到kafka,或者我应该将这100个消息拆分成单个消息然后将它们放入kafka 比方说,我有一个包含List的对象。我可以在该列表中放入100个字符串并将该对象发送到kafka。这样做是否更好,或者我应该拆分字符串列表并将单个字符串发送到kafka 上述方法有哪些优点和缺点
答案 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还会将具有相同密钥的消息分配给同一分区。考虑到这两个属性,您可以设计一个系统,可以批量使用消息,并有一些明显的权衡和限制。