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 ...
最新文章
- 最全19000+国外AE模板合集包
- 职场:5种幼稚表现,好多工作十年的人还在犯
- Photometric Stereo 初體驗
- pytorch mseloss bceloss 对比
- TypeScript class 的参数属性 parameter properties
- xshell怎么让程序后台运行_使程序在Linux下后台运行
- 若依单体版本代码生成模块使用教程
- c语言 __FILE__,__DATE__,__TIME__ (宏)
- PHP程序员如何突破成长瓶颈(php开发三到四年)
- PHP 获取访问来源
- 面试被问如何保证缓存与数据库的双写一致性?这篇帮你搞定
- Silverlight常见问题解决方法
- 数据结构、栈和队列、树和二叉树
- 西安交通大学城市学院的计算机类专业,西安交通大学城市学院计算机系2020级专业分流会...
- autojs网络验证,权朗网络验证源码
- C语言的fgets() 与 gets()
- ES初探之——shard和replica
- 鬼吹灯之龙岭迷窟 4192
- 某移动端防作弊产品技术原理浅析与个人方案构想
- 微信小程序(4)——视图容器之moveable-view和moveable-area
热门文章
- MV:频域的噪音和过滤
- 2021年机械员-通用基础(机械员)考试及机械员-通用基础(机械员)理论考试
- 卡梅隆大学计算机排名,2022卡梅隆大学全美排名多少(研究生院)
- 基于vs2019的静态链接库的创建与使用(超详细)
- 什么是底层架构_厉害!阿里技术专家发布1500多页计算机底层架构原理解析宝典|现代汽车|计算机|原理|操作系统|存储器...
- 父母不会用手机 App?中老年群体的app应用产品
- 干货 :集成学习入门介绍
- VirtualBox简体中文版下载安装使用图解教程
- java 数字 字母 递增_JAVA流水号生成规则(按默认规则递增,数字不够添加字母递增,位数不够自动加1)...
- 某dewu(毒)数据接口研究