是否可以通过标准JSR-250注释(@PostConstruct
,@PreDestroy
)或其他方式在AWS Lambda Java函数中注册启动和关闭挂钩?显然,我可以使用零参数构造函数或实例初始化器作为启动方面的东西,但我有兴趣知道是否有更好的方法..我在API中的接口。我也许失踪了 - 我当然不想使用finalize()
方法来关闭钩子!
作为一个背景知识,这里的用例是初始化和关闭KafkaProducer
实例,我们将根据传入的DynamoDB表事件将消息发送到主题。
更新
Lambda最佳实践鼓励编写无状态函数类 - 所以我的假设是故意不支持启动/关闭代码。在该模型中,我想我们需要创建和关闭每次调用处理程序事件所需的任何资源。
http://docs.aws.amazon.com/lambda/latest/dg/best-practices.html
答案 0 :(得分:1)
AWS Lambda旨在用作无状态基础架构,但在某些情况下它也会重复使用相同的“容器”,但您希望在使应用程序依赖于此之前确保了解其工作原理。
使用AWS的AWS Lambda,这意味着您可以拥有一个能够为每个容器初始化一次的单例类。此模式允许执行容器的初始设置,例如从S3加载文件一次或建立与另一个服务器(如Kafka,MySQL,Memcached等)的连接。(旁注:公共互联网上的服务器只能连接到此处)时间,但连接到VPC中的服务器是一个即将推出的功能。)
当您部署新版本的代码时,AWS Lambda将始终部署新容器,因此在这些时间内您可能会看到活动容器中的最多营业额。此外,在一段时间不活动后,AWS Lambda将关闭空闲容器。但是,如果您有一致的请求流,您的AWS Lambda容器将被重用于多个请求。
据我所知,AWS没有详细描述容器如何重用的具体行为。这可能是因为AWS Lambda的重点在于您不再需要担心基础架构。
至于在容器关闭时接收信号以进行额外处理,我不相信现在有办法做到这一点。 Lambda的目的是只为您的请求付费,并且在该窗口之外发生关闭。显然容器最终会被终止,但我不知道现在记录了终止JVM实际发生的细节。
与您对KafkaProducer的特定关注相关,您很可能需要等待AWS发布其他功能才能更好地支持此用例。
与AWS Lambda相关的关联调查耗尽问题的讨论概述了一个相关问题:https://forums.aws.amazon.com/thread.jspa?threadID=216000