高并发场景下使用缓存能够有效下降并发QPS对于数据库的压力,可是使用缓存就必须面对数据一致性的问题。java
有效利用java多线程特性并行计算,充分利用CPU资源。 在序列化处理上考虑更好的工具,好比以前数据是用XML,JSON存储,随着访问量的飙升,CPU和带宽带来了很大的压力,后来咱们本身定义了一种传输协议和序列化方案,一方面数据压缩到原来的30%~40%,极大节约了宽带,同时CPU的运算量大大下降,服务器数量也随之减小。数据库
好比咱们以前用Fastjson,正常状况下确实解析很快,可是一旦并发量上来后,就会愈来愈吃内存,甚至JVM很快内存溢出。 缘由是Fastjson设计的初衷是先把整个数据装载至内存,而后解析,因此执行很快,但会至关消耗内存。json
因此Fastjson是有他适合的使用场景的,做为架构师须要对本身的场景有很好的理解,在技术选型上有很好的取舍。缓存
同时引入NIO解决过多长链接致使的系统稳定性和开销问题。服务器
为完成数据异步更新到缓存,能够采用消息队列方式(主备AMQ)来管理异步任务。 异步更新缓存的核心逻辑是,如何判断缓存过时。上图中引入了一个Router。 举个例子:运营会设置细化一个航班段的缓存有效期,好比北京到纽约,通常来讲买机票的人很少,航班信息缓存几天没有问题,但若是是北京到上海,可能只能最多5分钟了。多线程
Router解决的复杂工做,咱们叫“去伪存真”。进行一些规则设计,这个规则设计须要很灵活,也能够引入消息队列进行异步化解耦,进行很好的读写分离。架构
总体系统流转并发
当缓存系统相关数据过时后,前台搜索告知MQ有实时搜索任务,MQ统一把异步任务交给Router,这是Router不会直接请求下游数据,而是找Node池。异步
Node池会动态分配一个Node节点给Router,最后Router查找Node节点映射的数据,最后异步更新到缓存数据。高并发