我在职业生涯中遇到过的一个问题是在分层服务体系结构中,如果单个下游系统进入所有应用程序都陷入死锁或某种无限循环消耗状态,则单个下游系统可能会关闭整个客户端应用程序该系统中的错误。在这种情况下,Java EE服务器上的服务器套接字仍在接受和排队来自客户端应用程序的请求。这将导致客户端应用程序用尽所有线程,以等待来自正确建立的套接字连接的响应。然后,所有用户都被锁定在系统之外,因为他们的请求也正在排队。

我想到了一些解决方案,但我想知道社区中是否有更好的解决方案。

  • 用于下游请求的隔离线程池。这成为一个问题,因为您在系统中混合了空闲线程的数量,从而创建了许多小型池,这些池需要有足够的线程来确保完整的吞吐量。生成线程意味着您需要自己处理事务和安全性上下文。并不是真正受支持的Java EE解决方案。
  • MDB解决方案是Java EE首选的异步解决方案,虽然看起来很笨重,但是具有让应用服务器处理MDB线程池管理的附加好处。 (目前在我的名单上排名第一)
  • ESB。这甚至更重,并增加了更多的网络和处理时间。但是,它允许您设置单个服务超时。还有一个问题,那就是要在一个大公司中实现将永远需要,所以在我的时间范围内可能不切实际。

  • 你们有更好的主意吗?

    最佳答案

    您是正确的,因为MDB情况是正常的解决方案,并且它通常还支持超时,这将有助于避免挂起请求。话虽如此,它可能并不能真正解决问题,而只是将备份转移到您的JMS队列中,而没有将响应发送回客户端。当然,如果几个服务中只有一个导致此问题,则其他服务现在仍然可以访问。

    您的建议(1)也可以通过commonj WorkManager在WebSphere或Weblogic上执行。它将允许您在这些环境中创建托管线程,并且它是轻量级的。

    WorkManager and TimerManager API

    09-10 02:04
    查看更多