【51CTO.com快译】引言:如今在无服务器(serverless)领域出现了一个新的超级英雄--nuclio。本文通过介绍它开源的功能,向您展示它如何帮助开发者使用各种高性能的无服务器化函数。
或许我们已经习惯了这么一种所谓的“平衡”:如果某样东西就像无服务器那样抽象且易用,那么它很可能是比较缓慢和不灵活的。否则的话,我们不得不放弃高性能和易用性,来满足某些独特的应用需求。但是如今,nuclio的无服务器功能函数,却能让我们在不干扰既有架构的情况下快速地创建和运行代码。nuclio不但在运行速度上比裸机(bare-metal)代码要快,而且具有广泛的应用范围。它不仅在调试上较为简单,更为重要的是它可以运行在任何地方。
前一段时间,iguazio(译者注:这是一家数据分析的服务提供商,专注于敏捷云和实时企业数据的分析)需要在它的实时数据平台上运用某种方法来增加自身的弹性和临时数据的处理能力,因此我们为它开发了一个高速FaaS层(译者注:Functions as a Service的简称)。我们通过在上一版所积累的经验,建立了一个独特的开源的无服务器平台,我们称之为nuclio。它的特点如下:
- 能交付出实时性能和***的并发量
- 实现简单的调试、回归测试和多版本的CI/CD(译者注:持续集成和持续交付)管道
- 支持可植入的数据和各种通用API的事件源
- 可在低功耗设备、笔记本电脑、私有云和公共云之间进行移植
nuclio的架构
nuclio的核心部件是功能函数处理器(由GO所编写,译者注:Go语言是谷歌2009发布的第二款开源编程语言)。该处理器通过抽象的接口进行工作,它是函数的“操作系统”,提供对事件、数据、日志等方面的访问。相同的功能代码能够被多种可植入的事件源(目前支持HTTP、Kinesis、Kafka、RabbitMQ、MQTT、NATS、iguazio的 V3IO和多种模拟器)所提供。
一个由数据绑定的接口会去访问各种外部的数据(如:对象、文件、数据库和各种数据流),并且负责所有的数据连接、安全性以及缓存的各个方面。我们可以编写一个函数,来使用到本地的各种文件,或通过HTTP去访问远程的数据,或是极快地横向扩展数据库和基于TCP的数据流,或者在不修改代码的情况下实现RDMA(译者注:Remote Direct Memory Access的缩写)。
nuclio处理器是实时的。访问nuclio “操作系统(OS)”的事件和数据是由并行触发、零拷贝、智能内存/线程重用以及非阻断IO式来实现的。编写你自己的裸机函数可能会比在nuclio处理器的“生态系统”中运行它要慢一些。单个nuclio函数处理器可以每秒运行400000次函数调用(使用的是一个简单的GO函数),而在响应上只有0.1ms的延迟。这个指标比大多数无服务器化/FaaS的解决方案要快100倍。基于GO的处理器通过低延迟的共享内存去联络其他语言的运行,从而访问并获悉上下文环境转换时的清理,以及各种进程的启动开销。
Nuclio当前支持四种应用模式:同步、异步、流式和批量/交互式作业。它动态地在进程(the dealer)之间分配事件、数据流和作业任务。这些使得无服务器适用于那些包含厚重的后端和各种分析任务在内的,新的工作负荷。
nuclio关注便携性和可重用性:
- 可工作在低功率设备、Docker、Kubernetes以及使用nuclio SDK的IDE内
- 在部署时将事件/数据源映射到不同函数或版本/标签上
- 日志和统计数据可以被发往多种目标类型,或者发送到IDE屏幕上
- 各个功能函数的镜像被存储在一个共享库里,并被推到多个集群/设备上
nuclio的便携性体现在允许用户在他们的笔记本上使用SDK或Docker来测试并调试各种函数。然后用户将它们传送并运行在不同的云端Kubernetes集群上,或者将它们推送到多个物联网设备的端点上。nuclio还简化了回归测试和诊断过程:各个函数从模拟事件处接收到反馈之后,将它们的输出写入结构化的日志文件,以便与预期的结果做对比。预计将来升级到beta版后,它们还能实现自动化的传递。
nuclio的60秒快速入门
如果您要部署一个完整的Kubernetes集群或一套服务是不需要特别进行上手学习的。您只需要用Docker的一体化(all-in-one)版本来启动nuclio并进行测试便可。请您跟随如下的Linux命令进行输入(假设Docker已被安装完成):
- docker run -p 8070:8070 -v /var/run/docker.sock:/var/run/docker.sock nuclio/playground
然后,您可以打开浏览器,输入地址HTTP://<machine-ip>:8070,接着您就可以看到nuclio的工场(playground)用户界面(UI)了。
nuclio的工场附带了一些内置的示例,它们诠释了如何通过行内注释或预定义事件来编写函数、使用日志和添加相关的包套件。
如果您想要上手学习的话,可以从下拉列表中选择一个示例,对它进行编辑和重命名,然后予以推送式的部署。各种编译错误会在日志中显示出来,以方便您进一步进行修复,并重新部署。一旦完成之后,您就可以使用调用(invoke)标签手动生成事件,从而对函数进行测试。通过使用日志级别的筛选器,你还能修改日志的复杂程度和问题调试的粒度。需要注意的是:在后台,nuclio会根据你的函数去生成各种Docker的容器或Kubernetes的相关部署。
您既可以使用自己喜欢的IDE去开发nuclio的各种功能函数,也可以导入或克隆现有的nuclio SDK,同时您还可以参照它们自带的README或一些示例。您要想了解更多信息,请参看nuclio在Github上的文档(https://github.com/nuclio/nuclio/blob/master/README.md)。我们在那里重温了nuclio的架构,并且提供了有关使用和CLI(译者注:command line interface)方面的细节。当然您也能在那里得到nuclio社区的帮助。
目前,nuclio仍处于开发阶段,它支持Golang和Python语言,而它的Java和Node.js版本也即将被推出。请和我们一起加快对它的新功能开发吧,记得为它点赞。
【原标题】 nuclio: The New Serverless Superhero,作者: Yaron Haviv
【51CTO译稿,合作站点转载请注明原文译者和出处为51CTO.com】