能力值控制实现文档

  • 2016-09-22
  • 2,750
  • 0

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)不一致则保存失败

实现流程


  1. 通过gets操作获取一个GetsResponse对象。
  2. 若GetsResponse不存在,则通过add方法添加(过期时间1秒),若添加成功返回true。
  3. 重复第一步。
  4. 判断能力值是否可用(自减后大于0),若可用进行下一步,否则返回false。
  5. 通过cas添加,若添加成功返回true,否则返回第3步。
  6. 重试多次后一直没有添加成功则返回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;
>> 转载请注明来源:能力值控制实现文档

评论

还没有任何评论,你来说两句吧

发表评论