【问题标题】:Common lambda function for database interaction数据库交互常用的lambda函数
【发布时间】:2018-04-09 11:49:19
【问题描述】:

我正在努力寻找一个好的架构来连接到数据库。要求在每个 lambda 函数中不重复与数据库的连接。此外,这种方式将为单个 lambdas 创建许多连接,而不是一个公共连接。能不能实现下图的结构,让一个lambda连接数据库,其他人在代码中使用它的连接

【问题讨论】:

  • "要求每个lambda函数中不重复连接数据库" -- 为什么会这样?

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


【解决方案1】:

您提议的架构将不起作用,因为除非您的 DB Lambda 创新过于频繁而无法始终保持温暖,并且您将连接存储在 /tmp 中以便在后续创新中重复使用,否则您的 DB Lambda 将为每次调用创建新连接。此外,如果您对 DB Lambda 的调用会创建多个容器来同时处理请求,那么您无论如何都会拥有那么多连接,而不仅仅是一个

理想的解决方案是用小型 EC2 实例替换 DB Lambda

【讨论】:

  • 感谢您的回答。创建 EC2 实例不是我想要的。任务是在没有服务器的情况下制作应用程序。如果我使用连接数量有限的连接池(在我的例子中是 mysql)怎么办?
  • 还是不行。因为一旦工作结束,AWS 有权删除您的 Lambda 容器,并且当您的 Lambda 下一次被调用时,它可以从一个新容器中提供服务,而没有任何旧容器的历史记录。请记住,Lambda 用于无状态计算。而 Lambda 级别的连接池用例正好相反
  • 谢谢。您能否回答哪种模式最适合使用来自不同 lambda 的一个数据库?我需要在每个 lambda 中创建连接或连接池吗?据我了解,我应该在处理程序之外创建它,连接被缓存了吗?这种方法使得有必要在每个单独的 lambda 中重复代码以连接到数据库,我认为这很糟糕。还有其他解决问题的最佳方法吗?
  • 其实如果你必须使用连接池,那么EC2就是出路。如果您担心代码重复,那么这不是问题,因为您可以创建数据库连接实用程序并在多个 Lambdas 代码库中使用它。因为一个 zip articact 可以包含多个 Lambda 的代码(除非每个 Lambda 都是您代码存储库中的不同项目)。这样你就可以使用同一个 zip articact 创建多个 Lambda,指定相应的 Handler
【解决方案2】:

当 Lambda 保持温暖时,数据库连接可以缓存在您的“数据库 Lambda”中。如果 Lambda 没有保持温暖,那么调用该 lambda 将遭受冷 lambda 的代价,这可能由必须重新创建数据库连接所支配,或者可能由您在“DB Lambda”中所做的其他工作所支配。

您希望 Lambda 多久变冷是需要考虑的因素。这取决于传入流量的统计信息。您是否愿意忍受偶尔重新创建数据库连接的延迟,另一个考虑因素?

像其他人所说的那样管理一个小型 EC2 实例可能需要很多额外的工作,具体取决于您的云服务是否是一组复杂的后端服务,以及该服务是否在不活动期间关闭。管理 EC2 实例是 Lambdas 更多的工作。

我确实发现您的架构存在一个潜在问题。如果由于某种原因您的“DB Lambda”失败,调用 Lambda 将不知道。如果您需要处理这种情况并进行清理,这可能是个问题。

【讨论】:

  • 感谢您的回答。就我而言,我想在 lambda 1,2 或 3 的处理程序中调用 DB lambda。由于 DB lambda 有一个有限的超时,它会返回到其工作的外部 lambda 结果,即错误或选择从数据库。不是吗?
猜你喜欢
  • 2018-12-27
  • 1970-01-01
  • 1970-01-01
  • 2019-07-17
  • 2019-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多