关于Subscribe Rancher Events的思考

2016年2月14日「Rancher社区技术支持计划」全面启动,本文是Rancher研发人员在社区答疑过程中关于Subscribe Rancher Events的一些心得和思考。

引言

几乎每个大型的分布式的集群软件,都离不开一样东西,就是所谓的message bus(消息总线), 它就如同人体的血管一样,连通着各个组件,相互协调,一起工作。 与很多同类软件不同的是,Rancher使用的基于websocket协议实现的消息总线, Rancher不会依赖任何MQ,基于websocket的实现十分轻量级, 同时在各种语言库的支持上,也毫无压力,毕竟websocket是HTTP的标准规范之一。

初识Rancher Events

基于websocket的消息总线可以很好的与前端兼容,让消息的传递不再是后端的专利。 在Rancher UI上,很容易就能捕获到rancher events,比如:

这里面监听的事件名称是resource.change,这个resource.change在前端UI上有很大的用处, 其实我们都知道,很多POST形式的create请求并不是同步返回结果的,因为调度引擎需要处理, 这个等待的过程中,当然不能前端一直wait,所以做法都是发起create后直接返回HTTP 202, 转入后台执行后,Rancher的后端会把创建的执行过程中间状态不断发送给消息总线, 那么前端通过监听resource.change就会获得这些中间状态,这样在UI上就可以给用户一个很好的反馈体验。

当然Rancher Events并不是只有resource.change,比如在Iaas Events集合中就有如下这些:

除了Events的事件定义,当然还有如何去subscribe 这些events,这部分内容在之前的文章Rancher event机制及其实践指南中有所涉猎,便不赘言。

Subscribe Rancher Events的架构模式

Rancher的体系内,很多微服务的组件都是基于Subscribe Rancher Events这种架构,举个例子来看, 以rancher-metadata组件为例:

metadata服务可以提供当前host的元数据查询,我们可以很容器的知道env内的stack/service/container的情况, 这些数据其实由rancher-server也就是cattle引擎生成的,那么生成之后怎么发送给各个agent呢? 其实就是metadata进行了subscribe rancher events,当然它只监听了config.update事件, 只要这个事件有通知,metadata服务便会下载新的元数据,这样就达到了不断更新元数据的目的。

随着深入的使用Rancher,肯定会有一些伙伴需要对Rancher进行扩展,那就需要自行研发了, 毕竟常见的方式就是监听一些事件做一些内部处理逻辑,并在DB中存入一些数据, 同时暴露API服务,架构如下:

如果需要做HA,可能需要scale多个这样的服务,那么架构就变成这样:

这里其实会有一个问题,如果你监听了一些广播事件,那么实际上每个实例都会收到同样的事件, 那么你的处理逻辑就要注意了,尤其是在处理向DB中写数据时,一定要考虑到这样的情况。

比如,可以只有其中一个实例来监听广播事件,这样不会导致事件重复收取:

Event Handler要考虑一定failover机制,这样事件收取不会长时间中断。

Rancher Events有一些非广播事件,那么就需要在subscribe的时候指定一些特殊参数, 这样事件就会只发送给注册方,不会发送给每个节点,比如:

总结

此文算是这段时间做Rancher服务扩展的心得,深度参与一个开源软件最终肯定会希望去改动它扩展它。 这也是客观需求所致,开源软件可以拿来即用,但是真正可用实用,必须加以改造,适应自身需求。

原文来源:Rancher Labs

时间: 2024-10-18 00:50:36

关于Subscribe Rancher Events的思考的相关文章

Rancher v1.2基础设施引擎整体架构分析

Rancher Labs官方于12月1日发布了其容器部署与管理平台Rancher的最新版本,Rancher v1.2.Rancher v1.2可以说是一个里程碑版本,只要体会其新版功能,会发现漫长的等待绝对是值得的. 从架构角度看,用两个字来概括就是"解耦",基础设施引擎的分离,agent节点的服务粒度更细: 从产品角度看,给了用户更多定制的空间,Rancher依然秉持着全部OpenSource的理念: 在开发语言上,之前遗留的通过shell脚本方式的粗糙实现也都基于Golang重写,

