Kafka 简单消费者和消息大小 - 它是否读取部分消息?
Kafka simple consumer and message size - Does it read partial messsage?
我正在使用简单的消费者从 kafka 主题中读取数据,并且有一个关于获取大小与主题中消息大小的关系的问题。
比方说,我在主题中的每条消息都是 10 kb。
当我从偏移量 0 开始使用 16 kb 的提取大小(只是为了这个问题)时,它是否读取了 1 条完整的消息和另一条 6kb 的部分消息?
link 陈述了以下内容,但我没有看到它发生
As an optimization the server is allowed to return a partial message
at the end of the message set. Clients should handle this case.
如果您深入了解 message sets and messages 的编码方式,您会注意到它们通常以字节为单位前面有一个大小(不同于所有其他结构,其中大小是一个项目计数),因此客户端首先读取消息集的大小,然后读取实际消息集的 N 个字节。与消息相同 - 首先读取大小,然后读取大小为 N 的实际消息。
如果没有优化,Kafka 服务器将检查获取响应是否超过获取大小并回滚最后一条消息。
这里的优化非常简单:不是跟踪它应该回滚到哪里以形成漂亮的获取响应而不剪切消息,而是简单地累积消息直到超过获取大小并且只剪切超过获取大小的所有内容。
通过说 Clients should handle this case
这意味着任何有线协议实现者都应该准备好大小为 100 的消息集可能不会再读取 100 个字节,因此客户端不应失败并将其视为正常行为。
希望对您有所帮助。
我正在使用简单的消费者从 kafka 主题中读取数据,并且有一个关于获取大小与主题中消息大小的关系的问题。
比方说,我在主题中的每条消息都是 10 kb。
当我从偏移量 0 开始使用 16 kb 的提取大小(只是为了这个问题)时,它是否读取了 1 条完整的消息和另一条 6kb 的部分消息?
link 陈述了以下内容,但我没有看到它发生
As an optimization the server is allowed to return a partial message at the end of the message set. Clients should handle this case.
如果您深入了解 message sets and messages 的编码方式,您会注意到它们通常以字节为单位前面有一个大小(不同于所有其他结构,其中大小是一个项目计数),因此客户端首先读取消息集的大小,然后读取实际消息集的 N 个字节。与消息相同 - 首先读取大小,然后读取大小为 N 的实际消息。
如果没有优化,Kafka 服务器将检查获取响应是否超过获取大小并回滚最后一条消息。
这里的优化非常简单:不是跟踪它应该回滚到哪里以形成漂亮的获取响应而不剪切消息,而是简单地累积消息直到超过获取大小并且只剪切超过获取大小的所有内容。
通过说 Clients should handle this case
这意味着任何有线协议实现者都应该准备好大小为 100 的消息集可能不会再读取 100 个字节,因此客户端不应失败并将其视为正常行为。
希望对您有所帮助。