一种分布式微服务架构系统缓存解决方案
2020-02-22李宁张轶昀
李宁 张轶昀
摘要:该文叙述了一种基于微服务架构的分布式系统双缓存解决方案,经过实践,该方案对分布式系统中大数据量参数查询交易产生了良好的性能提升作用。
关键词:微服务;应用缓存;公共缓存
中图分类号:TP393 文献标识码:A
文章编号:1009-3044(2020)36-0073-02
Abstract: This article describes a distributed system double cache solution based on microservice architecture. Through practice, the scheme has a good performance improvement on the query transaction of a large amount of data in a distributed system.
Key words: microservice; application cache; public cache
前后端分离的设计方案,有效提高了系统的开发效率,同时使得微服务架构中的服务共享成为可能,目前正在成为主流系统开发架构之一。本文基于银行财会综合管理系统,讨论一种基于微服务架构的分布式系统缓存解决方案[1]。
财会综合管理系统由公共应用、核算会计、管理会计、预算、估值、合同等十几个子系统构成。各个子系统均采用前后端分离架构,SpringBoot开发,系统部署及数据库均相互独立。为使用户对分布式无感,所有子系统进行了统一的微服务发现中心地址配置。如图1所示:前端发起的交易,通过统一网关,交易码被转换为微服务识别码,经微服务发现中心转发到对应的后台服务器,后台响应报文原路反向回传前端。系统主要使用了扩展的Spring Cloud注解,Eureka服务注册发现组件(服务注册发现、服务续约、获取注册列表信息、服务下线、服务剔除)、Ribbon负载均衡组件、Feign面向接口调用组件、Zuul微服务应用网关组件、Hystrix断路器组件、Sleuth全链路采集组件、Redis缓存集群以及接口描述组件Swagger。应用系统镜像使用K8S部署。
除公共应用外,其他子系统均有自己明确的业务属性及交易特点。公共应用为所有登录子系统的用户提供统一鉴权、会话保持、权限控制以及公共参数的取用。公共参数主要包括机构数据、员工数据、用户数据、财会产品、会计科目、汇率等适用于全平台的基础数据。各个子系统与公共应用间存在大量的参数查询交易。例如财会产品维护时,产品所属部门、所属科目数据在子系统仅保存ID号,查询反显时需要从公共应用查询中文名称。
微服务架构,有效提高了交易的可复用性,但同时增加了网络损耗。由于财会系统数据量大,运算复杂的特点,大数据量的参数访问及需要控制用户权限的数据查询交易对整体系统的性能提出挑战。为了改善系统效率,本系统设计并应用了一种双缓存策略。
所有子系统分别配置应用缓存和公共缓存两组Redis服务器集群[2]的访问路径,每组服务器内部互为三-三主备。应用缓存用于存放子系统私有数据的缓存信息,由子系统自行搭建。公共缓存由公共应用系统搭建,并进行写入与更新,各子系统仅拥有读权限。如图2所示:子系统发起查询交易时,先访问应用缓存,如未命中,则访问公共缓存,仍未命中,才通过面向接口调用组件Feign,发起交易,经微服务注册中心中转至公共应用后台服务。公共应用响应后,如该查询交易已配置缓存加载,则会将本次查询内容加载入公共缓存,缓存Key通常使用逻辑数据库表主键或主键对。系统使用SpringBoot注解类并进行了扩展,使得缓存加载配置仅需为指定的查询交易添加@Cacheable注解,指定使用的缓存名以及缓存id。
由于為查询类交易在缓存未被命中时添加缓存,缓存未被访问时间超过阈值才清除,可能导致动账类交易对数据的修改,在缓存失效前无法被重新加载。对于一些热表数据,可能存在全天驻留缓存的情况,可能产生以下现象:用户在公共应用系统对机构数据进行了修改,但由于缓存中存在原数据,子系统查询交易依然返回修改前数据,由此出现缓存脏读现象。以上情况可以通过两种方案解决:1)每日批量;2)实时刷新。
为提高缓存命中率,公共应用系统每日批量于每天早上5点进行参数预读入,先清空缓存,自动发起机构、员工、财会参数等常用数据的查询交易,进行缓存预加载。此举不仅可以在系统正式服务时拥有良好的缓存命中率,且可解决缓存脏读问题。经实测,系统每日8点正式对外提供联机服务,日常状态下,双缓存命中率可达到95%以上。此方法适用于可容忍T+1时效的系统数据。对于实时性要求很高的数据,如汇率,采用实时刷新方式。在修改了该数据的动账交易结束后强制刷新缓存内容。出于对整体性能的考虑,本系统对交易进行分类,综合运用了两种方法。
为系统添加双缓存后,系统的整体性能有了显著提高。以4000条用户权限范围内的机构数据下载为例(机构视图表数据量约50万,每条记录约50个属性,大部分属性需要子表翻译),添加缓存前,测试环境响应时间约2分钟,添加缓存后同环境响应时间降至20s以内。
参考文献:
[1] 黄向平,彭明田,杨永凯.基于内存映射文件的高性能库存缓存系统[J].电子技术应用,2020,46(7):113-117,126.
[2] 宁方美,贺雪梅,牟晋娟.SpringBoot集成Redis缓存技术在企业一卡通系统中的应用[J]. 电子技术与软件工程,2019(24):133-134.
【通联编辑:唐一东】