Unity3d插件研究之Easytouch

但我们开发移动端的游戏时,发现使用Input.GetMouseButtonDown的方法不可用,怎么办? 虽然unity3d也有自带触屏的方法,但是使用起来代价太高,什么单击,双击这些功能都要自己封装. 下面我们来讲下EasyTouch这个插件,它将所有触屏的手势,都已经写好了. 而且Easytouch也支持NGUI,使用起来十分的方便. 接下来,我们详细地学习这个插件改如何运用到我们的项目中来. 首先,我们导入easytouch插件,这里我是用3.0版本的,可能有些老了,我都没更新,但是大致的

观察者模式和订阅/发布者模式(转)

在翻阅资料的时候,有人把观察者(Observer)模式等同于发布(Publish)/订阅(Subscribe)模式,也有人认为这两种模式还是存在差异,而我认为确实是存在差异的,本质上的区别是调度的地方不同. 观察者模式 比较概念的解释是,目标和观察者是基类,目标提供维护观察者的一系列方法,观察者提供更新接口.具体观察者和具体目标继承各自的基类,然后具体观察者把自己注册到具体目标里,在具体目标发生变化时候,调度观察者的更新方法. 比如有个“天气中心”的具体目标A,专门监听天气变化,而有个显示天气的

react+redux渲染性能优化原理

大家都知道,react的一个痛点就是非父子关系的组件之间的通信,其官方文档对此也并不避讳: For communication between two components that don't have a parent-child relationship, you can set up your own global event system. Subscribe to events in componentDidMount(), unsubscribe in componentWillU

Unity-EasyTouch插件之One Finger

这节课,我们主要讲下单个手指的测试.比如单击啊,双击啊,拖动,单手滑动等. 单击: public class TouchTest : MonoBehaviour { // Subscribe to events void OnEnable(){ //启动On_SimpleTap监听,也就是手指单击屏幕,就会触发On_MySimpleTap的方法执行 EasyTouch.On_SimpleTap += On_MySimpleTap; } // Unsubscribe void OnDisable(

(转)[unity3d]easytouch的使用

对于移动平台上的RPG类的游戏,我们常用虚拟摇杆来控制人物角色的行走和一些行为,相信我们对它并不陌生,之前尝试了EasyTouch2.5,发现并没有最新版的3.1好用,2.5版本的对于自适应没有做的很好,而最新版的已经解决了这一问题.当然unity也自带了摇杆Joystick,用起来也简单,但存在不少局限,不会满足普通mmo游戏的需求,比如指定显示区域或者是更改一些素材等等,而这些EasyTouch插件都已经帮你实现,不得不佩服插件的原作者,能做出这么炫酷好用的插件,当然这估计是老外开发的,关于

EasyTouch 3.1中文翻译

Unity3D的Easy Touch 的手册最近寻找中文版本,google无果,自己动手.目前暂时只有c# ,javascript原理是一样的. 一.Quick Start 1-Import EasyTouch Package. 2-Create an empty gameObject, and name it EasyTouch.(You can choose another name) Step 1 & 2 can be replace by the option menu 3-Add th

EasyTouch的使用

EasyTouch插件包含三个模块:Easy Button . Joystick . 事件 关于按钮和事件这一块,在实际的工作中,你可以用Easy Button,也可以用其它插件,比如NGUI,效果上都是一样的 下面就具体说说Easy Button的使用,有两种使用方法: 方法一,请看如下截图     按钮使用方法二: 通过按钮的名字区分点击的是哪个按钮  关于Joystick,重点掌握以下几个方面:  关于Joystick必须掌握三个语句: 语句一: joystick.JoystickAxis

Learning JavaScript Design Patterns -- A book by Addy Osmani

Learning JavaScript Design Patterns A book by Addy Osmani Volume 1.6.2 Tweet Copyright © Addy Osmani 2015. Learning JavaScript Design Patterns is released under a Creative Commons Attribution-Noncommercial-No Derivative Works 3.0 unported license. It