对多个tomcat部署同一个应用的认识
2013-05-10 06:19
295 查看
我做的客户端自动升级系统需要在内存或缓存中维持一根可用客户端产品的列表。考虑到在内存中进行读取的速度更快,于是选择在内存中存储一份可用客户端产品的列表。这个列表用一个静态列表对象保存。当新增,修改,淘汰客户端产品时,会对从数据库向这个内存对象中进行同步。
这个设计是完全没有问题的。但是应用到多个tomcat部署这样的同一个实例的时候,问题就出来了。这也是今天上线的积累到的一个教训。上线之后发现,新增了两个客户端产品之后,刷客户端列表却时而能不显示任何信息,时而值显示一个客户端,有时候显示2个客户端,很不稳定。程序要做到的精确在这里变成了不确定因素。
和项目负责人沟通之后,发现问题的根源了。问题在于,我们同一个应用部署了6个tomcat,每个tomcat进程都有自己的进程空间,各自维护自己的内存变量。我通过Action进行可用客户端列表的更新操作只会触发一个tomcat下的应用进行数据同步。最终导致每次刷客户端列表的结果都不一样。
根据这个流程图可以发现,依赖Action进行数据操作,最终只会更新一个tomcat进程下的内存数据。这个问题最后通过设缓存的方式得以解决,即共享数据。如果一定要用将数据存在内存中的话,其实也是可以的,程序中增加一个轮询线程即可,用这个线程同步数据库中的数据。
其实一开始我是想到要用redis的方式缓存数据,但是我喜欢用新的方式解决问题。毕竟用内存存数据比用redis更快。虽然造成上线出问题,最后重新上线,但是并不后悔采用新的方式进行开发。
这个设计是完全没有问题的。但是应用到多个tomcat部署这样的同一个实例的时候,问题就出来了。这也是今天上线的积累到的一个教训。上线之后发现,新增了两个客户端产品之后,刷客户端列表却时而能不显示任何信息,时而值显示一个客户端,有时候显示2个客户端,很不稳定。程序要做到的精确在这里变成了不确定因素。
和项目负责人沟通之后,发现问题的根源了。问题在于,我们同一个应用部署了6个tomcat,每个tomcat进程都有自己的进程空间,各自维护自己的内存变量。我通过Action进行可用客户端列表的更新操作只会触发一个tomcat下的应用进行数据同步。最终导致每次刷客户端列表的结果都不一样。
根据这个流程图可以发现,依赖Action进行数据操作,最终只会更新一个tomcat进程下的内存数据。这个问题最后通过设缓存的方式得以解决,即共享数据。如果一定要用将数据存在内存中的话,其实也是可以的,程序中增加一个轮询线程即可,用这个线程同步数据库中的数据。
其实一开始我是想到要用redis的方式缓存数据,但是我喜欢用新的方式解决问题。毕竟用内存存数据比用redis更快。虽然造成上线出问题,最后重新上线,但是并不后悔采用新的方式进行开发。
相关文章推荐
- 一个tomcat部署多个SSH应用
- 部署一个应用到Tomcat 5.5.17中的第一步配置
- log4j和web.xml配置webAppRootKey 的问题(一个tomcat下部署多个应用)
- 一个tomcat部署多个应用实例总结
- 一个tomcat部署多个应用实例总结
- tomcat7-maven-plugin插件把web应用一键式的部署到一个远程的tomcat中
- 一个tomcat部署多个应用实例总结
- J2EE 定义一个Tomcat中webapps以外的部署应用的Context
- 一个tomcat部署多个应用实例总结
- 一个Web应用部署到Tomcat服务器上之后的目录结构是怎样的?以及web工程与maven web工程的目录结构
- 如何在一个Tomcat下部署两个应用
- 一个tomcat部署多个应用实例总结
- 一个tomcat部署多个应用,有几个JVM?
- IntelliJ 中部署Tomcat应用存在一个带exploded另一个不带exploded
- 一个tomcat部署多个应用
- 04_Tomcat目录结构分析_在Tomcat中部署一个应用
- 一个Tomcat 配置多个应用工程(个人未验证)
- Spring Boot应用服务部署——使用内嵌的tomcat容器
- Tomcat部署Web应用方法总结
- IDEA部署Tomcat应用所有接口中文乱码