在面向服务的架构( SOA )中,一个服务的多个客户端组件通常会运行在同一个进程中,同时会作为其它服务的组件。, Udi Dahan 对在这一场景中,如何在客户端与服务器的通信方面,将多个逻辑上的服务调用收集起来,然后将其合并成一个较大的物理调用进行了描述。这种方式可以尽可能地避免高昂的通信开销,否则这将带来更大的成本和延迟。
Udi 是面向服务架构方面的权威,同时也是 NServiceBus 的创建者。他对在客户端和服务器端同时使用松耦合组件时,如何对在客户端 - 服务器之间请求的往返开销作出优化进行了演示。在该演示中,Udi 给出了一个例子,当客户端触发了某个事件时,比如一次按钮点击,将会导致两个客户端组件需要访问它们各自的服务器组件,从而获取到相应的数据。
通常的做法是让每个组件各自发起一个普通的 Ajax 请求,然后通过使用某个封装好的客户端代码库来为订阅事件注册一个回调函数,从而能在数据从服务器返回时触发该回调函数的调用。而 Udi 并没有选择这样做,他使用的代码库可以感知被处理事件的上下文,因此它可以在内存中暂存所有的请求,直到所有回调函数都注册完毕后,它会将所有的请求合并,从而只向服务器发起一个合并后的物理请求。
而在服务器端,一个与客户端相对应的代码库会将该物理请求分拆成一个个独立的请求,并为每个请求调用其相对应的服务器组件。当它汇集到所有服务器组件的处理结果后,该代码库又会将这些结果合并成一个结果返回给客户端。
接着,客户端代码库接收到响应结果,并将其拆分,然后将每个独立的结果分发给各自的客户端组件。而在此时,该事件就被完整地处理完了。
Udi 强调了一点,为客户端和服务器端编写的大部分代码,对该封装的代码库而言是透明的。唯一增加的就是一个通用的进行打包和拆包的代码库,该代码库可以支持在那些由大量的小组件组成的客户端和服务器端之间发起逻辑调用,从而最小化某个物理客户端和某个物理服务器之间实际的请求调用。
评论