Arc*_*hie 5 hibernate jpa aws-lambda serverless
我必须在 Java 中实现一个 AWS lambda 函数,该函数将使用 Kinesis 流并将数据读/写到 MySQL 数据库。因为我已经在另一个应用程序中定义了模型实体,所以我想重用它们,而不是使用普通的 SQL/JDBC。所以我的目标是使用 JPA/Hibernate 实现 lambda。这在一般情况下可能吗?如果是,是否有任何真实示例或最佳实践?我以前从事过 Spring Boot 应用程序,其中类似的功能完全可用且易于配置,现在我什至不知道从哪里开始。
我强烈不同意您的评估,即 JPA 在 Lambda 上不可行,并且当前运行了几个函数来证明这一点,但需要注意的是:只有在同步 lambda 环境或不常使用的环境中使用 JPA 才真正可行。(稍后会详细介绍)
Persistence.createPersistenceFactory 每个应用程序只应执行一次,并将结果放置在静态或单例上下文中。
您使用运行时关闭挂钩处理关闭 JPA 资源。
在实践中发生的情况是,即使没有处理数据,Lambda 函数也会启动并保留一段时间。(同步和异步函数都是如此)在这种情况下,当下一次调用到来时,您的函数在相同的运行时环境中执行,并且可以重用EntityManagerFactory来创建新EntityManager实例。同步和异步调用之间的主要区别在于并发量。同步函数的并发性非常有限,而异步函数可能变化很大,因此您需要承担更大的启动成本,因为随着函数实例池的扩展和缩减,这种情况发生得更频繁。
是的,函数的运行时环境将被定期终止,无论是同步还是异步,尤其是在没有看到流量的情况下,然后您的启动时间很慢,但根据我的经验,后续调用将重新使用相同的运行时环境,尤其是在使用同步函数时,例如那些挂钩到 Kinesis Stream 中的函数。
我强烈建议顺便将自己限制为同步编写器,因为它会限制 Lambda 实例的数量,从而限制有多少 JDBC 池连接到您的数据库。(这在 DB 端可能会成为一个严重的问题,通常只接受几十或几百个连接,但每个 JDBC 池将有大约 10 个连接!!!)对于 Kinesis Streams,这等于分片的数量,并且如果您的记录很小,您可以使用 KPL 和记录聚合大大增加分片容量。lambda 函数本身每次调用只会从流中接收 < 6MB 的数据。
| 归档时间: |
|
| 查看次数: |
8128 次 |
| 最近记录: |