能力值控制实现文档
SMB能力值控制实现文档
功能需求
服务消息总线接口管理添加能力值字段,能力控制体现为:调用次数上限/秒。
第三方应用调用消息服务总线提供的服务接口时,需要实现服务能力权限控制功能。
主要操作类
net.rubyeye.xmemcached.MemcachedClient
获取方法:
MemcachedBaseService.getMemcachedService().getCache();
方法摘要
- GetsResponse gets(String key) 通过key查找一个GetsResponse对象,若key不存在册返回null。通过GetsResponse对象可以获取value和cas版本号。
- boolean add(String key,int exp,Object value) 将key:value保存到Memcached中,并设置过期时间(单位:秒)。若key不存在添加成功,否则失败。
- boolean cas(String key,int exp,Object value,long cas) 通过cas(check and set)保存键值对,若版本号(cas)不一致则保存失败。
实现流程
- 通过gets操作获取一个GetsResponse对象。
- 若GetsResponse不存在,则通过add方法添加(过期时间1秒),若添加成功返回true。
- 重复第一步。
- 判断能力值是否可用(自减后大于0),若可用进行下一步,否则返回false。
- 通过cas添加,若添加成功返回true,否则返回第3步。
- 重试多次后一直没有添加成功则返回false。
伪代码
1. response = memcachedClient.gets(key)
2. if(response==null):
3. ability = getAbility()
4. ability--
5. //exp为过期时间1秒
6. if(memcachedClient.add(key,exp,ability)):
7. //如果add成功则说明第一次增加,在能力范围之内返回true
8. return true;
9. //重试maxTry次
10. for x in (0,maxTry):
11. response = memcachedClient.gets(key)
12. cas = response.getCas()
13. ability = response.getValue()
14. if(ability<=0):
15. return false;
16. ability--
17. //只有当版本号一致才能操作成功
18. if(memcachedClient.cas(key, exp, ability, cas)):
19. //若cas成功则返回true
20. return true
21. return false;
>> 转载请注明来源:能力值控制实现文档 赏
免费分享,随意打赏
发表评论