Разница в производстве кафки между флешем и опросом - PullRequest
0 голосов
/ 01 октября 2018

У нас есть потребитель Kafka, который будет читать сообщения и делать подобные вещи, а затем снова публиковать их в теме Kafka, используя приведенный ниже скриптконфигурация типа queue.buffering.max.messages queue.buffering.max.ms batch.num.messages

Я предполагаю, что все они будут значениями по умолчанию из конфигурации

queue.buffering.max.messages : 100000
queue.buffering.max.ms : 0
batch.num.messages : 10000

мое понимание: когдавнутренняя очередь достигает либо сообщений queue.buffering.max.ms, либо batch.num.messages, которые будут опубликованы в Kafka в отдельном потоке.в моей конфигурации queue.buffering.max.ms равно 0, поэтому каждое сообщение будет опубликовано, как только я вызову yield ().поправьте меня, если я ошибаюсь.

Мой фрагмент кода производителя:

def send(topic, message):
    p.produce(topic, json.dumps(message), callback=delivery_callback(err, msg))
    p.flush()

из этого сообщения Я понимаю, что при использовании flush после каждого сообщения, продюсер будет синхронизироватьсярежиссер .если я использую приведенный выше сценарий, то для публикации в Kafka

потребуется ~ 45 мс. Если я изменю приведенный выше фрагмент на

def send(topic, message):
    p.produce(topic, json.dumps(message), callback=delivery_callback(err, msg))
    p.poll(0)

Будет ли улучшена какая-либо производительность?Можете ли вы уточнить мое понимание.

Спасибо

1 Ответ

0 голосов
/ 01 октября 2018

Разница между flush() и poll() поясняется в клиентской документации .

Для flush(), она гласит:

Дождаться доставки всех сообщений в очереди источника.Это удобный метод, который вызывает poll () до тех пор, пока len () не станет равным нулю или не истечет необязательный таймаут.

Для poll():

Опрашивает производителя на наличие событий и вызывает соответствующие обратные вызовы (если они зарегистрированы).

Вызов poll() сразу после send() не делает производителя синхронным, поскольку маловероятно, что только что отправленное сообщение уже будетдостигли посредника, и отчет о доставке уже был отправлен обратно клиенту.

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

...