我不清楚(而且我还没有设法找到任何使其完全清除的文档)压缩如何影响处理字节的kafka配置。
获取一个正好是100字节的假设消息,一个批量大小为1000字节的生产者,以及一个获取大小为1000字节的消费者。
在没有压缩的情况下,我的制作人一次会批量发送10条消息并且我的消费者会一次轮询10条消息。
现在假设压缩(在生产者处指定 - 而不是在代理上指定)(为简单起见)压缩到未压缩大小的10%。
使用相同的配置,我的制作人一次会批量发送10条消息,还是一次开始批量处理100条消息?即是压缩前或压缩后的批量大小?文档确实这样说:
压缩是完整批次的数据
...我认为它将1000字节(批量大小)压缩到100字节并发送。这是对的吗?
消费者获取的相同问题。给定1K的提取大小,它一次只会轮询10个消息(因为未压缩的大小是1K),还是会轮询100条消息(因为压缩的大小是1K)?我相信获取大小将覆盖压缩批次,在这种情况下,消费者将一次获取10个批次 as-production-by-producer 。这是对的吗?
对我而言,如果我理解正确,制作人正在处理预压缩尺寸而消费者正在处理压缩后尺寸,这似乎让人感到困惑。
答案 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的值会导致更少, 当不以最大负载为代价时,更有效的请求 少量的延迟。