OpenWhisk feeds的模式和实现
OpenWhisk支持开放api, 任何用户都可以通过一个package中的feed的方式来暴露一个事件产生服务。关于如何发布自己的feed属于openwhisk的较高级话题。本文中,我们来说一下feed的架构和实现
目录
Feed的基础模式
- 1.1 Hooks
- 1.2 Polling
- 1.3 Connections
- Feed和Trigger的不同
- Feed Actions的实现
- 3.1 使用Hooks实现Feeds
- 3.2 使用Polling实现Feeds
- 3.3 使用Connections实现Feeds
1、Feed的基础模式
创建一个feed包含三种基本方式: Hooks, Polling 和 Connections.
1.1 Hooks
在使用Hooks来实现feed的方式中, 我们使用一个由另一个服务提供的webhook来创建feed。我们配置一个webhook到一个外部的服务上(例如github hooks)。这样,外部服务会直接POST到一个URL来触发trigger。 这是目前实现“低频次feed”最简单的方式了。
1.2 Polling
在”Polling”的方式中, 我们使用一个 action 定期的轮询一个endpoint来获取新的数据。 这种方式很容易构造, 但也很显然,events的频次会受到轮询的时间间隔的影响。
1.3 Connections
在 “Connections” 的方式中, 我们在某个地址启了一个独立的服务来维护与feed产生源的长连接。长连接实现的方式可以是
long polling
也可以是消息推送的方式等。在openwhisk内部cloudant变化的feed就是connection的方式来实现的。
2、Feed和Trigger的不同
Feeds和triggers感觉上有点相似,但是在技术概念上其实是不同的。
- 在OpenWhisk是用系统中“流”的方式来处理events的。
- 一个trigger从技术上来说,是一个event的类的名称。每个event精确属于某个trigger; 我们可以把“trigger”类比成消息订阅系统中的一个“主题”. 一个 T -> A 的rule 代表:当一个trigger T触发的event到达了, 就调用 action A。
- feed指的是一个events的流,这些events都属于某个trigger T。每个feed都被一个Feed action控制,这个action处理了组成这个feed的事件流的创建、删除、暂定和恢复. Feed action通常通过一个rest api与产生events的外部服务交互。
3、Feed Actions的实现
Feed action 其实就是一个普通的 OpenWhisk action, 但它可以接收如下参数:
- lifecycleEvent: 这个值是 ‘CREATE’, ‘READ’, ‘UPDATE’, ‘DELETE’, ‘PAUSE’, ‘UNPAUSE’中的一个。
- triggerName: trigger的“全名”, 包括了namespace等信息。
- authKey: openwhisk用户的基本认证,看看是否有触发这个trigger的权限。
Feed action当然也可以包含其它参数,用来更好的管理feed。例如处理cloudant变化的feed action会包含‘dbname’, ‘username’, 等参数.
当用户用CLI加上—feed参数来创建一个trigger时, 系统会自动调用这个feed action,并带上之前的参数.
举个例子, 假设用户创建一个mycloudant
绑定到cloudant这个package, 并使用了username和password 作为绑定参数. CLI命令如下:
wsk trigger create T --feed mycloudant/changes -p dbName myTable
其实系统会做如下操作:
wsk action invoke mycloudant/changes -p lifecycleEvent CREATE -p triggerName T -p authKey <userAuthKey> -p password <password value from mycloudant binding> -p username <username value from mycloudant binding> -p dbName mytype
如上面的代码所示,叫做changes的feed action处理了这些参数,它接受所有需要从Cloudant创建一个events流的action,并导向trigger T.
对于 Cloudant changes feed来说, 这个action直接与cloudant trigger对话,我们实现了一个基于长连接的架构。接下来,我们还会讨论其它几种架构。
当然,相似的feed action操作还包括 wsk trigger delete
, wsk trigger update
和 wsk trigger get
.
3.1 使用Hooks实现Feeds
如果一个事件的生产者支持webhook/callback那么我们能很轻易的就创建一个feed。
这样我们不必在OpenWhisk外实现一个长时间存活的服务。 所有的feed管理自然就是无状态的OpenWhisk feed actions, 第三方的webhook api就替我们实现了。
Webbook可以直接POST请求到例如如下的URL地址上:
POST /namespaces/{namespace}/triggers/{triggerName}
这个POST请求会被解释成一个JSON文档,最后定义成触发事件。OpenWhisk rules传递这些trigger的参数来运行一个actions作为这个event的结果。
3.2 使用Polling实现Feeds
我们可以完全基于OpenWhisk,创建一个OpenWhisk action来定时轮询一个feed源,而不用与外部服务建立长连接。
对于webhook不可用,但又不需要大处理量和低延迟的场景来说, polling 就是一个很好的选择。
创建一个基于polling的feed, 步骤如下:
- 使用
whisk.system/alarms
feed 创建一个周期性的 trigger (T) 。 - 开发者创建一个
pollMyService
action 来轮询远程服务和返回新的时间。 - 创建一个rule: T -> pollMyService.
这样,我们就完全基于OpenWhisk实现了一个轮询的trigger,而不用创建其它服务。
3.3 使用Connections实现Feeds
上面的两种实现方式都比较简单。 然而,如果你想要一个高性能的feed, 那么就只能用长连接或者long-polling等技术来实现了。
因为OpenWhisk actions都是短时运行的, action不能管理一个长连接到第三方服务。所以我们必须创建一个独立的服务 (在 OpenWhisk之外) 来保持长时运行。 我们把它叫做 provider services, 一个provider service可以维持到第三方的长连接,从而来处理源源不断的事件。
Provider service可以提供一个REST API来允许OpenWhisk 的feed action来控制feed。Provider service常常在event provider和OpenWhisk之间扮演一个代理的角色, 它从第三方接受到时间然后通过trigger发送给openwhisk。
Cloudant changes feed 就是经典的例子 — 它创建一个 cloudanttrigger
服务,在 Cloudant notifications长连接和OpenWhisk triggers之间传递消息。
其实 alarm feed 也是用类似的方式来实现的。
基于连接的架构是要处理高性能的选择, 但它的消耗也比polling和hook的方式要大。大家在实现的时候可以根据场景考虑采取的方案。
OpenWhisk feeds的模式和实现相关推荐
- Spring boot项目(问答网站)之timeline的推拉两种模式
Timeline介绍 所谓timeline就是当用户打开主页看到的随着时间轴发生的一系列时间的整合,主要包含: 关注用户的最新动态 热门推荐 广告推荐整合等等. 推.拉模式 推模式: 当一个用户关注了 ...
- 大淘宝服务端技术干货沉淀和总结
网络基础 TCP三次握手 三次握手过程 客户端--发送带有SYN标志的数据包--服务端 一次握手 Client进入syn_sent状态 服务端--发送带有SYN/ACK标志的数据包--客户端 二次握手 ...
- python 各种模块学习
from:https://blog.csdn.net/weiwangchao_/article/details/70570508 转载:.... Python的模块大全,很全,有详细介绍! 另外附Py ...
- 如何开发一个Feeds流系统——写扩散模式为例
一.了解Feeds流 在学习如何开发Feeds流应用前,我们需要先了解什么是Feeds流. 1. 什么是Feeds流 Feeds流是一个持续更新并展示给用户的信息流.它将用户主动订阅的若干消息源组合在 ...
- 微博feed系统的推(push)模式和拉(pull)模式和时间分区拉模式架构探讨
sns系统,微博系统都应用到了feed(每条微博或者sns里的新鲜事等我们称作feed)系统,不管是twitter.com或者国内的新浪微博,人人网等,在各种技术社区,技术大会上都在分享自己的feed ...
- 荣耀9igoogle模式_iGoogle个性化主页的6种替代方法
荣耀9igoogle模式 iGoogle has less than a year to go before it's shut down for good on November 1, 2013. ...
- rss聚合模式案例_RSS的完整形式是什么?
rss聚合模式案例 RSS:真正简单的联合 (RSS: Really Simple Syndication) RSS is an abbreviation of Really Simple Syndi ...
- 管道过滤模式 大数据_大数据管道配方
管道过滤模式 大数据 介绍 (Introduction) If you are starting with Big Data it is common to feel overwhelmed by t ...
- Windows上帝模式——隐私浏览必备
所谓的Windows上帝模式,就是一个可以快速地打开各种设置功能的文件夹. 上帝模式的来源 先来说下上帝模式的来源,它可以被追溯到2007年的一篇帖子: *图片来自网络 国外一网友在论坛www.mer ...
最新文章
- FFmpeg通过摄像头实现对视频流进行解码并显示测试代码(新接口)
- 基于SD卡的FatFs文件系统(FatFs移植到STM32)
- html旋转代码_用CSS实现一个抽奖转盘(附详细代码+思路)
- 浅谈模型压缩之量化、剪枝、权重共享
- boost::proto::make_expr相关的测试程序
- 【GDC 21】《对马岛之魂》战斗系统讲解
- mysql启用组提交变量_MySQL的COMMIT_ORDER模式下组提交分组实现与BUG案例源码剖析...
- 追踪社保基金操盘者的足迹-补充
- 尝试一种新的生命状态
- iPhone 13系列将搭载A15芯片:相比前代性能提升20%
- Vue常用特性~非常详细哦,带源码资料
- 同义词林Java如何更新维护,solr词库实时更新维护
- Diffusion扩散模型简述 + 代码demo
- Python Excel操作人口普查
- Excel中将角度与弧度之间相互转换的公式
- 浏览器刷新和页面手动为什么不一样?
- 新浪滚动新闻的json数据获取页面
- excel美化技巧-持续更新
- .NET : 一定不要忘记关闭DataReader对象
- SVM——(三)对偶性和KKT条件(Lagrange duality and KKT condition)