我们有一个应用程序,它使用来自 SQS 的消息并根据 sqs 消息将文件从 s3 下载到文件系统。 我们使用 apache Camel 轮询 SQS 消息队列并丰富,然后将文件下载到文件系统 它在 ECS 中运行良好,当迁移到 EKS 时,我们发现大文件(> 1GB)出现问题。
示例代码
.log(LoggingLevel.INFO, "Before enriching")
.pollEnrich().simple("S3 bucket url").cacheSize(-1).aggregationStrategy(new HeadersCopyAggregationStrategy())
.log(LoggingLevel.INFO, "Finished Enriching File")
HeadersCopyAggregationStrategy 类用于复制标头值,因为 pollEnrich 正在删除标头值
我们看到日志消息“丰富之前”,然后文件大小大于 1 GB 时出现内存不足错误。
代码对于 EKS 中的较小文件(50MB 或 200MB)运行良好
有人遇到类似问题吗?
谢谢
如果内存无法容纳该消息,您可以尝试将其假脱机到磁盘。这可以在骆驼中配置参见文档
添加
camel.springboot.stream-caching-spool-enabled=true
camel.springboot.stream-caching-spool-threshold=20971520
在您的属性中为超过 20MB 的消息设置假脱机。随意调整该值,但这可以是合理的开始。
context.getStreamCachingStrategy().setSpoolEnabled(true);
context.getStreamCachingStrategy().setSpoolThreshold(20 * 1024 * 1024);
然后
context.setStreamCaching(true);