【问题标题】:Kafka simple consumer and message size - Does it read partial messsage?Kafka 简单消费者和消息大小 - 它是否读取部分消息?
【发布时间】:2023-03-10 05:47:01
【问题描述】:

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

假设,我在主题中的每条消息都是 10 kb。

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

link 声明如下,但我没有看到它发生

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

【问题讨论】:

    标签: java apache-kafka kafka-consumer-api


    【解决方案1】:

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

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

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

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

    希望这会有所帮助。

    【讨论】:

    • 我不确定我是否仍然理解。例如,主题中有 10 条消息,每条消息的大小为 12 字节。让我们假设提取大小为 50 kb。你的意思是说,它读取了 4 条消息,当读取第 5 条消息时,由于超过 50 kb,它会截断第 5 条消息?
    • 不确定它是否总是会发生,但是是的,第 5 条消息有可能会被截断,客户端应该忽略它。事实上,如果您正在使用一些现成的消费者实现,您甚至不会在 FetchResponse 中看到这第 5 条消息(或者它向您公开的任何内容)。
    • 谢谢。再次发送请求时将获取第 5 条消息,对吗?
    • @ManikandanKannan 完全正确
    猜你喜欢
    • 2017-11-09
    • 1970-01-01
    • 2021-01-22
    • 1970-01-01
    • 2017-09-23
    • 1970-01-01
    • 2017-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多