pollEnrich 正在内存中加载文件并导致 EKS 部署中出现堆错误

问题描述 投票:0回答:1

我们有一个应用程序,它使用来自 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)运行良好

  • apache-camel版本:4.4.0
  • 部署基础设施:Amazon EKS
  • 配置的堆内存:2GB
  • 线程数:10

有人遇到类似问题吗?

谢谢

kubernetes apache-camel amazon-eks
1个回答
0
投票

如果内存无法容纳该消息,您可以尝试将其假脱机到磁盘。这可以在骆驼中配置参见文档

Springboot

添加

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);
© www.soinside.com 2019 - 2024. All rights reserved.