对多个tomcat部署同一个应用的认识

    我做的客户端自动升级系统需要在内存或缓存中维持一根可用客户端产品的列表。考虑到在内存中进行读取的速度更快,于是选择在内存中存储一份可用客户端产品的列表。这个列表用一个静态列表对象保存。当新增,修改,淘汰客户端产品时,会对从数据库向这个内存对象中进行同步。

    这个设计是完全没有问题的。但是应用到多个tomcat部署这样的同一个实例的时候,问题就出来了。这也是今天上线的积累到的一个教训。上线之后发现,新增了两个客户端产品之后,刷客户端列表却时而能不显示任何信息,时而值显示一个客户端,有时候显示2个客户端,很不稳定。程序要做到的精确在这里变成了不确定因素。

    和项目负责人沟通之后,发现问题的根源了。问题在于,我们同一个应用部署了6个tomcat,每个tomcat进程都有自己的进程空间,各自维护自己的内存变量。我通过Action进行可用客户端列表的更新操作只会触发一个tomcat下的应用进行数据同步。最终导致每次刷客户端列表的结果都不一样。

 对多个tomcat部署同一个应用的认识_第1张图片

    根据这个流程图可以发现,依赖Action进行数据操作,最终只会更新一个tomcat进程下的内存数据。这个问题最后通过设缓存的方式得以解决,即共享数据。如果一定要用将数据存在内存中的话,其实也是可以的,程序中增加一个轮询线程即可,用这个线程同步数据库中的数据。

    其实一开始我是想到要用redis的方式缓存数据,但是我喜欢用新的方式解决问题。毕竟用内存存数据比用redis更快。虽然造成上线出问题,最后重新上线,但是并不后悔采用新的方式进行开发。

你可能感兴趣的:(对多个tomcat部署同一个应用的认识)