带有max.request.size参数的kafka流状态存储问题

时间:2020-06-04 07:42:16

标签: apache-kafka apache-kafka-streams

我们在项目中使用的是Kafka流状态存储,我们希望存储1MB以上的数据,但出现以下异常:

序列化时消息为1760923字节,大于 您使用max.request.size配置的最大请求大小 配置。

然后,我点击了链接Add prefix to StreamsConfig to enable setting default internal topic configs,并添加了以下配置:

topic.max.request.size=50000000

然后,该应用程序运行良好,当状态存储内部主题已创建但卡夫卡重新启动且状态存储主题已丢失/删除时,它可以正常工作,然后卡夫卡流处理器需要创建内部状态存储主题启动应用程序时自动自动执行,这时它会引发异常:

"Aorg.apache.kafka.streams.errors.StreamsException: Could not create topic data-msg-seq-state-store-changelog. at org.apache.kafka.streams.processor.internals.InternalTopicManager.makeReady(InternalTopicManager.java:148)....
.....
org.apache.kafka.streams.processor.internals.StreamThread.runLoop(StreamThread.java:805) at org.apache.kafka.streams.processor.internals.StreamThread.run(StreamThread.java:774) Caused by: org.apache.kafka.common.errors.InvalidConfigurationException: Unknown topic config name: max.request.size".

解决方案是我们可以手动创建内部主题,但这不应该是一个好主意。

您能在这个问题上帮助我吗?如果有任何配置我错过了?

非常感谢。

2020年6月17日更新:仍无法解决问题。有人可以帮助吗?

2 个答案:

答案 0 :(得分:1)

您正在寻找的解决方案在于您在启动流之前设置的 Kafka Stream 的配置属性。

props.put(StreamsConfig.PRODUCER_PREFIX + ProducerConfig.MAX_REQUEST_SIZE_CONFIG, "5242880");
<块引用>

我在这里使用的值为 5 MB(以字节为单位)。您可以更改该值以满足您的需要。

答案 1 :(得分:0)

我没有看到public async Task<IEnumerable<string>> GetSPSites() { return await context.Spsites.Select(x => x.Url).ToListAsync(); } 的配置。可能是 max.message.bytes Topic configuration reference)。因此,您可以尝试设置此项。

您可以参考代理设置max.message.bytes并增加它。它将它设置为经纪人级别。

文档说明:

Kafka允许的最大记录批处理大小(压缩后,如果 压缩已启用)。如果增加并且有消费者 大于0.10.2时,还必须增加消费者的提取大小,以便 他们可以获取如此大的记录批次。在最新的 消息格式版本,记录始终按批次分组 效率。在以前的消息格式版本中,未压缩的记录 不会分组,并且此限制仅适用于单个 在这种情况下进行记录。可以按主题级别针对每个主题进行设置 max.message.bytes配置。

默认值:1048588(〜1Mb)(融合Kafka)

另请参阅以下Stackoverflow answer