- 浏览: 450193 次
- 性别:
- 来自: 北京
博客专栏
-
张小庆,在路上
浏览量:8577
文章分类
最新评论
-
bad_brain:
很好的文章,帮助我快速了解zookeeper提供的能力以及为什 ...
Zookeeper与paxos算法 -
ixu:
支持,已经买了 是对工作流和BPM的很好总结啊
无知者无畏,一本写了四年的书 -
yangsong158:
看来,我与这个时代有些脱节了。必需加快赶上来。谢谢你的奉献。必 ...
无知者无畏,一本写了四年的书 -
黄粱一梦11:
目标 人没有目标就很容易迷失自己,常常陷入困惑中
PM成长日记第二话-一定要想清楚自己要什么 -
fenian_zhq:
支持。就凭你这个感悟,必须买一本收藏!
无知者无畏,一本写了四年的书
系统要集群,使用SNA方案。
一、 缓存的处理
缓存要使用统一的缓存服务器,集中式缓存。
原先的实现采用ehcache。
在spring里的配置,以资源缓存为例:
<!-- EhCache Manager --> <bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"> <property name="configLocation"> <value>classpath:ehcache.xml</value> </property> </bean> <bean id="resourceCacheBackend" class="org.springframework.cache.ehcache.EhCacheFactoryBean"> <property name="cacheManager" ref="cacheManager"/> <property name="cacheName" value="resourceCache"/> </bean> <bean id="resourceCache" class="com.framework.extcomponent.security.authentication.services.acegi.cache.EhCacheBasedResourceCache" autowire="byName"> <property name="cache" ref="resourceCacheBackend"/> </bean>
cacheManager负责对ehcache进行管理,初始化、启动、停止。
resourceCacheBackend负责实际执行缓存操作,put 、get、remove。
resourceCache实现具有业务语义的业务应用层面的缓存操作,内部调用resourceCacheBackend操作。
现在采用memcached。
关于客户端,采用文初封装的客户端,地址在http://code.google.com/p/memcache-client-forjava/。
使用spring的FactoryBean进行二次封装。同理:
memcachedManager负责对memcached进行管理,初始化、启动、停止。
代码:
/** * User: ronghao * Date: 2008-10-14 * Time: 10:36:30 * 管理Memcached 的CacheManager */ public class MemcachedCacheManagerFactoryBean implements FactoryBean, InitializingBean, DisposableBean { protected final Log logger = LogFactory.getLog(getClass()); private ICacheManager<IMemcachedCache> cacheManager; public Object getObject() throws Exception { return cacheManager; } public Class getObjectType() { return this.cacheManager.getClass(); } public boolean isSingleton() { return true; } public void afterPropertiesSet() throws Exception { logger.info("Initializing Memcached CacheManager"); cacheManager = CacheUtil.getCacheManager(IMemcachedCache.class, MemcachedCacheManager.class.getName()); cacheManager.start(); } public void destroy() throws Exception { logger.info("Shutting down Memcached CacheManager"); cacheManager.stop(); } }
配置:
<bean id="memcachedManager" class="com.framework.extcomponent.cache.MemcachedCacheManagerFactoryBean"/>
resourceCacheBackend负责实际执行缓存操作,put 、get、remove。
代码:
/** * User: ronghao * Date: 2008-10-14 * Time: 10:37:16 * 返回 MemcachedCache */ public class MemcachedCacheFactoryBean implements FactoryBean, BeanNameAware, InitializingBean { protected final Log logger = LogFactory.getLog(getClass()); private ICacheManager<IMemcachedCache> cacheManager; private String cacheName; private String beanName; private IMemcachedCache cache; public void setCacheManager(ICacheManager<IMemcachedCache> cacheManager) { this.cacheManager = cacheManager; } public void setCacheName(String cacheName) { this.cacheName = cacheName; } public Object getObject() throws Exception { return cache; } public Class getObjectType() { return this.cache.getClass(); } public boolean isSingleton() { return true; } public void setBeanName(String name) { this.beanName=name; } public void afterPropertiesSet() throws Exception { // If no cache name given, use bean name as cache name. if (this.cacheName == null) { this.cacheName = this.beanName; } cache = cacheManager.getCache(cacheName); } }
配置:
<bean id="resourceCacheBackend" class="com.framework.extcomponent.cache.MemcachedCacheFactoryBean"> <property name="cacheManager" ref="memcachedManager"/> <property name="cacheName" value="memcache"/> </bean>
resourceCache同上,替换新的实现类MemcachedBasedResourceCache即可。
二、 Session失效的处理
采用memcached作为httpsession的存储,并不直接保存httpsession对象,自定义SessionMap,SessionMap直接继承HashMap,保存SessionMap。
会话胶粘:未失败转发的情况下没必要在memcached保存的SessionMap和httpsession之间复制来复制去,眉来眼去。
利用memcached计数器保存在线人数。
系统权限采用了acegi,在acegi的拦截器链里配置snaFilter
<bean id="filterChainProxy" class="org.acegisecurity.util.FilterChainProxy"> <property name="filterInvocationDefinitionSource"> <value> CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON PATTERN_TYPE_APACHE_ANT /**=snaFilter,httpSessionContextIntegrationFilter,logoutFilter,authenticationProcessingFilter,basicProcessingFilter,securityContextHolderAwareRequestFilter,exceptionTranslationFilter,filterInvocationInterceptor </value> </property> </bean>
注意需要配置在第一个。
snaFilter的职责:
1、 没有HttpSession时,创建HttpSession;
2、 创建Cookie保存HttpSession id;
3、 如果Cookie保存的HttpSession id与当前HttpSession id一致,说明是正常请求;
4、 如果Cookie保存的HttpSession id与当前HttpSession id不一致,说明是失败转发;失败转发的处理:
4.1、根据Cookie保存的HttpSession id从memcached获取SessionMap;
4.2、SessionMap属性复制到当前HttpSession;
4.3、memcached删除SessionMap。
5、 判断当前请求url是否是登出url,是则删除SessionMap,在线人数减1.
代码:
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { final HttpServletRequest hrequest = (HttpServletRequest) servletRequest; final HttpServletResponse hresponse = (HttpServletResponse) servletResponse; String uri = hrequest.getRequestURI(); logger.debug("开始SNA拦截-----------------" + uri); HttpSession httpSession = hrequest.getSession(); String sessionId = httpSession.getId(); //如果是登出,则直接干掉sessionMap if (uri.equals(logoutUrl)) { logger.debug("remove sessionmap:" + sessionId); //在线人数减1 getCache().addOrDecr("userCount",1); getCache().remove(sessionId); } else { String cookiesessionid = getSessionIdFromCookie(hrequest, hresponse); if (!sessionId.equals(cookiesessionid)) { createCookie(sessionId, hresponse); SessionMap sessionMap = getSessionMap(cookiesessionid); if (sessionMap != null) { logger.debug("fail over--------sessionid:" + sessionId + "cookiesessionid:" + cookiesessionid); initialHttpSession(sessionMap, httpSession); cache.remove(cookiesessionid); } } } filterChain.doFilter(hrequest, hresponse); }
利用HttpSessionAttributeListener监听httpsession的属性变化,同步到memecached中的sessionmap。
public void attributeAdded(HttpSessionBindingEvent event) { HttpSession httpSession = event.getSession(); String attrName = event.getName(); Object attrValue = event.getValue(); String sessionId = httpSession.getId(); logger.debug("attributeAdded sessionId:" + sessionId + "name:" + attrName + ",value:" + attrValue); SessionMap sessionMap = getSessionMap(sessionId); if (sessionMap == null){ //在线人数加1 getCache().addOrIncr("userCount",1); sessionMap = new SessionMap(); } logger.debug("name:" + attrName + ",value:" + attrValue); sessionMap.put(attrName, attrValue); getCache().put(sessionId, sessionMap); } public void attributeRemoved(HttpSessionBindingEvent event) { HttpSession httpSession = event.getSession(); String attrName = event.getName(); String sessionId = httpSession.getId(); logger.debug("attributeRemoved sessionId:" + sessionId + "name:" + attrName); SessionMap sessionMap = getSessionMap(sessionId); if (sessionMap != null) { logger.debug("remove:" + attrName); sessionMap.remove(attrName); getCache().put(sessionId, sessionMap); } } public void attributeReplaced(HttpSessionBindingEvent event) { attributeAdded(event); }
利用HttpSessionListener,sessionDestroyed事件时根据sessionid删除memcached里的sessionMap(如果存在)。不再担心httpsession的过期问题。
public void sessionDestroyed(HttpSessionEvent event) { HttpSession httpSession = event.getSession(); String sessionId = httpSession.getId(); logger.debug("session Removed sessionId:" + sessionId); SessionMap sessionMap = getSessionMap(sessionId); if (sessionMap != null) { logger.debug("remove sessionmap:" + sessionId); //在线人数减1 getCache().addOrDecr("userCount",1); getCache().remove(sessionId); } }
三、 文件保存的处理
和缓存类似,采用集中式的文件服务。对于linux,采用nfs。参考文档http://linux.vbird.org/linux_server/0330nfs.php#What_NFS_perm。关键在于对权限的分配。
应用程序本身不用修改。
评论
比如原先的Web服务器宕机了,那Memcached 中的相关信息就无法被删除了
Memcache采用先进先出策略,所以不用担心。
Memcached不是FIFO,而是LRU吧。
是,呵呵。
是LRU....
比如原先的Web服务器宕机了,那Memcached 中的相关信息就无法被删除了
Memcache采用先进先出策略,所以不用担心。
Memcached不是FIFO,而是LRU吧。
是,呵呵。
比如原先的Web服务器宕机了,那Memcached 中的相关信息就无法被删除了
Memcache采用先进先出策略,所以不用担心。
Memcached不是FIFO,而是LRU吧。
接入第二个server 就会产生一个新的session吧,哈哈,首先session默认是不可序列化的。那么请看步骤四:
4、 如果Cookie保存的HttpSession id与当前HttpSession id不一致,说明是失败转发;失败转发的处理:
4.1、根据Cookie保存的HttpSession id从memcached获取SessionMap;
4.2、SessionMap属性复制到当前HttpSession;
4.3、memcached删除SessionMap。
比如原先的Web服务器宕机了,那Memcached 中的相关信息就无法被删除了
Memcache采用先进先出策略,所以不用担心。
比如原先的Web服务器宕机了,那Memcached 中的相关信息就无法被删除了
发表评论
-
Zookeeper与paxos算法
2012-03-22 20:36 16687一、 zookeeper是什么 ... -
关于异常的问与答
2010-09-16 22:34 1113今天的问题是关于异常 ... -
一家公司发展的胡言乱语
2010-01-16 23:06 2805终于一天早上,睁开极 ... -
数据驱动测试
2009-12-05 22:25 4152我们从一个最简单的登录例子开始。最开始我们需要验证在用户名和密 ... -
《Head First Process-深入浅出流程》连载预告
2009-10-17 22:58 6139似乎一到年末,就会忙 ... -
也说炮轰
2009-10-05 13:13 1912社区里目前最火的无疑 ... -
使用selenium测试showModalDialog模态对话框
2009-07-27 21:10 7010Selenium目前没有提供对IE模态对话框(即通过showM ... -
(Multi-stage Continuous Integration)多阶段持续集成
2009-05-26 23:08 1219一、目前的情况 目前我 ... -
JbpmSide 流程设计器进度
2009-03-26 22:15 4400汇报一下设计器当前进度以及下一阶段主要的开发目标。 当前进度主 ... -
jBPM-side流程设计器功能规划
2009-03-08 21:57 2212目标: jBPM-side ProcessDesigne ... -
Flex框架Riawave应用以及对AJAX开发框架的思考
2009-03-01 22:05 1177Jbpmside要使用Flex开发流 ... -
你服务,你全家才服务
2009-02-19 14:18 1642在拥挤的公交车上读完《工作流管理(模型、方法和系统)》,自从搬 ... -
工作流技术基础读后
2009-02-09 18:03 1645大概花了三天的时间读完这本书,书本身也 ... -
BPM向左,工作流向右(二)工作流系统杂谈
2008-11-07 11:28 2290当 面对一个完整的工作流系统时,你可能会被它众多的功能所困惑: ... -
SNA方案之session炒冷饭
2008-09-04 14:49 2046SNA方案中,session的处理是一个重要方面。原帖见这里: ... -
一次性能调优的实战
2008-09-01 12:56 1889项目情况:是一个大型 ... -
BPM向左,工作流向右(一)什么是业务流程
2008-08-26 17:43 2379从事工作流以及相关开 ... -
js组件的测试,是个问题
2008-08-11 19:06 1065用js编写自己的组件,测试一直是个头疼的问题。最开始大量使用a ... -
工作流之收回
2008-07-15 18:31 1560收回 收回是工作 ... -
从贫血到充血Domain Model
2008-07-03 12:01 1688关于Domain Model的讨论已经非常多了,炒炒冷饭,这里 ...
相关推荐
Arcus 是一个基于 memcached 的云缓存,由 NAVER Corp 公司开发。 arcus-memcached 经过大幅度的修改,可以支持 NAVER 的功能和性能要求。Arcus 支持多种数据机构 (List, Set, B tree),除了支持基本的memcached ...
Tomcat基于memcached的session保持-nginx反代
C#使用memCached实现缓存 Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态、数据库驱动网站的速度。...
Memcached Go Queue, 简称mgq, 是一个用Go语言写的,基于memcached协议的消息队列。其父亲mcq是最早应用于weibo的基础消息中间件,有着高性能,解耦的优点,使得其广泛应用于微博
tomcat中Nginx+memcached实现session共享 所需要的jar包
公司要求组织一个基于Java的memcached培训,整理了这个文档。里面有4个文件,包括memcached部署,memcached培训,监控工具memcache-top安装和daemontools安装。文档是基于word2013的,打不开的话,右键--属性--解锁
在分析了几种典型的词典机制优缺点的基础上,提出一种基于memcached的动态四字双向词典机制。该词典机制有效减少了文章分词过程中对词典的访问次数,同时具有维护方便及快速添加和删除临时词等优点,适合在Web上采用...
memcached实现集群的session共享问题,处理集群服务器情况下,memcached的session共享解决方案
j2ee项目使用filter和memcached实现session服务器
里面包括了Memcached的相关实例程序,提供给大家分享
对于 Memcached 来说,本身是集中式的缓存系统,要搞多节点分布,只能通过客户端实现。Memcached 的分布算法一般有两种选择:
Nginx+Tomcat+Memcached实现tomcat集群和session共享 nginx配置
在终端(也即cmd命令界面)下输入 ‘c:\memcached\memcached.exe -d install’ 安装 3. 再输入: ‘c:\memcached\memcached.exe -d start’ 启动。NOTE: 以后memcached将作为windows的一个服务每次开机时自动启动...
memcached, libevent, MemCachedClient
Memcached使用实例源码(基于.net),基于.net的mem dll以及源码,memcached使用,优缺点简介ppt
memcached 64位 window memcached 64位 window memcached 64位 window
为了使web应用能使用saas模式的大规模访问,必须实现应用的集群部署.要实现集群部署主要需要实现session共享机制,使得多台应用服务器之间会话统一, tomcat等多数服务都采用了session复制技术实现session的共享
NULL 博文链接:https://guazi.iteye.com/blog/1071646
nginx+tomcat8+memcached session共享所需jar包 直接放到tomcat/lib下即可
tomcat memcached nginx 实现session共享,实现登录登录