Почему продюсер в пикафке такой медленный?

Я написал простой продюсер, используя pykafka, но не могу заставить его работать. Основной производитель и призыв к производству ниже. Когда я вызываю это 100 раз с небольшим сообщением и добавляю код синхронизации / профилирования, это занимает около 14 секунд. Я понимаю, что это асинхронная отправка сообщений, поэтому я ожидаю, что это будет невероятно быстро. Есть ли какие-то настройки, которые мне не хватает? Я также попробовал это с min_queued_messages=1, и это занимает около 2 секунд дольше.

from pykafka import KafkaClient
import time

client = KafkaClient(hosts="kafka1.mydomain.com:9092", exclude_internal_topics=False)
topic = client.topics['mytopic']

start = time.time()

for x in xrange(100):
    with topic.get_producer(delivery_reports=False,
                            sync=True,
                            linger_ms=0) as producer:
        producer.produce("This is a message")

end = time.time()
print "Execution Time (ms): %s" % round((end - start) * 1000)

Я сделал профиль этого в Pycharm и говорит, что 78,8% времени тратится на "time.sleep"?! Почему это будет спать?

1 ответ

topic.get_producer вызов должен быть вызван один раз в начале срока службы производителя. Вызов его в узком цикле, как это делает ваш пример кода, приведет к многократному выполнению последовательности инициализации, что не нужно и добавит много накладных расходов. Ваш код будет работать быстрее, если он будет изменен на следующее:

with topic.get_producer(delivery_reports=False,
                        sync=True,
                        linger_ms=0) as producer:
    for x in xrange(100):
        producer.produce("This is a message")
Другие вопросы по тегам