Java Web项目如何做到升级不断掉服务,同时涉及到的相关问题
Java Web项目如何做到升级不断掉服务,同时涉及到的相关问题
原文地址:https://m.oschina.net/question/737237_2203576
现在容器用的是tomcat,做维护比较多,因为程序老是要升级,更新了class文件,必须要重启环境,这样的话用户体验就非常差,而且耽误时间,实际开发中我用了jrebel插件倒是没什么问题,但是生产环境好像都不推荐这个东西,想问下大型的项目是如何做到的呢?
一般是这样,首先,网站架设成,负载均衡器+应用服务器+Session服务器的模式。Session服务器常见的用redis、memcache都有。更新的时候,先把一部分(比如1/3)应用服务器下线,更新应用,再重新上线。之后再逐步更新剩下的部分。一次更新1/3的话就分三次上线完成。
可以使用nginx做一台backup服务器,先更新backup服务器,测试完成以后,更新其他非backup服务器。
那现在2/3的服务器上是新代码,1/3的服务器上是老代码。 访问这两组的用户看到的功能是不是不一样?这个怎么解决呢?
tomcat、glassfish、jboss等都是支持热部署的,修改一个类是不用自己手动重启web服务器的,只有修改外部jar包中的类则必须重启,不然jar包会冲突,不会替换,当然这种热部署是重新加载web容器,性能不佳。生产环境是不建议开启热部署的。
你可以在网上搜索一下java服务器代码class类热更新,有一大堆资料,当然你也可以用groovy、jruby、scale这些本身运行于jvm而且可热更新的脚本语言,甚至jdk自带一套解析运行js脚本的引擎,还有一种方案就是用业务规则引擎,比如Drools,不过这个也要学习另外一种脚本。
大且稳健和高并发的项目往往不是单一的语言能做好的,需要多方面的结合,java组件框架这么多,就需要优秀的架构师去利用整合了。我们并不一定能生成开发出多么优秀的东西,但应该合理利用其它优秀的东西。
影响有多大,你一台Tomcat,估计用户也不会多到哪里去吧,凌晨进行。几秒种而已
1、session可以挂Redis或者Memcached.应用服前面挂nginx或者haproxy做负载均衡。或者只做反向代理也行,nginx和haproxy基本是秒起的,不过不建议这么做。
2、tomcat是可以开启热加载的,不过一般不建议开启,热加载易导致PermGen space溢出。
3、jdk7以后开始可以做classloader的卸载,jdk8以后从permgen替换到了metaspace,理论上可以避免permgen的溢出问题,有兴趣可以试试自己写一个应用服务器实践一下。
1:旧数据兼容新功能问题。
升级后,比如报表功能新增了字段,那么历史数据可能没有新增加的字段的功能。
2:升级的时候session的问题。
升级的时候,如果负载均衡使用的是黏性策略(session不共享),那么升级服务的时候,肯定有些用户的功能会断掉的,所以一般选择晚上,或者人少的时候升级系统。
升级的时候如果负载均衡策略是session共享,同样有问题,有的用户前一秒连上服务器A,下一秒连上服务器B,那么如果B服务器上的功能是新的,但是还不流程并不兼容之前的老服务,那么用户的操作可能进行不下去。
最好的策略是黏性策略和Nginx搭配起来用,首先一部分服务器空出来,直到没人用这些空出来的服务器之后,开始进行升级。升级之后。已经连接上旧服务的用户,还是使用之前的服务器进行连接,新接入的用户,旧转接到新的服务器上去。等旧服务所在的服务器已经没有人用的时候,再将旧服务器进行更新。
最新文章
- 两种遍历list
- Hibernate注解方式配置-继承关系
- [BUG集] android 安卓项目中ORMLITE框架 Must specify one of id, generatedId, and generatedIdSequence with Id
- BZOJ1483——[HNOI2009]梦幻布丁
- NET 2.0 OCR文字识别技术(Tesseract 引擎)[转]
- 285.	Inorder Successor in BST
- 用RSA实现Web单点登录密码的加密传输
- ubuntu12.04已安装SQLite3 而简单易用
- iphone 屏幕投射到Mac上
- QPixmap有缓冲区的
- [Angular 2] Get start with Firebase
- web.xml中servlet, bean, filter, listenr 加载顺序汇总
- Skynumber
- TCP为什么不是两次握手而是三次?
- JavaScript状态模式及状态机模型
- Confluence 6 PostgreSQL 输入你的数据库细节
- Python的图像库
- Android FileUtils 文件操作类
- unity物理检测的几种方式
- SV搭建验证环境