OpenWhisk支持开放api, 任何用户都可以通过一个package中的feed的方式来暴露一个事件产生服务。关于如何发布自己的feed属于openwhisk的较高级话题。本文中,我们来说一下feed的架构和实现

目录

  1. Feed的基础模式

    • 1.1 Hooks
    • 1.2 Polling
    • 1.3 Connections
  2. Feed和Trigger的不同
  3. Feed Actions的实现
    • 3.1 使用Hooks实现Feeds
    • 3.2 使用Polling实现Feeds
    • 3.3 使用Connections实现Feeds

1、Feed的基础模式


创建一个feed包含三种基本方式: HooksPolling 和 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 deletewsk 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, 步骤如下:

  1. 使用 whisk.system/alarms feed 创建一个周期性的 trigger (T) 。
  2. 开发者创建一个 pollMyService action 来轮询远程服务和返回新的时间。
  3. 创建一个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的模式和实现相关推荐

  1. Spring boot项目(问答网站)之timeline的推拉两种模式

    Timeline介绍 所谓timeline就是当用户打开主页看到的随着时间轴发生的一系列时间的整合,主要包含: 关注用户的最新动态 热门推荐 广告推荐整合等等. 推.拉模式 推模式: 当一个用户关注了 ...

  2. 大淘宝服务端技术干货沉淀和总结

    网络基础 TCP三次握手 三次握手过程 客户端--发送带有SYN标志的数据包--服务端 一次握手 Client进入syn_sent状态 服务端--发送带有SYN/ACK标志的数据包--客户端 二次握手 ...

  3. python 各种模块学习

    from:https://blog.csdn.net/weiwangchao_/article/details/70570508 转载:.... Python的模块大全,很全,有详细介绍! 另外附Py ...

  4. 如何开发一个Feeds流系统——写扩散模式为例

    一.了解Feeds流 在学习如何开发Feeds流应用前,我们需要先了解什么是Feeds流. 1. 什么是Feeds流 Feeds流是一个持续更新并展示给用户的信息流.它将用户主动订阅的若干消息源组合在 ...

  5. 微博feed系统的推(push)模式和拉(pull)模式和时间分区拉模式架构探讨

    sns系统,微博系统都应用到了feed(每条微博或者sns里的新鲜事等我们称作feed)系统,不管是twitter.com或者国内的新浪微博,人人网等,在各种技术社区,技术大会上都在分享自己的feed ...

  6. 荣耀9igoogle模式_iGoogle个性化主页的6种替代方法

    荣耀9igoogle模式 iGoogle has less than a year to go before it's shut down for good on November 1, 2013. ...

  7. rss聚合模式案例_RSS的完整形式是什么?

    rss聚合模式案例 RSS:真正简单的联合 (RSS: Really Simple Syndication) RSS is an abbreviation of Really Simple Syndi ...

  8. 管道过滤模式 大数据_大数据管道配方

    管道过滤模式 大数据 介绍 (Introduction) If you are starting with Big Data it is common to feel overwhelmed by t ...

  9. Windows上帝模式——隐私浏览必备

    所谓的Windows上帝模式,就是一个可以快速地打开各种设置功能的文件夹. 上帝模式的来源 先来说下上帝模式的来源,它可以被追溯到2007年的一篇帖子: *图片来自网络 国外一网友在论坛www.mer ...

最新文章

  1. FFmpeg通过摄像头实现对视频流进行解码并显示测试代码(新接口)
  2. 基于SD卡的FatFs文件系统(FatFs移植到STM32)
  3. html旋转代码_用CSS实现一个抽奖转盘(附详细代码+思路)
  4. 浅谈模型压缩之量化、剪枝、权重共享
  5. boost::proto::make_expr相关的测试程序
  6. 【GDC 21】《对马岛之魂》战斗系统讲解
  7. mysql启用组提交变量_MySQL的COMMIT_ORDER模式下组提交分组实现与BUG案例源码剖析...
  8. 追踪社保基金操盘者的足迹-补充
  9. 尝试一种新的生命状态
  10. iPhone 13系列将搭载A15芯片:相比前代性能提升20%
  11. Vue常用特性~非常详细哦,带源码资料
  12. 同义词林Java如何更新维护,solr词库实时更新维护
  13. Diffusion扩散模型简述 + 代码demo
  14. Python Excel操作人口普查
  15. Excel中将角度与弧度之间相互转换的公式
  16. 浏览器刷新和页面手动为什么不一样?
  17. 新浪滚动新闻的json数据获取页面
  18. excel美化技巧-持续更新
  19. .NET : 一定不要忘记关闭DataReader对象
  20. SVM——(三)对偶性和KKT条件(Lagrange duality and KKT condition)

热门文章

  1. 前端打包利器,webpack工具,app打包工具
  2. gepc 骨架图算法Graph Embedded Pose Clustering
  3. 【眼前的苟且】2017英才计划“走进计算机世界”冬令营 游记
  4. 计算机人工智能的应用论文,人工智能的发展与应用论文整理.doc
  5. 数据库索引B+树实现
  6. 依存句法分析:原理、应用
  7. java架构师学历要求_java架构师多少薪资?如何成为java架构师大神?
  8. 蓝桥杯比赛准备第一天
  9. 系统清理软件MacBooster 7破解版
  10. sofasofa竞赛:一 公共自行车使用量预测