繁体   English   中英

从 Java 调用 AWS Lambda 函数

[英]Invoking AWS Lambda Functions from Java

我有一个长期运行的 AWS Lambda function,我正在从我的 webapp 执行。 使用文档 [1],它可以正常工作,但是我的问题是这个特殊的 lambda function 不会将任何东西返回给应用程序,它的 output 2 会保存很长时间,并且运行时间很长。 有没有办法触发 lambda 而不是等待返回值,因为我不想在 lambda 运行时等待/阻止我的应用程序。 现在我使用ExecutorService作为 que 来执行 lambda 请求,因为我必须等待每次调用,当应用程序崩溃或重新启动时,我会丢失等待执行的作业。

[1] https://aws.amazon.com/blogs/developer/invoking-aws-lambda-functions-from-java/

跟踪状态不一定是一个难题。 在每次作业执行后使用简单的 S3“文件存在”调用来了解 lambda 是否已完成。

但是,正如您所指出的,您可能会在某些时候丢失工作信息。 要消除此问题,您需要在 JVM 之外建立一些持久层。 KV 存储可以工作,将一些(timestamp, jobId, status)字段存储在数据库中,并定期从 web 服务器检查并仅从 lambda 进行更新。

或者,为了进一步减少端到端的时间框架,排队机制会更好(除非您还想要完整的作业历史记录,但这可以与队列一起构建)。 正如评论中提到的,AWS 提供了许多可以直接与 Lambda 一起使用的内置解决方案,或者您需要额外的基础设施,例如 RabbitMQ / Redis 来构建任务事件总线。

有了这个,lambda 现在是可选的。 您将有效地定期将事件拉入工作队列,这可能是非常愚蠢的直通并调用 lambda,或者直接自己完成工作。 将此与 ECS/EKS/EC2 自动缩放结合起来,它实际上可能比 lambda 运行得更快,因为您可以根据队列大小进行缩放。 然后在写入 S3 文件后将 output 事件写入成功/错误通知“通道”

回到 web 服务器,您必须修改代码,以便现在从该通道异步侦听消息,当您收到成功消息时,您将知道您应该能够访问 S3 资源

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM