高可用服务化中间件框架
服务化(SOA)有非常多的资料,这里不再详述。这套框架系统主要作用是能够让使用者不再关心网络,物理节点分布,不同语言之间的格式转换等细节,可以专心于业务逻辑的实现。
框架实现了:
1.包装了跨语言rpc序列化和通信的底层细节
2.服务治理,高可用
3.应用层的分布式负载调度
一.跨语言rpc的序列化和通信细节
公司内部的这套框架是基于ICE开源项目基础上,ICE提供了这些底层功能。ICE是一个开源的项目,是一套跨语言的rpc通讯框架,设计初始目标是为了替代CORBA(一套很重的rpc框架)。不过用现代的眼光来看,ICE现在自己也成了一套很重的系统。如果完全重头开始项目,更好的rpc方案选择应该是facebook开源的thrift。公司目前也正在在thrift的基础上做一套新的服务化框架。
不论是ICE,CORBA,thrift,原理都差不太多。首先,需要定义自己的IDL,然后IDL翻译器会在server端生成skeleton,在客户端生成stub,server端业务逻辑代码会实现skeleton的具体逻辑。客户端通过stub来完成远程方法调用(rpc),调用server端skeleton的具体实现。在这个系统里,ICE帮我们完成了不同语言的跨语言调用和网络通讯的底层功能。
二.服务治理,高可用
不过ICE自身的高可用有着比较严重的缺陷,ICE Registry作为一个单点,每次根据名字调用服务寻址都需要经过这个单点。随着业务访问压力的增长,业务逻辑复杂度的增加和增加分布式定制的需要,我们内部自己在ICE的基础上做了自己的高可用模型。
对于一个服务,会需要多个服务节点来同时提供服务,因为一个server节点可能会无法承担访问压力。不同节点可以部署在不同物理机器上,也可以部署在相同物理机器上。

对于某一业务的服务来说,该服务可提供服务的所有节点在启动时都会向Controller注册自己的位置信息。这样Controller就保存了所有服务节点的信息。
Controller是一个轻量级的中心管理节点。
整体架构可以简化为Observer模式,服务所有节点的位置信息即为Subject,调用者向Controller订阅Subject。
调用者仍然是直接与服务节点通讯,但当调用者第一次调用服务之前,要先从Controller取得服务节点的位置信息,来确定具体调用哪个服务节点。调用者会缓存这些服务节点的位置信息,类似于租约机制,调用者从Controller取得服务节点位置信息之后,这些信息有效期60s。60s之后失效,调用者会异步地重新从Controller拉取服务节点位置信息。这样,并不是每次调用服务都要与Controller通讯,正常情况下,每个调用者每隔60s才与Controller通讯一次。因此,Controller保证了自己的轻量性,不会称为瓶颈和限制。如果Controller结点发生故障,可以迅速重启。在故障期间,调用者仍然可以使用缓存的服务节点信息来调用服务。
当有新服务节点向Controller注册时,Controller会将更新服务节点信息,并推送给所有调用者。
三.应用层的分布式负载调度
知晓服务所有节点的位置信息之后,就可以实现各种各样的分布式模型来决定具体去调用哪个服务,实现应用层的调度算法。像,简单尾号取模,一致性哈希等等。具体选取哪种模型是作为配置放在Controller中的。
服务节点向Controller注册时,分为两种类型,一种是hot节点,另一种是cold节点。正常情况下,只有hot类型的服务节点是会被分布式算法选取对客户端提供服务,cold类型的服务节点正常是不会对外提供服务的。cold节点只会在某个hot节点挂掉时,顶替挂掉的hot节点提供服务。Controller后台会有任务检测hot节点和cold节点状态是否正常,如果检测到有节点挂掉,会发出报警。
下面举例来说明公司内部最常使用的两种简单模型:
1.若干节点中随机选取

如图,各个hot节点之间是对等无状态的,客户端随机选取一个hot服务节点进行调用。cold节点是可选的,如果有cold节点,当hot节点挂掉时,cold节点会顶替hot节点参与随即选取。
2.尾号取模

如图,有10个hot节点,2个cold节点,取模的除数就是10。正常情况下,客户端调用尾号1的hash key就会散在hot节点1上,尾号2的hash key就会散在hot节点2上,等等。如果hot节点5挂掉了,Controller会选取一个cold节点1来顶替hot节点5,通知客户端服务节点信息发生变化并发出报警,客户端调用尾号5的hash key就会散在这个顶替的cold节点1上。hot节点5重启恢复时,会向Controller注册,Controller知道hot节点5恢复了,就会让hot节点5替换cold节点1,并通知客户端,客户端调用尾号5的hash key会重新散在hot节点5上。
Controller会在后台检测各个服务节点是否可用,如果有服务节点挂掉,Controller也会更新服务节点信息,推送给所有调用者,并且发出报警。
本文来源 我爱IT技术网 http://www.52ij.com/jishu/12506.html 转载请保留链接。
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
