kafka事务:sendoffsetstotransaction比sendrecord慢得多

iyr7buue  于 2021-06-06  发布在  Kafka
关注(0)|答案(0)|浏览(310)

我对一些事务性代码进行计时,以查看我损失的时间最多的地方。所用的时间是这样的一些评论指出,这是由于发送是异步的。请继续阅读同步通话的后续问题还是比较慢:():

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);

为什么在发送、发送和提交事务的时间上有如此明显的差异?
fwiw:都是 dev-null 以及 __consumer_offsets 是有50个分区的三重主题。
跟进:sendoffsetstotransaction不能与send并行完成吗?我又跑了几次注解是执行时间+提交时间):

// 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毫秒)
(不太明显)为什么多分区send(record)可以并行执行,而sendfost是串行发送(record)的?类似地,commit(transactionlog write)对于send(record)是并行的,但是对于offset?
如果(2)是真的,我可以使用压缩主题来跟踪我自己的偏移量吗?我会错过什么?

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题