处理Java AWS Lambda的关闭

9

有没有一种方法可以钩入Lambda的关闭?我正在打开数据库连接,希望保持它的打开状态,但是我想确保在Lambda终止时关闭它。


1
这个回答解决了你的问题吗?使用Python在AWS Lambda执行上下文关闭后进行清理 - Maurice
为什么您的Lambda在能够清洁关闭连接之前就被终止了? - stdunbar
1
@stdunbar 我想在Lambda中进行一些基本的连接池操作,这样我就不需要在每个请求上打开一个连接。 - tschumann
3个回答

3

您可能对Lambda实例在被终止时抛出的事件感兴趣,而不是单个调用结束时抛出的事件,对吗?虽然您有一种选项可以同时使用,但我怀疑它们会帮助您。

您可以使用上下文方法getRemainingTimeInMillis()(链接到Node.js,但其他编程语言类似)来查找当前Lambda函数调用何时超时。这可能有助于清理事物或充分利用Lambda函数的时间。我不建议在每次调用结束时清理数据库连接,因为这样您将无法重用它们进行未来的调用,这会减慢Lambda函数的速度。但是,如果您可以接受这种情况,请继续。请记住,只要您的函数正在运行,这仅起作用。一旦您返回响应,您就无法执行任何清理操作,因为您的Lambda函数将进入“睡眠模式”。您需要在返回内容之前执行此操作。

或者,您可以利用扩展API。 它提供了一个关闭阶段并触发一个带有Shutdown事件的扩展。 但是,由于扩展坐落在您的函数旁边(而不是在您的函数代码中),我不确定您是否有机会使用此方法清理任何数据库连接... 另请参见Lambda执行环境以获取更多信息。


是的,当它被终止时。我了解过扩展API,但我没有使用自定义运行时。 - tschumann

2

假设您拥有一个用于热Lambda的池化连接,您可以注册一个关闭钩子来关闭DB连接或释放任何其他资源,您只有500毫秒来执行此任务。

class EnvironmentConfig {

    private static volatile boolean shutdownRegistered;
    private static volatile HikariDataSource ds;

    private void registerShudownHook() {
        if (!shutdownRegistered) {
            synchronized (lock) {
                if (!shutdownRegistered) {
                    Runtime.getRuntime().addShutdownHook(new Thread(() -> {
                        if (ds != null) {
                            ds.close();
                        }
                    }));
                    EnvironmentConfig.shutdownRegistered = true;
                }
            }
        }
    }

    public DataSource dataSource() throws PropertyVetoException {
        HikariDataSource _ds = EnvironmentConfig.ds;
        if (_ds == null) {
            synchronized (lock) {
                _ds = EnvironmentConfig.ds;
                if (_ds == null) {
                    _ds = new HikariDataSource();
                    // TODO: set connection props
                    EnvironmentConfig.ds = _ds;
                    registerShudownHook();
                }
            }
        }
        return _ds;
    }

}

您可以在任何地方引用数据源以获取单例副本,该副本将创建实例并注册关闭挂钩。

您的关闭挂钩可以执行其他任务,只要它们快速完成,或者您可以注册多个挂钩,但不要过多地注册线程。


0

不,您无法钩入Lambda执行上下文的关闭。

Lambda会自行处理并决定何时重用或销毁执行上下文。

您可能需要依靠连接自行超时。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接