服务发现:使用WaitPolicy定制服务发现判定策略
Created By RV, and licensed with Creative Commons "CC BY-NC-ND 4.0"
目的与场景
在这一章,讲解如何使用 ServiceFindWaitPolicy,为服务调用WhoHas-IHave动态服务查找机制 设定截止条件:根据何种算法、策略,认定收到的IHave应答,已满足查找条件。
一. 概念
1. 动态服务查找:WhoHas-IHave
Kree4X的服务调用,完全是动态的,对远端服务的存在性,不做任何假设。
內建基于WhoHas-IHave动态服务查找机制。
服务调用发起时,调用发起者向外广播 WhoHas信号:谁可提供service X?
可提供该服务的节点,以IHave信号应答。
2. 等待策略:WaitPolicy
服务查找者,发送WhoHas信号,会进入等待,直至收到满意的IHave应答,或者超时。
如何判定收集到IHave应答已满足查找要求,这个算法、策略,被称为WaitPolicy。
详情,参考:服务动态查找:WhoHas-WaitPolicy-IHave
2. 设定WaitPolicy:waitServiceFind()
获取服务存根后,通过.waitServiceFind(policy)可设定当前存根的WaitPolicy。
二. 示例代码
在下边的示例中,我们将:
- node-a:服务开放者A,注册
sensor.read() - node-b:服务开放者B,同样注册
sensor.read() - caller:调用发起者
收到任意IHave信号即可
// node-a:注册sensor
const nodeA = create('node-a')
nodeA.register('sensor', {
read () {
return 'read-from-node-a'
}
})
// node-b:同样注册sensor
const nodeB = create('node-b')
nodeB.register('sensor', {
read () {
return 'read-from-node-b'
}
})
// 调用发起者
const callerOne = create('caller-one', '等1个提供者')
// 获取服务存根
const sensorOne = callerOne.service('sensor')
// waitServiceFind(one):至少1个,等待3s超时
sensorOne.waitServiceFind(ServiceFindWaitPolicy.one(3000))
const value = await sensorOne.read()
// 被调用的是A或者B,都有可能
三. 须强调的细节
1. 首次服务调用,必触发WhoHas-Ihave
使用服务存根,第一次发起服务调用时,必然触发服务动态发现,从而触发WaitPolicy的执行。
应答了IHave的节点,会被缓存,以备后续使用。
当节点失效时,会从缓存中,被自动移除。
2. 何时再次触发WhoHas-Ihave?
缓存中的节点不足(不再满足WaitPolicy的容忍阈值)时,会补充性触发一次WhoHas-Ihave动态发现,合并缺失节点,同时保留缓存中存活的节点引用。
3. 如何判定接收的IHave信号已足够?
调用ServiceFindWaitPolicy.isEnough (arrivers:Iterable<string>):boolean,返回true,则足够。
候选为节点id(IHave应答的节点、缓存中的服务节点),语义统一,见缓存复用与补充发现。
4. Wait超时
WaitPolicy是ServiceFindWaitPolicy的基类。
使用WaitPolicy(timeout:number)构造子参数timeout参数可设定等待的毫秒值。
ServiceFindWaitPolicy的各种构造方法中,允许指定timeout。
5. 內建的Policy
ServiceFindWaitPolicy 提供以下內建静态工厂方法,按需要的IHave应答数量选择:
ServiceFindWaitPolicy.one(timeout):收集到 1个 IHave应答即认定满足。ServiceFindWaitPolicy.two(timeout):收集到 2个 IHave应答即认定满足。ServiceFindWaitPolicy.three(timeout):收集到 3个 IHave应答即认定满足。ServiceFindWaitPolicy.any(timeout):等待满timeout毫秒,收集所有 IHave应答(不设数量阈值)。
四. 涉及到的API
1. CallerServiceCluster.waitServiceFind:设定WaitPolicy
/**
* 为服务存根设定WhoHas查找的满足判定策略:
* 收集到多少个IHave应答,才认定本次查找已满足需求。
*
* @param {ServiceFindWaitPolicy} waitPolicy - 满足判定策略(阈值 + 等待时长)。
* @returns {this} 当前存根,支持链式。
*/
waitServiceFind(waitPolicy): this
2. ServiceFindWaitPolicy:满足判定策略
// 收集到1个IHave即认定满足,最多收集timeout毫秒
ServiceFindWaitPolicy.one(timeout): ServiceFindWaitPolicy
// 收集到2个IHave即认定满足
ServiceFindWaitPolicy.two(timeout): ServiceFindWaitPolicy
// 收集到3个IHave即认定满足
ServiceFindWaitPolicy.three(timeout): ServiceFindWaitPolicy
// 等满timeout,收集所有应答
ServiceFindWaitPolicy.any(timeout): ServiceFindWaitPolicy
五. 可运行代码
完整示例代码,参见:03-wait-policy.mjs