关键技术介绍
一方面系统要求快速、灵活、可扩展的特性。随着一期微语项目完成,并应用到生产环境中,我们可以感觉到微语给用户带来的全新感受和体验的同时,不断增长用户量和不断添加新的功能对服务器性能提出更加苛刻的要求。这就需要服务器系统提供给用户的服务更稳定、更高效!
另一方面由于采用Spring +MemCache+ Mybatis+Mysql的软件架构,在二期的升级中我们需要用最小改动带来最大性能提升与更佳的稳定性。
所以我们准备加入与应用相关的缓存来提高用户感受度。由于原来做的项目也有一些可以参照的经验,所以一并把一些考虑到的地方写进来以供参考。
首先谈下加入缓存:
通用缓存特性:
1. 是一个有界队列,队列中对象个数在配置文件中可配置。
2. 队列满后处理机制,比如队列满后通过:FIFO或LRU或LFU踢出对象如何处理.(存入数据库、抛弃并记录日志等)。user做个缓存,启动时加载数据库中10万数据,队列大小为20万,对于无命中情况对数据库进行操作并把操作后当前记录添加到缓存中,队列满时踢出一个用户对象,通过一段时间此缓存命中率会逐渐提高(经常在缓存中可一定为活跃用户数,对于捕获用户行为极有帮助---数据挖掘一部分)。可对队列做一些监控和分析。(晚上记录当天活跃用户数)其实Hibernate已经实现对象缓存和查询缓存。但个人认为不够灵活。对于不同应用建立对应缓存。
特殊缓存--分页缓存:
1. 建立三级缓存。如果只用一级缓存,当缓存中数据有更新时,需要全部清掉(Hibernater)。而且遍历的开销大的惊人。(原来1颗4核HP580机器只能遍历200次左右)。
2. select id from blogissue where mimier=10447 order by create_time desc limit 0,5 获取用户对应的博文。
3. 三级缓存如下:
一级缓存是:
Key键(long型) | Value值(类型B) |
3 | id=3的blogissue对象 |
4 | id =4的blogissue对象 |
8 | id =8的blogissue对象 |
…… |
二缓存是:
Key键(String型) | Value值(ArrayList型) size=1000 |
from blogissue order by create_time desc limit 0,50 | ArrayList,对应取出来的所有id |
from blogissue order by create_time desc limit 50,50 | ArrayList,对应取出来的所有id |
from blogissue order by create_time desc limit 100,50 | ArrayList,对应取出来的所有id |
…… |
三级缓存:
Key键(String型) | Value值(HashMap) | ||||||||||
mimier =10447 |
| ||||||||||
mimier =10256 |
| ||||||||||
mimier =10013 |
| ||||||||||
…… |
这种分页缓存好处就是命中率高,可支持每天百万请求量(非常吃内存),并且如果一个mimier对应数据添加或更新只需:
A. 清除三级对应记录重新添加
B. 清楚二级缓存重新添加,对于没有二级缓存需求直接去掉也可以。
C. 更新和添加对应记录即可。
这样效率很高,以往我们做了一级和三级缓存情况查询,添加和更新数据都很快。需要使用懒汉加载。
关联查询想法
对于一对多的关系,我在原来项目中实现把多条记录(有限记录)以一个字段来存储,加快数据访问速度。
日志系统:
记录日志格式,我们是这样用的:
[日期:时间] [线程号] [类名] [手机号码] [参数]
例如:
[2010-07-01 14:38:10][Thread-2][BindingDaoImpl][13693601659][ip=127.0.0.1,imsi=15046002045,type=1,content=内容,list=,cmd=,dest=,result=0]
这样日志格式有利于锁定问题手机查询错误(可以是呼呼号)。且这种格式我们可以快速做容灾处理。
故障容灾模块
当数据库当机,数据库硬件问题情况下使用,在负载均衡器上做重要信息持久化到文件。
SNMP监控告警服务
对于突发时间及时通知到对应人员,可以帮助最快速解决问题。
动态策略定制服务
运用JMX实现重要参数动态更新和加载,在突发事件情况下不需要重启中间件情况改变策略,这个功能与监控和告警模块联合起来使用效果更佳。
支持插件加载服务
通过使用OSGI实现动态加载和卸载服务的能力,尤其对于分布式系统策略多元性极有帮助,可根据不同地域、时间指定差异化服务策略。
硬件组网图