我们正在考虑在 Java EE 中开发任务关键型应用程序,让我印象深刻的一件事是平台中缺少会话隔离。让我解释一下这个场景。
我们有一个本机 Windows 应用程序(一个完整的 ERP 解决方案),每月从稀疏的贡献者那里接收大约 2k 个 LoC 和 50 个错误修复。它还支持脚本,因此客户可以添加自己的逻辑,我们不知道这些逻辑的作用。每个服务器节点都没有使用线程池,而是有一个代理和一个进程池。代理接收客户端请求,将其排入队列直到池中的实例空闲,向该实例发送请求,向客户端传递响应,然后将实例释放回进程池。
这种架构是健壮的,因为有这么多的稀疏贡献和自定义脚本,部署的版本有一些严重的错误并不罕见,例如无限循环、长期等待的悲观锁、内存损坏或内存泄漏。我们实现了内存限制、请求超时和简单的看门狗。每当某个进程未能按时正确响应时,代理就会简单地将其杀死,因此看门狗会检测并启动另一个实例。如果一个进程在开始响应请求之前崩溃,代理将相同的请求发送到另一个池实例,并且用户不知道服务器端的任何故障(管理日志除外)。这很好,因为有些实例在处理请求时会被虚假代码慢慢破坏。
现在考虑迁移到 Java EE,我在规范或流行的应用程序服务器(如 Glassfish 和 JBoss)上找不到任何类似的东西。是的,我知道大多数集群实现都使用会话复制进行透明故障转移,但是我们有一些小公司在简单的 2 节点集群上使用我们的系统(我们也有冒险者在 1 节点服务器上使用系统) . 使用线程池,我知道一个有问题的线程可能会导致整个节点停机,因为服务器无法检测到并安全地杀死它。关闭整个节点比杀死单个进程要糟糕得多——我们的部署中每个节点都有大约 100 个池化进程实例。
我知道 IBM 和 SAP 都意识到了这个问题,基于
, 分别。但是根据最近的 JSR、论坛和开源工具,社区上的活动并不多。
现在问题来了!
如果你有类似的场景,使用 Java EE,你是怎么解决的?
您是否知道即将推出的开源产品或 Java EE 规范的变化可以解决这个问题?
.NET 有同样的问题吗?你能解释或引用参考资料吗?
你知道一些可以解决这个问题并且值得做 ERP 业务逻辑的现代开放平台吗?
拜托,我不得不问你不要告诉你做更多的测试或任何类型的质量保证投资,因为我们不能强迫我们的客户在他们自己的脚本上做这个。我们也有紧急错误修复必须绕过 QA 的情况,虽然我们强迫客户接受这一点,但我们不能让他接受有错误的软件部分会影响一系列不相关的功能。这是关于健壮架构的问题,而不是开发过程。
感谢您的关注!