同步代理模式 Synchronization Proxy Pattern

同步代理模式 Synchronization Proxy Pattern

模式发现者 : 蔡超

北京天融信,软件架构师

SUN certified Enterprise Architect

Microsoft certified Solution Developer

IBM certified RUP Specialist

联系方式 :[email protected],[email protected]

010-82776427

语境

在基于异步通信方式的系统中,实现模块的同步调用。

问题

消息队列已经成为目前很多软件选用的通讯方式,消息模式使得不同分布式组件间的耦合性较为松散,提高了系统的可维护性和可扩充性。但是有时我们希望在这种情况下能够模拟同步的调用方式,希望能够通过一个组件透明的帮我们实现这种异步和同步调用的转换。

解决方案

p1.jpg
图表
1 基于消息的分布式系统

上图是一种常见的基于消息的分布系统结构,系统中包含两条队列。命令队列用于传送模块间相互调用的命令对象,响应队列用于传送命令处理后的响应结果对象。

在通常情况下消息队列上的模块会以异步的方式工作,这种情况下模块通常不关心命令执行后的状况,常常是不须返回值的。

为了模拟同步调用我们通过一个 SynProxy 组件来帮助我们完成由异步到同步调用的模拟。使得 Client 对其他模块的调好像是同步的一样。

SynProxy 组件的结构如下:

p2.jpg
图表
2 SynProxy 的静态结构

SynProxy: 组织完成异步到同步调用的转换

WaitingQueue: 存放还未获得执行返回值的 Command 对象

UIDCreator: 产生能够唯一标示每个 Command 对象的 UID

ResponseReceiver: 监听响应队列中的响应消息,它在独立的线程中运行

Command :命令对象

Response :响应对象p3.jpg

 

图表 3 将异同步调用转化成同步调用的过程

部分解释: ( 以上以在 JAVA 环境中为例 )

Wait 表示调用 Command wait 方法阻塞住当前线程

Command 执行模块在执行了响应操作后生产 Response 对象用于放回结果, Response 对象中的 UID 属性应该与处理的 Command UID 的值相同

Notify 表示调用 Command notify 方法唤醒被阻塞的线程

上面过程中的 wait 设置了阻塞的超时时间(来自于 Command 对象的属性值)

你可能感兴趣的:(同步代理模式 Synchronization Proxy Pattern)