Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services 每条路线有1个Lambda函数更好吗?还是1个处理子路由的Lambda?_Amazon Web Services_Api_Aws Lambda_Api Design - Fatal编程技术网

Amazon web services 每条路线有1个Lambda函数更好吗?还是1个处理子路由的Lambda?

Amazon web services 每条路线有1个Lambda函数更好吗?还是1个处理子路由的Lambda?,amazon-web-services,api,aws-lambda,api-design,Amazon Web Services,Api,Aws Lambda,Api Design,如果我有一个具有以下路径的API POST /slack POST /slack/hook POST /slack/another-hook POST /slack/hook/nested 在API网关中有4个单独的Lambda函数和4条路由是否更好?或者让1个Lambda作为根路由,并让Lambda从那里处理路由 例1 POST /slack --> lambda1 POST /slack/hook --> lambda2 POST /slack/another-hook --&

如果我有一个具有以下路径的API

POST /slack
POST /slack/hook
POST /slack/another-hook
POST /slack/hook/nested
在API网关中有4个单独的Lambda函数和4条路由是否更好?或者让1个Lambda作为根路由,并让Lambda从那里处理路由

例1

POST /slack --> lambda1
POST /slack/hook --> lambda2
POST /slack/another-hook --> lambda3
POST /slack/hook/nested --> lambda4
例2

POST /slack --> lambda1
POST /slack/hook --> lambda1
POST /slack/another-hook --> lambda1
POST /slack/hook/nested --> lambda1

这方面有最佳实践吗?如果是,为什么

如果有人说答案有对有错,我会感到惊讶

我在不同的项目中都做过这两件事,我想这取决于CICD的偏好、架构和时间限制

拥有一个lambda从理论上简化了您的体系结构,但实际上您正在构建一个具有适用于该体系结构的所有缺点的单片应用程序,然而,如果您是单个开发人员,它将大大减少构建、测试和部署过程,因此,您不必担心lambda之间的依赖关系,只需要一个可部署工件

另一方面,多个lambda函数为您提供了类似于微服务的灵活性,但这需要您拥有单独的管道,整个CICD生态系统变得更加复杂和耗时

在一个lambda函数中包含所有代码时,更需要注意的是大小限制和潜在的依赖性地狱,这取决于您的语言

由于不知道您的组织/项目和时间限制,我可能会从一个lambda开始,然后在需要时将其拆分为多个lambda函数…

这篇博客文章解释了各种无服务器模式的优缺点。以下是一些需要记住的事情:

每条路线一个Lambda,又称微服务模式:

专业人士

  • 更容易调试,因为每个lambda都有一个非常特定的函数,并且cloudwatch日志是完全分开的
  • 更容易测试,因为每个lambda处理一个单独的事件
  • 部署更细粒度。更新一个函数只能影响一个特定的功能,这样你就有了一个分离的关注点
缺点

  • 可能会有更多的lambda冷启动,因为其中一些可能不会经常访问

  • 您可能最终需要管理许多lambda函数

  • 部署速度较慢,因为要部署多个功能
  • 您可能很快就会遇到单个堆栈的cloudformation资源限制(即200个资源)。我亲自遇到过这件事
一个具有多条路由的Lambda,即服务/整体模式,具体取决于路由的分组方式:

专业人士

  • 冷启动次数更少/性能更好,因为lambda将被频繁调用并保持温暖
  • 需要管理的lambda函数更少
  • 部署速度更快,因为要部署的功能更少
缺点

  • 调试和分析cloudwatch日志比较困难,该函数处理多种类型的事件
  • 您需要编写和维护路由器
  • 更大的功能大小,因此您可以达到部署大小限制
  • 更新函数可能会导致回归并破坏其他一些功能

正如您所看到的,每种方法都有其优缺点,并且没有一种正确的方法。正如另一个答案所建议的那样,你需要考虑CICD、项目和时间限制之类的东西。

< P>我已经讨论了这个问题,并选择了每个服务的单独的GIT存储库,例如“代码>人<代码>,<代码>帐户< /代码>等,每个都有自己的LAMBA函数。 这使我能够将每个repo/serverless项目视为自己的微服务,并且我使用MVC模式,即控制器和服务以及每个微服务的DAO

我的管道构建和测试单个repo,部署并在单个repo上运行系统集成测试

我不喜欢路由器模式的地方是:

  • 函数的日志记录,单个日志流

  • 单点失效

  • 变幻莫测

  • 我更喜欢关注点的离散分离

  • 可测试性

  • 您现在需要满足您最饥饿的lambda,例如它需要 1024mb ram,一个简单的GET就可以满足128mb的容量,或者现在您需要开始 在需要移动函数时打破模式并进行重构

  • 我读了几篇文章,这些文章表明,只有在端点利用率不足的情况下,冷启动的回报才真正适用


我使用了一个无服务器插件来温暖lambda,因为路由器模式的唯一真正好处(imo)是减少冷启动。

我要求更多的信息,因为多个lambda,应该有多个运行时,这将产生额外的成本…如果这是正确的说法?或者两者的价格相同?请建议