Я рассчитывал какой-то транзакционный код, чтобы увидеть, где я больше всего терял.Время, затраченное примерно на это В комментариях указывалось, что это происходит из-за того, что отправка выполняется асинхронно.Пожалуйста, прочитайте следующий вопрос для синхронного вызова.(Это все еще медленнее :() :
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 оставался в соответствии с числами. Новые вопросывозникают следующие проблемы:
- Почему sendOffsetToTransaction все еще занимает больше времени (105 мс против 25 мс)
- (менее очевидно) Почему многораздельная отправка (запись) может выполняться параллельно,но sendOffset последовательно для отправки (записи)? Точно так же фиксация (запись транзакций) параллельна для отправки (записи), но складывается для смещения?
- Если (2) верно, могу ли я использовать сжатыйтема для отслеживаниямои собственные смещения?Чего бы мне не хватало?