SWIFT AWS Lambda运行时

2020-05-30 02:52:35

我很高兴宣布SWIFT服务器生态系统的一个新开源项目-SWIFT AWS Lambda Runtime。SWIFT AWS Lambda Runtime作为SWIFT软件包分发,旨在帮助SWIFT开发人员为Amazon Web Services Lambda平台构建无服务器功能。

该项目是一个团队的努力,包括SWIFT社区的工程师,包括来自苹果和亚马逊的工程师。值得注意的是,法比安·费特是社区工作的先驱,也是图书馆的合著者。作为一个开源库,任何有兴趣为该项目做出贡献的人都可以很容易地加入进来,帮助它变得更好。

许多现代系统都有客户端组件,如iOS、MacOS或WatchOS应用程序,以及这些客户端与之交互的服务器组件。对于客户端应用程序开发人员来说,无服务器功能通常是将其应用程序扩展到云中的最简单、最有效的方式。

无服务器功能正成为在云中运行事件驱动或临时计算任务的日益流行的选择。它们为任务关键型微服务和数据密集型工作负载提供支持。在许多情况下,考虑到开发人员的按需特性,无服务器功能允许开发人员更轻松地扩展和控制计算成本。

在使用无服务器功能时,必须注意资源利用率,因为它直接影响系统成本。这就是斯威夫特大放异彩的地方!凭借其低内存占用、确定性性能和快速启动时间,SWIFT是无服务器功能架构的绝佳匹配。

将这一点与SWIFT对开发人员的友好性、表现力和对安全性的重视相结合,我们就拥有了一个适合所有技能水平、可扩展且经济高效的开发人员的解决方案。

SWIFT AWS Lambda Runtime旨在使在SWIFT中构建Lambda函数变得简单而安全。该库是AWS Lambda Runtime API的实现,并使用嵌入式异步HTTP客户端,该客户端针对AWS Runtime环境中的性能进行了微调。该库提供了一个多层API,允许构建一系列Lambda函数:从快速而简单的闭包到复杂的、性能敏感的事件处理程序。

使用AWS Lambda Runtime的最简单方式是传入闭包,例如:

//导入模块import AWSLambdaRuntime//在本例中,我们接收并响应字符串Lambda。在callback(.)中运行{(context,payload:string,callback)。成功(";Hello,\(有效负载)";)}。

更常见的情况是,有效负载将是JSON,它是使用COODABLE建模的,例如:

//导入模块导入AWSLambdaRuntime//请求,使用codable进行透明JSON编码私有结构请求:codable{let name:string}//响应,使用codable进行透明JSON编码私有结构响应:codable{let message:string}//在本例中我们使用codable Lambda接收和响应JSON。在callback(.)中运行{(context,request:request,callback)。Success(响应(Message:";Hello,\(Request.。姓名)";)}。

由于Lambda函数通常由源自AWS平台的事件(如SNS、SQS或S3事件)触发,因此该软件包还包括AWSLambdaEvents模块,提供这些常见触发事件类型的实现。例如,处理SQS消息:

//导入模块导入AWSLambdaRuntime import AWSLambdaEvents//在本例中,我们收到一条SQS消息,没有响应(Void)Lambda。运行{(上下文,消息:SQ.。留言、回叫)在.。回调(.。Success(void()}。

除了这些常见的触发事件,AWSLambdaEvents还包括用于将Lambda函数与APIGateway集成的抽象,APIGateway是一个AWS系统,可帮助将Lambda函数公开为HTTP端点。

//导入模块导入AWSLambdaRuntime import AWSLambdaEvents//在此示例中,我们收到一个APIGateway.V2.Request,//并使用APIGateway.V2.Response Lambda进行重新发布。运行{(上下文,请求:APIGateway。V2。请求、回叫)在.。回调(.。成功(APIGateway。V2。响应(statusCode:。接受)}。

将Lambda函数建模为闭包既简单又安全。SWIFT AWS Lambda Runtime将确保将用户提供的功能从网络处理线程卸载到其自己的线程,以便即使代码变慢或没有响应,底层Lambda流程也可以继续并与运行时引擎交互。这种安全性是以网络线程和处理线程之间的上下文切换带来的小性能损失为代价的。在大多数情况下,使用基于闭包的API的简单性和安全性优于下面详述的面向性能的API的复杂性。

对性能敏感的Lambda函数可以选择使用更复杂的API,该API允许用户代码在与网络处理程序相同的线程上运行。SWIFT AWS Lambda Runtime使用SwiftNIO作为其底层网络引擎,这意味着这些API基于SwiftNIO的并发原语,如EventLoop和EventLoopFuture。

//导入模块导入AWSLambdaRuntime import AWSLambdaEvents import NIO//我们的Lambda处理程序,符合EventLoopLambdaHandler struct Handler:EventLoopLambdaHandler{typealias in=sns。message//请求类型类型别名out=void//响应类型,或void//在此示例中,我们接收的SNS消息没有响应(Void)函数句柄(上下文:lambda。上下文,有效负载:输入)->;EventLoopFuture<;输出>;{.。上下文。eventLoop。Make SucceededFuture(void())}}Lambda。Run(Handler())。

除了使用基于EventLoopFuture的API的认知复杂性之外,请注意这些API的使用应该格外小心。EventLoopLambdaHandler将在与库的网络引擎相同的EventLoop(线程)上执行用户提供的函数,这对实现提出了永不阻塞底层EventLoop的要求。换句话说,Lambda代码不应该使用阻塞API调用,因为它可能会阻止库与Lambda平台交互。

这是一个社区驱动的开源项目积极寻求贡献的开始。虽然核心API被认为是稳定的,但API仍可能随着其接近1.0版本而发展。有几个领域需要额外关注,包括但不限于:

如果您对SWIFT AWS Lambda Runtime感兴趣,请来参与!源代码是可用的,我们鼓励来自开源社区的贡献。如果您有反馈、问题或想要讨论该项目,请随时在SWIFT论坛上聊天。如果您想报告错误,请使用GitHub问题跟踪器。我们期待着与您合作,并帮助推动行业迈向更好、更安全的编程未来。

请随时在SWIFT论坛的相关帖子上发布有关此帖子的问题。