无服务功能

无服务功能

微服务可能更小或更大,但是您可以分解您的体系结构分成更小的部分:函数。无服务器功能是一种无状态的功能,正如你从你最喜欢的专业人士所知道的那样设计语言。这样的功能可以在托管的云基础设施中运行,因此您不需要自己运行任何环境。无服务器函数接受一些输入产生一些输出,但需要完全独立。例如,您不能存储任何在当前调用中存活的数据。Serverless很流行,因为它保证了弹性的可伸缩性。当你的函数是不用,你不用付任何钱。当你的流量飙升时,你可以应付。拥有一堆功能会强化它们如何互动以实现目标的问题。假设您希望实现客户在无服务器的情况下上线。你实现一个功能在CRM系统中创建客户,一个在计费中创建它,一个用于提供SIM卡等。

提供入职功能最简单的方法是组合功能包含或调用其它函数的函数

function onboardCustomer(customer) { crmPromise = createCustomerInCrm(customer); // 2 seconds billingPromise = createCustomerInBilling(customer); // 100 ms // TODO: Wait for 2 promises simCard = provisionSimCard(customer); // 1 second registerSim(simCard); // 4 seconds } // --> 7 seconds runtime for onboard Customer

虽然这看起来简单易行,但它有严重的缺点。只有当所有函数都可用并返回快速结果时,它才有效。否则,你很容易就会在CRM中创建一个客户,而由于上一个功能崩溃,账单永远得不到SIM卡。此外,如代码所示,此解决方案增加了延迟以上。即使较长的响应时间不是问题,它也会增加你的云账单,因为无服务器提供商会收取你的功能所消耗的计算时间。

因此需要避免组合函数。这就是大多数项目使用消息传递的原因云提供商创建功能链的能力。想象一下。

// callback function registered for message "customerOnboardingRequest" function onboardCustomer(customer) { send('createCustomerInCrmRequest'); } // callback function registered for message "createCustomerInCrmRequest" function createCustomerInCrmRequest(customer) { ... send('createCustomerInBillingRequest'); } // callback function registered for message "createCustomerInBillingRequest" function createCustomerInBilling(customer) { ...

通过这种方式,您可以摆脱一个昂贵的组合函数,并生成您的代码更有弹性。消息队列将记住下一步要做什么,即使函数代码失败。但现在你可能会遇到类似于批量和流媒体:你的链没有任何端到端的可见性,你没有单一的你可以调整它,它很难理解和解决失败。这会在网页的“其他实施方案的限制”,为了减轻这些问题,您可以使用工作流引擎进行编排你的功能。为此,您将需要一个工作流引擎作为托管服务。这意味着工作流引擎本身对您来说也是一个无服务器的资源。

在入职示例中,负责开发客户入职功能的团队也可以定义流程模型,如图4-4所示。在

在这个流程模型中,每个服务任务都绑定到一个函数调用上。这在技术上如何实现取决于具体的云环境,典型的例子是本地的函数调用,HTTP通过API网关或消息调用。工作流引擎

可能提供您可以使用的预构建连接器(示例之一其中连接器,如第58页“使用预建连接器”中介绍的,使一个很有意义的)。

每当团队部署新功能时,他们还需要部署工作流引擎上的流程模型,它可能是自动化的。

如今,每个主要的云提供商都具有有状态的功能编排能力他们的平台(AWS步骤函数,Azure持久函数,GCP云工作流)。不幸的是,他们都错过了重要的工作流引擎功能在这本书中描述。特别是,它们都没有使用BPMN,这导致了有限的语言能力(见103页的“工作流模式”)和没有或非常差的可视化(见104页的“图形化过程可视化的好处”)。

因此,利用基于bpmn的工作流引擎来编排功能还有额外的价值,这是一个非常值得探索的领域。该网站包含使用Camunda Cloud和AWS Lambda的可执行示例

相关教程