一种缓存架构
简单地描述就是一主多从,主的需要低延时,从的无所谓
需求
有时会有这么一种需求,就是多个项目,多个地方共用一个数据库,这样带来的问题也很明显,就是缓存与同步问题.
按我目前的理解,设置缓存很简单,把查询出来的结果缓存一下就好了.但后面的数据库更新了,要通知缓存更新却是很麻烦. 或许有满足特定需求的解决方案,但却想不出能满足全部需求的解决方案.
因此,此文章说的也是满足某个特定需求的解决方案.
介绍
此解决方案需要项目满足以下条件:
- 有
一个
要求低延时
的项目(比如一个游戏服务器,不能承受高延时) - 有
若干
个不要求低延时的项目(比如web项目,http请求延时多个几ms也没事)
缓存架构
那个有低延时要求的项目直接依赖缓存库,就是说缓存库会跟项目运行在同一个进程内,直接调用,这样不会产生额外的延时(如socket延时)
其它的没有低延时要求的项目,可以通过网络请求或其它方式访问这个进程
此架构有点主从
的形式,就是一个主
,若干个从
,主的如果关掉,那从的就没法访问了,虽然说最终都是使用同一个数据库的数据,而且数据库
还在那里,但这里假定主的关掉了,从的也没有必要开启了.
这里还有一个点,就是要求低延时的项目必须是一个
,而不能是多个,因为如果是多个,那这些项目就不一定都在同一台主机上,那这唯一的进程不管
放哪里,都会有部分项目访问产生高延时.比如说若干个游戏服务器(一区,二区,三区…),希望共用一个权限系统,每个游戏服务器都要求权限访问是低延时的,那此架构就不合适了,需要另行采用其它架构.
另外一个点是,因为本机socket访问其实延时也是可以接受的(比如0.02ms),那此项目是否可以弄成一个独立的外接程序呢?如果是外接程序,那必然也是
同步访问的,请求外部的时候线程会阻塞住,就是说不会带来效率上的提升,速度不会更快.
这样做的优点是主
的关闭时,从
的仍然可以正常运行,但主的一般不会长期关闭,如果长期关闭,从的也没有太大必要运行着.
缺点是代码更复杂了,原来只需要调用就可以了,现在还要做接口转一下.
因此综合考虑,并没有太大必要做成外接的程序,直接依赖就行了.
这种架构形式是: 数据库 ---(数据库访问,有点慢)--- 在主项目内运行的依赖(有缓存) ---(远程访问)--- 若干从的项目
PS
本来希望想出一个通用的,至少能满足大部分需求的框架,但最后发现根本想不出…只好退而求其次了,能满足特定的一种需求就行了…