3个有状态应用程序的无服务器开发策略 - Twain Taylor


无服务器开发人员可以通过多种方式将无状态函数连接到有状态的信息,同时不会给应用程序设计带来延迟。

函数本质上是执行有限指定任务的独立代码块。例如,它们执行脚本或将日志数据从一个应用程序传输到另一个应用程序。无服务器函数就像Java程序中的函数一样,具有专用输入和输出,这意味着它们可以连接并形成一个链,其中一个函数的输出是另一个函数的输入。这有助于以分布式方式管理应用程序体系结构。

虽然函数即服务(FaaS)无服务器设计适合基于事件的应用程序,但函数的短暂性质使其在实时和以数据为中心的应用程序环境中限制了无服务器应用的开发。函数实例是易失性的,使用寿命为5到15分钟。如果部署在纯FaaS模型中,实时的云原生工作负载则需要一种方法来每隔几分钟恢复应用程序的状态。虽然应用程序可以在后端存储这些无状态函数的状态,但无服务器开发人员应该避免应用程序必须经常从存储中加载状态的情况。它成本高,导致延迟并影响网络请求的吞吐量。

函数和延迟
函数应该可以直接相互访问。如果无法相互立即连接,函数依赖于慢速存储介质将数据从一个函数传输到另一个函数,从而由此增加了延迟。在实时应用场景中 - 例如24/7监控系统 - 延迟却是不可接受的

无服务器函数主要支持短期工作负载,这意味着资源在请求时分配给它们,并在请求结束后被带走。在无服务器函数上开发的有状态应用程序无法使用传统机制来工作,例如可以在整个应用程序的生命周期内保存数据的全局变量。无状态函数不可能读取和写入磁盘,并且应用程序无法保持与数据库的持续连接。

要创建有状态应用程序,无服务器开发人员可以使用数据库连接,事件有效负载或后端即服务(BaaS)来管理应用程序状态,以与应用程序集成。开发人员应该使用这些方法来充分利用无服务器架构。正确完成后,他们管理应用程序状态而不降低性能。

直接连接到数据库
无服务器开发人员可以将应用程序状态存储在数据库中,然后将这些函数连接到数据库以进行访问。

在此设置中,开发人员必须担心可伸缩性。为避免对数据库造成压力并确保频繁且持续地访问应用程序状态,请遵循特定于其云平台的无服务器供应商的数据库连接指南,例如AWS Lambda到Amazon Relational Database Service。一开始就创建并存储状态,以避免不断调用数据库所产生的成本。

避免对象关系映射(ORM),即在两个不兼容的系统之间转换数据的过程。ORM需要为应用程序中使用的每个函数提供单独的模型,这只会为无服务器开发创建更多的非特征代码。

数据库事务成本高,而且扩展性不好。不使用事务并发和应用程序开发,而是使用外部连接池代理,例如Java数据库连接(JDBC)驱动程序。云供应商提供这些驱动程序,例如用于SQL Server的Microsoft JDBC驱动程序以连接到Azure SQL数据库。第三方软件产品(如Progress DataDirect)也可用作池化代理。 

后端即服务连接
后端即服务是有状态无服务器开发的另一个主要机制。无服务器函数使用无状态HTTP API,BaaS通过抽象整个无服务器架构和管理状态来处理并发和性能等问题,而不管工作负载如何。可以通过一行代码在无服务器函数内调用BaaS API,这样可以保持应用程序代码库的清洁,并使函数无状态。BaaS选项包括Progress Kinvey和Google Firebase等。