阻塞应用程序服务器线程的影响
应用程序服务器在 SOA 领域中扮演者不可或缺的角色。作为平台,它们允许应用程序开发人员将重点放在业务逻辑的开发上,而将基础硬件和软件相关细节抽象出来。它们提供安全性、事务完整性、高可用性等服务。作为部署业务服务的平台,应用程序服务器可以发展为 SOA 的基础。因此,务必理解可能会极大影响应用程序服务器的稳定性的一些细节。
应用程序服务器由两个基本线程组件组成:托管线程和非托管线程。
托管线程 是重量级的,与元数据相关联,如事务上下文和安全上下文等。这些线程是执行业务应用程序的事务工作的实体。托管线程由工作负载管理器监视,用于确定是否需要更多的资源来满足所定义的服务级别策略。出现错误时,它们将回滚所执行的事务。它们通常在服务器进程中形成资源池,以便对其进行高效利用。应用程序服务器内的托管线程直接影响和决定服务器处理工作的容量(图 2 演示了此场景)。
图 2. WebSphere Application Server z/OS 线程概览
非托管线程 缺乏与托管线程关联的元数据。这些线程通常都是轻量级的,用于执行缓存清理和对象清理之类的事务。它们的失败并不会直接影响事务的完成,安全需求最小。
应用程序服务器中的托管线程执行事务工作负载,因此会直接影响服务器的总体容量和吞吐量。单个工作线程并不会并行执行两个事务,因此,单个事务完成所需的时间越长,工作线程用于处理此事务所花费的时间越多。在工作线程完成其事务并释放以执行下一个事务前,无法处理任何新工作(图 3 给出了此场景的图释)。应用程序服务器的吞吐量可以通过将单个事务处理的速率乘以服务器内的托管工作线程数量得到。
图 3. 存在错误的示例拓扑
以同步方式调用服务(如远程 Web 服务、EJB 服务或从数据库检索数据)时,工作线程将被阻塞,必须等待从该服务返回的响应,然后才能继续处理正在进行的事务。图 4 显示了服务的多个层次同步连接的场景。在图 4 中,数据库服务是“中枢”,其中存在某种类型的延迟,如数据库中的锁定争用或网络问题。在此场景中,工作流是同步的,例如,服务器 4 在从数据库接收到响应之前无法继续处理,服务器 3 在从服务器 4 中接收到响应之前无法继续处理,如此形成了一个链。延迟存在时间越长,服务器 1、2 和 3 就可能会随着应用程序服务器中越来越多的工作线程被阻塞而变得不可用。实际上,处理此类同步连接过程中的任何延迟都会影响依赖服务,从而最终对承载这些依赖服务的应用程序服务器造成影响。

图 4. 同步服务及其被阻塞的工作线程