2

我正在使用简单的消费者从 kafka 主题中读取数据,并且对获取大小与主题中消息大小的关系有疑问。

可以说,我在主题中的每条消息都是 10 kb。

当我从偏移量 0 开始消费时,提取大小为 16 kb(只是为了这个问题),它是否读取了 1 条完整消息和另一条 6kb 的部分消息?

链接指出以下内容,但我没有看到它发生

作为一种优化,允许服务器在消息集的末尾返回部分消息。客户应该处理这种情况。

4

1 回答 1

1

如果您深入了解消息集和消息的编码方式,您会注意到它们通常以字节为单位的大小(与大小是项目计数的所有其他结构不同),因此客户端首先读取消息的大小设置,然后读取实际消息集的 N 个字节。与消息相同 - 首先读取大小,然后读取大小为 N 的实际消息。

如果没有优化,Kafka 服务器将检查获取响应是否超过获取大小并回滚最后一条消息。

这里的优化非常简单:它不是跟踪它应该在哪里回滚以形成一个漂亮的获取响应而不剪切消息,而是简单地累积消息直到超过获取大小,并且只是削减超过获取大小的所有内容。

这意味着任何有线协议实现者都应该准备好例如大小为 100 的消息Clients should handle this case集可能没有 100 多个字节要读取,因此客户端不应失败并将其视为正常行为。

希望这可以帮助。

于 2015-03-14T13:35:57.667 回答