我们有一个本地Windows应用程序(完整的ERP解决方案),每月接收来自稀疏贡献者的约2k行代码和50个漏洞修复。它还支持脚本编写,因此客户可以添加自己的逻辑,而我们对这些逻辑一无所知。每个服务器节点都有一个代理和进程池,而不是使用线程池。代理接收客户端请求,将其排队直到有可用的池实例,发送请求到该实例,将响应传递给客户端,并将实例释放回进程池。
由于存在如此多的稀疏贡献和定制脚本,这种架构非常强大,部署版本通常会出现一些严重的错误,例如无限循环、长时间等待悲观锁、内存损坏或内存泄漏。我们实现了内存限制、请求超时和简单的看门狗。每当某个进程未能正确及时地回答时,代理就会简单地杀死它,因此看门狗会检测并启动另一个实例。如果进程在开始回答请求之前崩溃,代理将向另一个池实例发送相同的请求,用户不会知道服务器端的任何故障(除了管理员日志)。这很好,因为一些实例正在处理请求时被虚假代码缓慢地破坏。由于大多数会话数据保存在客户端或(在极少数情况下)共享存储中,它似乎可以完美地运行。
现在考虑转移到Java EE,我在规范或流行的应用程序服务器(如Glassfish和JBoss)中找不到类似的东西。是的,我知道大多数集群实现都可以通过会话复制进行透明故障转移,但我们有一些小公司在简单的2节点集群上使用我们的系统(我们还有一些冒险家在单节点服务器上使用该系统)。使用线程池,我理解有一个有漏洞的线程可能会使整个节点崩溃,因为服务器无法检测并安全地杀死它。使整个节点崩溃比杀死单个进程要糟糕得多-我们有每个节点约100个池化进程实例的部署。
我知道IBM和SAP意识到了这个问题,基于http://www.trl.ibm.com/people/kawatiya/pub/Kawachiya07vee.pdf和http://java.sys-con.com/node/47362。但基于最近的JSR、论坛和开源工具,社区中并没有太多活动。
现在来看问题!
如果您遇到类似的情况并使用Java EE,您是如何解决的?
您是否了解即将推出的开源产品或Java EE规范的变更,可以解决此问题?
.NET是否有相同的问题?您能否解释或引用参考资料?
您是否了解一些现代化和开放式平台,可以解决此问题,并且值得为ERP业务逻辑而努力?
请注意,我必须要求您不要提及进行更多测试或任何类型的QA投资,因为我们不能强迫客户在其自己的脚本上进行测试。我们还有紧急修复bug的情况必须绕过QA,虽然我们强制客户接受这一点,但我们不能让他接受一个有缺陷的软件部分可能会影响一系列不相关的功能。这个问题涉及到健壮的架构,而不是开发过程。
感谢您的关注!