构件
中间件是一个软件集合的名字,这些软件位于操作系统和高层次分布式编程平台之间。中间件有时被分为面向消息的中间件和面向对象的中间件。而然现有的大多数中间件都是这两种类型的混合体。当然,现在也有一种趋势是由传统的操作系统直接支持。操作系统总是包含了对通信协议的支持。WEB服务的推进和程序世界从以城市为中心到以协议为中心的转变,导致两种中间件的价值观:支持合适的协议或者提供简化本地服务构造的结构。
独立的中间件产品,如消息队列系统、事务处理监控系统或者集线器,已经慢慢地消失了。取而代之的是结合了中间件功能和某个特定构件框架的特殊的服务器。应用服务器结合了应用管理、数据事务、负载均衡和其他的功能。集成服务器结合了协议转换、数据变换、路由和其他功能。工作流和复杂交互服务器结合了事件路由、决策和其他功能。
异步问题
当前的构建互连标准大多使用某种形式的事件传播机制作为实现构件实例装配的手段。其思想是相对简单的:构件实例在被期望监听的状态发生变化时发布出特定的事件对象;事件分发机制负责接收这些事件对象,并把它们发送给对其感兴趣的其他构件实例;构件实例则需要对它们感兴趣的事件进行注册,因为它们可能需根据事件对象所标志的变化改变其自身的状态。
多线程
“多线程会使你寝食难安。”Swaine在后来的著作中解释,他的一些与此相似的论断具有明显的煽动性,但是他并不认为这些论断是错误的。多线程是指在同一个状态空间内支持并发地进行多个顺序活动的概念。相对于顺序编程,多线程的引入为编程带来了相当大的复杂性。特别是,需要避免对多个线程共享的变量进行并发的读写操作。线程的同步使用某种形式的加锁机制来解决此类问题,但这又带来了一个新的问题:过于保守的加锁或错误的加锁顺序都可能导致死锁。
多线程主要关注于对程序执行进行更好的分配,发送并发请求的客户端能够很好地观察到这种分配。然而,获取性能最大化的手段却根本不依赖于多线程,而是尽量在第一时间内以最快的速度处理用户的请求。即使能够避免死锁,同步也可能导致一定程度的性能损失。必须避免对经常使用的共享资源进行不必要的加锁。跨线程的异常传播也会导致处理非同步的异常变得更加困难。而且,使用多线程和复杂的互锁机制将使得代码调试变得异常困难。
显然,在真正并发的环境下,这些问题无一不需要考虑。例如,如果构件实例运行在独立的处理器上,就需要考虑并发请求的问题。可以在处理一个请求时对某个构件实例进行完全的加锁,但这样做可能会导致死锁或者糟糕的响应时间。