Транзакции Kafka: sendOffsetsToTransaction намного медленнее, чем sendRecord - PullRequest
0 голосов
/ 22 октября 2018

Я рассчитывал какой-то транзакционный код, чтобы увидеть, где я больше всего терял.Время, затраченное примерно на это В комментариях указывалось, что это происходит из-за того, что отправка выполняется асинхронно.Пожалуйста, прочитайте следующий вопрос для синхронного вызова.(Это все еще медленнее :() :

producer.beginTransaction(); //0.08 ms
producer.sendOffsetsToTransaction( offsetMap, GROUP_ID);  // 105.96ms
producer.commitTransaction(); // 2.74ms


producer.beginTransaction(); //0.09 ms
producer.send(new ProducerRecord<byte[], byte[]>( "dev-null", payload ) );// 0.16 ms
producer.commitTransaction(); // 28.37 ms

Сроки сделаны так:

long t0 = System.nanoTime();
statement_to_time();
long t1 = System.nanoTime();
long timeTaken = (t1-t0);

Почему существует такая заметная разница во времени для отправки, sendOffsetsToTransactionи commitTransaction?

fwiw: и dev-null, и __consumer_offsets являются дублирующимися темами с 50 разделами.

Последующие действия: Может ли sendOffsetsToTransaction не выполняться параллельно сОтправить? Я выполнил еще несколько прогонов. (Комментарий - время выполнения + время фиксации):

// Asynchronous send. Flush cost is in commit call
producer.send(); // 0.16 ms + 28.36 ms 

// This call is Synchronous. Commit doesn't have flush cost 
producer.sendOffsetsToTransaction(...); // 105.9 ms + 2.7ms 

// Synchronous send. Flush cost is in the send.
producer.send(...).get() // 26.1ms + 2.4 ms

// flush is done with sendOffsetsToTransaction. Commit cost double for two partitions
producer.send(...); 
producer.sendOffsetsToTransaction(...);  // 128.26 ms + 5.40 ms 


// 5 partition write, no offset. commit cost is not 5x
producer.send(..., partition=0).get() ; 
producer.send(..., partition=1).get() ; 
...
producer.send(..., partition=4).get() ; // 28.3 ms + 2.52 ms

// 5 partition + offset write. commit cost is ~6x
producer.send(..., partition=0).get() ; 
producer.send(..., partition=1).get() ; 
...
producer.send(..., partition=4).get() ; 
producer.sendOffsetsToTransaction(...);  // 127.25 ms + 11.8 ms

Я могу повторить их несколько раз, но до сих пор kafka оставался в соответствии с числами. Новые вопросывозникают следующие проблемы:

  1. Почему sendOffsetToTransaction все еще занимает больше времени (105 мс против 25 мс)
  2. (менее очевидно) Почему многораздельная отправка (запись) может выполняться параллельно,но sendOffset последовательно для отправки (записи)? Точно так же фиксация (запись транзакций) параллельна для отправки (записи), но складывается для смещения?
  3. Если (2) верно, могу ли я использовать сжатыйтема для отслеживаниямои собственные смещения?Чего бы мне не хватало?
...