kafka压缩如何与引用字节的配置相关?

时间:2017-08-24 18:18:24

标签: apache-kafka

我不清楚(而且我还没有设法找到任何使其完全清除的文档)压缩如何影响处理字节的kafka配置。

获取一个正好是100字节的假设消息,一个批量大小为1000字节的生产者,以及一个获取大小为1000字节的消费者。

在没有压缩的情况下,我的制作人一次会批量发送10条消息并且我的消费者会一次轮询10条消息。

现在假设压缩(在生产者处指定 - 而不是在代理上指定)(为简单起见)压缩到未压缩大小的10%。

使用相同的配置,我的制作人一次会批量发送10条消息,还是一次开始批量处理100条消息?即是压缩前或压缩后的批量大小?文档确实这样说:

  

压缩是完整批次的数据

...我认为它将1000字节(批量大小)压缩到100字节并发送。这是对的吗?

消费者获取的相同问题。给定1K的提取大小,它一次只会轮询10个消息(因为未压缩的大小是1K),还是会轮询100条消息(因为压缩的大小是1K)?我相信获取大小将覆盖压缩批次,在这种情况下,消费者将一次获取10个批次 as-production-by-producer 。这是对的吗?

对我而言,如果我理解正确,制作人正在处理预压缩尺寸而消费者正在处理压缩后尺寸,这似乎让人感到困惑。

1 个答案:

答案 0 :(得分:2)

它既简单又复杂; - )

生产者和消费者都压缩和解压缩相同的Kafka协议生成请求和获取请求,并且代理只是以原生有线格式存储零拷贝,这更简单。 Kafka在发送之前不会压缩单个邮件。它等待直到一批消息(所有进入同一分区)都准备好发送,然后压缩整个批处理并将其作为一个生成请求发送。

它更复杂,因为您还必须考虑延迟时间,该时间将比生成器缓冲区大小已满时触发一批消息的发送。您还必须考虑消息可能具有不同的密钥,或者由于其他原因导致不同代理上的不同主题分区,因此不能将压缩到100个字节的qty(10)记录全部作为一个批处理到一个代理作为1000字节的单个产生请求(除非所有消息都被发送到具有单个分区的主题)。

来自https://kafka.apache.org/0110/javadoc/org/apache/kafka/clients/producer/KafkaProducer.html

  

生产者为每个分区维护未发送记录的缓冲区。   这些缓冲区的大小由batch.size配置指定。制造   这个更大可以导致更多的批处理,但需要更多的内存   (因为我们通常会为每个活动缓冲区中的一个缓冲区   分区)。

     

默认情况下,即使有缓冲区,也可立即发送缓冲区   缓冲区中的其他未使用空间。但是,如果你想减少   你可以将linger.ms设置为大于的事件的请求数   这将指示生产者在发送请求之前等待该毫秒数,希望有更多记录   到达以填补同一批次。这类似于Nagle的   TCP中的算法。例如,在上面的代码片段中,可能全部   因为我们设置了逗留,所以将在一个请求中发送100条记录   时间到1毫秒。但是这个设置会增加1毫秒   如果我们没有,等待更多记录到达的请求的延迟   填满缓冲区。请注意靠近的记录   时间通常会与linger.ms = 0一起批处理   无论延迟配置如何,都会发生重负荷配料;   但是将其设置为大于0的值会导致更少,   当不以最大负载为代价时,更有效的请求   少量的延迟。