большой лист json'ов:
list_of_msgs = [{msg1}, {msg2}, {msg3}...{msgN}]
я создаю продюсера (питон, библиотека kafka-python. чем будут читать - не знаю)
producerobj = KafkaProducer()
далее я итерируюсь по листу и отправляю каждое сообщение, делая flush раз в сто сообщений
counter = 0
for msg in list_of_msgs:
producerobj.send(msg)
counter += 1
if counter % 100 = 0:
producerobj.flush()
Так работает очень долго.
Кажется, можно отправлять в кафку батчами, по крайней мере есть такой параметр у продюсера.
Но я не очень понимаю как организовать это, получается просто без цикла положить весь лист в отправку, а кафка под капотом будет отправлять сообщения в зависимости от наполненности и разобъет сообщение на батчи, как я установил в настройках продьюсера?
типа вот так и все:
Вариант 1:
producerobj.send(list_of_msgs)
Но как тогда делать flush раз в сто сообщений?
Или мне нужно самостоятельно написать как итерироваться по списку, и отправлять по сто сообщений, например:
Вариант 2:
for i in range(0, len(list_of_msgs), 100):
producerobj.send(list_of_msgs[i: i+100])
producerobj.flush()
Вопросы:
* Какой вариант лучше 1 или 2
* Верно ли я понимаю, что я могу в send положить список сообщений, а не сообщение, и тогда кафка под капотом будет отправлять этот список по кусочкам, в зависимости от установленного размера батча?
зависит от клиентской библиотеки, конечно, но как правило вы устанавливаете размеры пакетов батчей, и клиент сам под капотом отправляет батч каждый раз, когда набирает сообщения. за это могут отвечать и flush_interval, и минимальный размер батча, и максимальный размер батча. ответы на вопросы: * чаще всего достаточно 1 варианта, обычно клиентские библиотеки сами за вас будут отправлять батчи. если вы хотите удостовериться, что после пачки сообщений все были точно отправлены - можете дергать вручную. * правильно, с условием, если клиентская библиотека имеет соответствующий функционал.
Спасибо большое! Библиотека kafka-python, в ней у продюсера есть настройки batch_size и linger_ms, я так понимаю, первый параметр отвечает за размер батча, второй за время (что кажется бессмысленно, в моем случае, если отправить в send лист) Попробую вариант 1
Обсуждают сегодня