KafkaProducer отправляет список сообщений или разбивает список на отдельные сообщения

Можно ли группировать 100 сообщений в один объект и отправлять эти объекты в kafka, или я должен разделить эти 100 сообщений на отдельные сообщения и затем поместить их в kafka. Скажем, например, у меня есть объект, содержащий список. Я могу поместить 100 строк в этот список и отправить объект в Кафку. Лучше сделать это таким образом, или я должен разделить список строк и вместо этого отправить отдельные строки в kafka. Каковы некоторые плюсы и минусы вышеупомянутых подходов?

2 ответа

Пакетирование всегда хорошо при асинхронной обработке, пока вам не понадобится частично обработать пакет в случае ошибок. Если вы обрабатываете заказ и список из 100 пунктов. отправьте их вместе, так как они будут обработаны вместе. Если вы отправляете 100 заказов и будете обрабатывать их самостоятельно, обрабатывайте их один за другим, так как ошибка в одном заказе не должна блокировать другие. Что касается размеров сообщений, у kafka есть некоторые ограничения на размер сообщений, но они настраиваются. Определенно вам нужно улучшить свой вопрос.

Вы хотите отправить огромное сообщение, которое больше, чем конфигурация max.message.bytes вашего брокера kafka (допустим, вы не можете его изменить). Вы ломаете это и соединяете это снова на стороне потребителя.

Это потребует некоторой работы вокруг ограничений развертывания kafka на данный момент. Например, должен ли ваш потребитель обрабатывать все эти 100 строк, как если бы они были одной партией? когда ваш потребитель должен принять решение о корректировке этих сообщений? Ваш потребитель обрабатывает идемпотент? У вас есть один потребитель или несколько потребителей? Что делать, если 100 строк были разделены на 5 разделов? какой потребитель получает какое подмножество этих 100 строк?

Подход состоит в том, чтобы создать 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 также назначит сообщения с тем же ключом к тому же разделу. Имея в виду эти два свойства, вы можете спроектировать систему, которая может принимать сообщения партиями с некоторыми очевидными компромиссами и ограничениями.

Другие вопросы по тегам