FaaS踩坑之openwhisk与fission对比
实现层面
fission运行流程
- controller:对外提供api,通过fission CLI 控制内部组件
- router:用户发送http请求请求服务(调用函数)。收到请求,查看缓存(fiction与podurl间的映射)。对于调用过function,router会很快的拿到返回值;没调用过,向 poolmgr 请求一个新的实例。poolmgr 有一个空闲 pods 池,它会选择一个 pod,将函数加载进去(将请求发送到 pod 的容器中),并将 pod 地址返回给 router。
- 创建环境:对于用户创建的environment,poolmgr中有循环的线程自动在kubernetes中根据env的镜像创建包含三副本pod的deployment,每个pod中有两个container,一个使用env的镜像创建,另一个是fission中的辅助container,镜像是fission/fetcher。两个container共享一个volume。因为env是定义基础镜像,而一个env可能会关联许多function,所以需要fetcher根据具体的function在通用的container里运行不同的code。
- poolmgr还会定期清理“不活跃”的deployment,如env。还会定期删除不活跃的pod,让kubernetes自动创建新的、干净的pod供其他function使用。poolmgr提供的API只有两个,一个是根据function获取对应的service url,另一个是类似心跳API帮助维护缓存。因为router里也维护有function到service url的缓存,所以当function被调用时,router会通知poolmgr更新一下对应service对象的时间,避免被误删。
openwhisk运行流程
- nginx:处理用户发送(如调用函数操作等)将其转发(以及ssl终止)。
- contraller:是用户可执行操作( CRUD请求以及操作调用)的接口。
- CouchDB:存储操作(whisk数据库),身份验证(subjects数据库)。
- consul:服务发现组件,持续检查系统中可用执行者的运行状态来监视invoker,告诉contraller哪些invoker可用
- kafka:contraller和invoker只通过由 Kafka 缓冲和持久存储的消息进行通信。缓冲,减轻内存负担。确保消息不会在系统崩溃时丢失。
- invoker:启动Docker执行操作。对于每个操作调用,衍生一个 Docker 容器,将操作码注入。使用传递给代码的参数来执行代码,获取结果,然后销毁该容器
- 储存结果:存储在CouchDB终端 whisks 数据库中作为 ActivationId 下的激活
开发语言
fission
- Go语言
openwhisk
- scala语言
组件
fission
- controller
- router
- executor
- kubeWatcher
- timer
- MessageQueueMgr
- storageSvc
- builderMgr
openwhisk
- nginx
- contraller
- CouchDB
- consul
- kafka
- invoker
功能层面
组件
控制器
fission
- controller,是fission对外提供管理API的组件。所有其他组件通过关注 controller 来更新负责追踪函数、HTTP 路由、事件触发器和环境镜像
openwhisk
- contraller:是用户可执行操作(如CRUD请求以及操作调用)的接口。
- consul:服务发现组件,持续检查系统中可用执行者的运行状态来监视invoker,告诉contraller哪些invoker可用
- kafka:一种高吞吐量、分布式的发布/预订消息传递系统。contraller和invoker只通过由 Kafka 缓冲和持久存储的消息进行通信。可以减轻在内存中进行缓冲的负担并降低伴随的 OutOfMemoryException 风险,确保消息不会在系统崩溃时丢失。使用异步调用模型
请求响应
fission
router:收到请求,查看缓存(fiction与podurl间的映射)。对于调用过function,router会很快的拿到返回值;没调用过,向 poolmgr 请求一个新的实例。poolmgr 有一个空闲 pods 池,它会选择一个 pod,将函数加载进去(将请求发送到 pod 的容器中),并将 pod 地址返回给 router。
openwhisk
API网关
服务发现组件
fission
- router,与controller和poolmgr打交道,会监听 controller 中triggers的更新,动态的更新web service的route定义。
- poolmgr 负责管理空闲的环境容器池、将函数加载到这些容器当中、以及杀死空闲的函数实例。
openwhisk
- consul:服务发现组件,持续检查系统中可用执行者的运行状态来监视invoker,告诉contraller哪些invoker可用
触发器
fission
- Http Trigger
- Time Trigger
- MQ Trigger
openwhisk
invoker:启动Docker执行操作,对于每个操作调用,都会衍生一个 Docker 容器,将操作码注入。使用传递给代码的参数来执行代码,获取结果,然后销毁该容器
cloudant
- custom trigger
- github
- messahub
- moblie push
- priodic
数据存储
fission
- etcd
openwhisk
- CouchDB
函数
语言支持
fission
- Binary
- Go
- .NET
- .NET 2.0
- NodeJS (Alpine)
- NodeJS (Debian)
- Perl
- PHP 7
- Python 3
- Ruby
openwhisk
- JavaScript
- Python
- Swift
- PhP
- Docker
函数上传支持
fission
- 环境支持的语言
- 任何兼容二进制的可执行文件和脚本
openwhisk
- 环境支持的语言
- Java 方法
- 任何兼容二进制的可执行文件,包括打包为 Docker 容器的 Go 程序和定制可执行文件
源码形式
云端编译环境
####### 内容
####### 指令
二进制形式
本地编译环境要求
开发方式
fission
- CLI
openwhisk
- 浏览器开发
- Cloud Functions CLI
启动方式
fission
- 冷启动
openwhisk
函数操作
fission
- 通过kubectl对pod进行操作
openwhisk
- contraller:是用户可执行操作(如CRUD请求以及操作调用)的接口。
打包上传
调用方式
fission
- 触发器关联
openwhisk
- 触发器关联
- Cloud Functions API
- Cloud Functions CLI
- iOS移动SDK
执行时间上限
运行环境
fission
- k8s的pod
openwhisk
- docker
运行环境的启动
fission
- Pool-based executor(poolmgr):
- New-deployment executor(newdeploy):创建一个Kubernetes部署、Service和HorizontalPodAutoscaler
openwhisk
运行环境的回收
fission
- poolmgr定期清理“不活跃”的deployment,定期删除不活跃的pod,让kubernetes自动创建新的、干净的pod供其他function使用。(如何定期待查)
openwhisk
结果返回
fission
- 直接返回
openwhisk
- 储存在CouchDB的输出中
使用
事件
fission
openwhisk
- package
- 包含操作和订阅源
- 绑定到包指定缺省参数
身份认证
fission
openwhisk
- CouchDB:在whisk数据库中存储操作,subjects数据库用于身份验证与授权操作并装入操作
订阅源支持
全部属于某个触发器 T 的事件的流
fission
- workflow?
openwhisk
发布自己的订阅源使用,创建订阅源体系结构:
- Hook
- 轮询
- 连接
自动伸缩
fission
- 自动伸缩
openwhisk
图形仪表盘
fission
不支持
openwhisk
- 存在。用于监视活动摘要,活动日志,时间线以及过滤选项
项目发展现况
社区发展
fission
- 3.2k star
openwhisk
- 3k star
使用者
fission
- Autodesk
- cielo24
openwhisk
支持厂商
fission
- Platform9
openwhisk
- Apache/IBM
底层基础设施对接层面
组建部署方式
fission
- 通过helm部署在kubernetes上
openwhisk
- 通过 Ansible部署在docker中
function部署方式
fission
- 以pod形式运行在kubernetes中
openwhisk
- 运行在docker中
参考:
- https://fission.io
- https://console.bluemix.net/docs/openwhisk/index.html#cloud-functions-
- https://www.tuicool.com/articles/6NnEb2b
- https://lingxiankong.github.io/2017-03-05-faas-fission.html
- https://www.kubernetes.org.cn/2523.html
- https://blog.csdn.net/qq_34463875/article/details/60960244
- https://www.ibm.com/developerworks/cn/opensource/os-introducing-openwhisk-microservices-made-easy/