【问题标题】:Invoking AWS Lambda Functions from Java从 Java 调用 AWS Lambda 函数
【发布时间】:2021-07-25 22:23:00
【问题描述】:

我有一个长时间运行的 AWS Lambda 函数,我正在从我的 web 应用程序执行该函数。使用文档 [1],它可以正常工作,但是我的问题是这个特定的 lambda 函数不会将任何内容返回给应用程序,它的输出会保存到 S3,并且运行了很长时间 20-30 秒。有没有办法触发 lambda 而不是等待返回值,因为我不想在 lambda 运行时等待/阻止我的应用程序。现在我使用ExecutorService 作为队列来执行 lambda 请求,因为我必须等待每次调用,当应用程序崩溃或重新启动时,我会丢失等待执行的作业。

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

【问题讨论】:

  • 如果某些东西是异步的,为什么不使用 SQS/kinesis/MSK?
  • 同样,您可以通过从这些选项触发 lambda 以及通过向相应的队列/分片/主题生成任何客户端语言的消息来将 Java 与调用函数分离
  • @OneCricketeer 我希望将移动部件保持在最低限度,不要过度依赖 AWS 服务,以便更轻松地测试本地开发
  • 查看 localstack 项目,在模拟或 AWS 生态系统之外进行集成测试。如果你使用 MSK,你可以在本地运行 Kafka
  • 否则,您可以触发并忘记调用 lambda 的线程,但是您需要持久化每个执行事件以跟踪这些调用是否真正完成,或者不断轮询 S3 以获取更新

标签: java amazon-web-services aws-lambda


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-28
    • 2018-08-21
    相关资源
    最近更新 更多