“吞吐量”是单位时间内处理消息的数量,”处理速度”是消费一条消息所花费的时间。
处理一条消息所花费的时间称之为延时(latency)而非处理速度可能更加贴切一些。
假设Kafka每发送一条消息需要花费2ms(即延时是2ms)。显然吞吐量就应该是500条/秒,因为1秒可以发送1 / 0.002 = 500条消息。因此,吞吐量和延时的关系可以用公式来表示:TPS = 1000 / Latency(ms)。
我们以Kafka producer为例,假设它以2ms的延时来发送消息。如果每次只是发送一条消息,那么TPS自然就是500条/秒。但如果producer不是每次发送一条消息,而是在发送前等待一段时间然后统一发送一批消息,比如producer每次发送前先等待8ms,而8ms之后producer共缓存了1000条消息,此时总延时就累加到10ms(2 + 8),而TPS等于1000 / 0.01 = 100,000条/秒。由此可见,虽然延时增加了4倍,但TPS却增加了将近200倍。这个场景解释了目前为什么批次化(batching)或微批次化(micro-batching)流行的原因了。实际环境中用户几乎总是愿意用较小的延时增加代价去换取TPS的显著提升。毕竟从2ms到10ms的延时增加通常是可以忍受的。事实上Kafka producer就是采取了这样的设计思想。
你可能会问:发送一条消息需要2ms,那么等待8ms就能累积1000条消息?答案是可以的!producer累积消息一般仅仅是将消息发送到内存中的缓冲区,而发送消息却需要涉及网络I/O传输。内存操作和I/O操作的时间量级是不同的,前者通常是几百纳秒级别,而后者从毫秒到秒级别不等,故producer等待8ms积攒出的消息数可能远远多于同等时间内producer能够发送的消息数。
所谓的“性能”一般指的是吞吐和延迟这两件事。
