你的位置:首页 > 软件开发 > Java > 变通实现微服务的per request以提高IO效率

变通实现微服务的per request以提高IO效率

发布时间:2016-11-26 04:00:09
效率同一次业务操作过程中,往往会出现某种操作被重复执行,逻辑上来讲如果只执行一次是最理想的。这里所指的操作特指一些IO操作,比如从数据库中获取登录人的信息,也就是说如果一次请求中包含5个小逻辑,这5个小逻辑包含3次获取用户信息的操作,理想的情况是3次只有一次是从数据库中加载,其余 ...

变通实现微服务的per request以提高IO效率

效率

同一次业务操作过程中,往往会出现某种操作被重复执行,逻辑上来讲如果只执行一次是最理想的。这里所指的操作特指一些IO操作,比如从数据库中获取登录人的信息,也就是说如果一次请求中包含5个小逻辑,这5个小逻辑包含3次获取用户信息的操作,理想的情况是3次只有一次是从数据库中加载,其余的两次从缓存中获取。

  • 多次调用,每个服务实现独自请求用户信息。

     变通实现微服务的per request以提高IO效率

  • 一次调用,多次读取。首先从Context中加载,如果失败从数据库中加载,最后将结果存入Context。

变通实现微服务的per request以提高IO效率

前提

限于非web环境,这里是dubbo实现的微服务。如果是web环境的话解决问题比较简单,因为我们可以充分利用Spring Framwork中提到的三个bean生命周期的特殊来解决:

案例

将老的价格数据迁移成新的价格数据,这里大概是如下的步骤:

  • 删除新老价格的关系,因为需要支持重复迁移
  • 禁用之前已经存在的价格规则,规则是描述价格在某种场景下生效的逻辑
  • 创建新的价格
  • 创建新的规则
  • 启用新规则

上面步骤的价格,规则,关系数据分别属于三个业务对象,自身都具备CRUD的服务接口,这些CRUD都需要记录操作人信息,记录的标准就是接口传入的操作人所持有的token,我们需要将这个token转换成userId,userName之类的信息与价格,规则等信息一并存储。

时序图如下:

变通实现微服务的per request以提高IO效率

问题:迁移一条价格多次读取用户信息效率低

由于迁移价格会涉及到多个对象的操作,而操作这些具体业务对象的接口并不支持传具体的userId,userName只支持token,所以不可避免的会在保存价格等信息时各自去根据token查询操作人信息。实测一个价格完成一次数据迁移涉及到获取用户信息的次数多达20+次,效率是比较低,如何去解决呢?

现状

由于我目前实现的微服务是无状态的,也不是web环境,所以上面提到的那些bean的作用域功能就使用不上。

目标

实现类似request作用域的功能,一次请求仅执行一次,其余的请求从缓存中获取结果以提高IO操作效率。

方案

可采用TreadLocal来当缓存,存储频繁读取的数据。增加了CacheContext,获取用户首先从CacheContext中取,如果为空则从数据库加载然后回写到Treadlocal中,下一次再请求用户信息时就可以命中缓存不需要再次从数据库中加载,显然效率得到了质的提升。

时序图如下:

变通实现微服务的per request以提高IO效率

实现步骤如下:

  • 创建Context数据对象

     

    海外公司注册、海外银行开户、跨境平台代入驻、VAT、EPR等知识和在线办理:https://www.xlkjsw.com

    原标题:变通实现微服务的per request以提高IO效率

    关键词:

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

可能感兴趣文章

我的浏览记录