Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache kafka 卡夫卡压缩与引用字节的配置有什么关系?_Apache Kafka - Fatal编程技术网

Apache kafka 卡夫卡压缩与引用字节的配置有什么关系?

Apache kafka 卡夫卡压缩与引用字节的配置有什么关系?,apache-kafka,Apache Kafka,我不清楚压缩是如何影响处理字节的卡夫卡配置的(而且我还没有找到任何文档能够完全清楚地说明这一点) 假设一条消息正好是100字节,一个生产者的批量大小为1000字节,一个消费者的获取大小为1000字节 在没有压缩的情况下,很明显,我的制作人一次会批处理10条消息,而我的消费者一次会轮询10条消息 现在假设一个压缩(在producer处指定,而不是在代理上指定),它(为了简单起见)压缩到未压缩大小的10% 使用相同的配置,我的制作人还是一次批处理10条消息,还是一次批处理100条消息?即,批量大小是

我不清楚压缩是如何影响处理字节的卡夫卡配置的(而且我还没有找到任何文档能够完全清楚地说明这一点)

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

在没有压缩的情况下,很明显,我的制作人一次会批处理10条消息,而我的消费者一次会轮询10条消息

现在假设一个压缩(在producer处指定,而不是在代理上指定),它(为了简单起见)压缩到未压缩大小的10%

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

压缩是对整批数据的压缩

…我认为这意味着它会将1000字节(批量大小)压缩到100字节并发送。对吗

消费者也有同样的问题。给定1K的获取大小,它会一次只轮询10条消息(因为未压缩的大小是1K)还是轮询100条消息(因为压缩的大小是1K)?我相信提取大小将涵盖压缩批次,在这种情况下,消费者将一次提取生产商生产的10个批次。这是正确的吗


如果我理解正确的话,生产商处理的是压缩前的尺寸,而消费者处理的是压缩后的尺寸,这似乎让我感到困惑。

这既简单又复杂;-)

更简单的是,生产者和消费者都压缩和解压相同的卡夫卡协议生成请求和获取请求,而代理仅以零拷贝的方式以其本机wire格式存储它们。卡夫卡不会在发送单个消息之前对其进行压缩。它等待一批消息(所有消息都将发送到同一个分区)准备好发送,然后压缩整个批并将其作为一个生成请求发送

更为复杂的是,您还必须考虑延迟时间,这将比生产者缓冲区大小已满时更早触发一批消息的发送。您还必须考虑到消息可能有不同的密钥,或者由于其他原因,将在不同的代理上进行不同的主题分区,因此,将QTY(10)记录压缩为100个字节是不正确的,每一个都以一个批处理的形式作为一个单一的请求产生1000个字节。(除非所有消息都发送到具有单个分区的主题)

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

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


谢谢。所有这些都是有意义的,我认为现在很清楚,生产者端字节配置是预压缩的。但这并没有回答关于消费者的问题。我认为消费者将根据压缩消息的大小提取压缩消息,这意味着它实际上获得的数据比实际需要的数据多得多一旦消息被取消压缩,您将查看哪些指标,因为代理的JMX指标将始终被压缩用于入口和出口,并且客户端指标可能与代理指标不同。我不查看指标,只是问一个关于消费者获取大小是否与字节在代理日志中被压缩,或者在生成字节时被压缩(未压缩)。但我认为它们必须在压缩字节上,否则代理必须在发送之前解压缩,这将破坏性能并使zerocopy不可能。我认为我确信只有一个(合理的)当使用压缩时,生产者和消费者的w.r.t.字节配置不匹配。至少就它们与实际消息中的字节的关系而言,也就是说……我认为,答案是消费者获取的大小是压缩数据。在获取数据后,它将被解压缩。同样,如果使用Avro SerDes,它将是Avro二进制格式,而不是反序列化后的原始扩展消息格式。