Pattern-Oriented Software Architecture v1巨详细读书笔记 7

 本笔记是《Pattern-Oriented Software Architecture vol.1 A system of patterns》原书[page 307-312]的山寨翻译:),包括了Forwarder-Receiver模式的前半部分。
----------------------------------------------

[307]
Forwarder-Receiver
Forwarder-Receiver设计模式为实现点对点交互模型的软件系统提供了透明的进程间通信,它引入forwarder和receiver使peers从底层通信机制中解偶。

[例子]
DwarfWare公司提供管理计算机网络的应用程序,在一个新的项目中,开发组已经定义了一个网络管理的基础架构。用java写成的运行在每个可用的网络节点中的Agent进程组成了系统,这些agent负责观察并监控事件和资源,另外他们还允许网络管理员控制和更改网络的行为,如:更改路由表。为了能交换信息,也为了快速的传播管理命令,每个agent都用点对点的方式连接到远程的agent,都会根据需要扮演client或是server的角色。作为基础架构,需要支持大量不同的硬件和软件系统,端点之间的通信不应该依赖于特定的进程间通信机制。
[图]

[308]
[环境]
点对点通信。

[问题]
构建分布式应用程序的方式通常是采用如TCP/IP、socket或消息队列等可用的底层IPC(进程间通信,inter-process communication)机制,几乎所有的操作系统都提供这些机制,并且同上层机制(如:RPC-remote procedure call)相比这些底层机制效率都非常高,然而这些底层机制通常依赖于更底层的操作系统和网络协议。采用特定的IPC机制限制了可移植性,强制要求系统提供支持异种环境的能力,使得以后很难变换IPC机制。
当你需要平衡以下的强制条件时,Forwarder-Receiver模式就很有用:
    - 系统应该允许变换通信机制。
    - 协作中的组件间遵循点到点的模型,其中的发送端只需要知道接收端的名字。
    - peers之间的通信不应该对性能造成很大的冲击。

[解决方案]
分布的peers相互合作以解决特定的问题,一个peer作为客户端请求服务,一个作为服务器端提供服务,或者由同一个peer扮演两种角色。发送和接收消息这种底层IPC机制的细节及特定的系统功能(如:映射名字到物理位置,建立通信通道,编码/解码消息等),都被封装在独立的组件中,隐藏在peer之外。
[结构]
Forwarder-Receiver设计模式由Forwarder、receiver和peer这3种组件组成:
Peer组件负责应用程序的任务,为了完成任务它需要同其他peer通信,这些peer可能位于不同进程中,甚至位于不同的机器中。每个peer都知道它需要通信的远程peer的名字,它用forwarder发送消息给其他peer,用receiver从其他peer接收消息,这些消息是一个peer发送给远程peer的请求,或者是请求的响应。
[309]
在我们的DwarfWare例子中,Peer就是运行在网络节点上的Agent。他们持续地监视网络事件和资源,并监听从远程agent传入的消息,每个agent可以连接到任意的其他agent交换信息或提交请求。(??)为了让管理者操控网络活动和事件,网络管理基础架构使管理控制台和所有其他的agent连接起来,管理者可用管理控制台给网络中的agent发送请求或接收他们发送回的消息。
[图]

Forwarder组件跨进程边界发送消息,提供从特定的IPC机制抽象出的通用接口,此接口包括消息的编码和分发功能,也包括名字到物理地址的映射。当forwarder发送消息到远程peer时,它用名字到地址的映射关系找到接收端的物理位置,在发送的消息中forwarder描述了他自己所在peer的名字,这样远程peer就能向消息发送源回送响应。
在我们的例子中有集中不同的消息存在:
    - 命令消息,指示接收端执行某些动作,如:更改所在主机的路由表。
    - 信息消息,包含网络资源和事件数据。
[310]
    - 响应消息,允许agent知晓消息已经到达。
forwarder组件负责转发所有这些消息给远程网络agent,同时屏蔽掉对底层IPC机制的任何依赖。

Receiver组件负责接收消息,提供从特定的IPC机制抽象出的通用接口,包括功能:消息接收和解码。
在我们的例子中,receiver代表agent进程等待输入的消息,一旦有消息到达,他们将接收到的数据流转变成通用的消息格式并转发给agent进程。
[图]
下图显示了Forwarder-Receiver设计模式的静态关系。
为了发送消息给远程peer,本地peer用消息做为参数调用它forwarder的sendMsg方法。sednMsg调用mashal将消息转换成底层IPC机制能理解的格式,然后用deliver将IPC格式的消息数据传送给远程receiver。
当本地peer要接收从远程peer送来的消息时,它调用receiver的receiveMsg方法,在返回值中能得到消息。receiveMsg调用了用底层IPC机制接收IPC消息的receive方法,收到消息后receiveMsg调用unmashal将IPC消息转换成peer能理解的格式。

[page 311]
[图]
[动态]
以下的场景图示了典型的使用Forwarder-Receiver结构的例子。2个名为P1和P2的peer相互通信,P1用名为Forw1的forwarder和名为Recv1的Receiver同P2通信,P2用名为Forw2的forwarder和名为Recv2的receiver处理传输的消息:
    - P1向远程的P2请求服务,它向Forw1发送请求并且指定接收端的名称。
    - Forw1确定远端的物理位置,并将消息编码。
    - Forw1将消息发送给名为Recv2的远程receiver。
    - 在之前某个时间,P2请求Recv2等待接收请求,现在Recv2接收到从Forw1发送来的消息。
    - Recv2将消息解码并转发给它名为P2的peer。
[page 312]
    - 同时,P1调用他的Recv1等待响应。
    - P2执行被请求的服务,并发送结果和接收端P1的名字到Forw2,此forwarder将结果编码并发送给Recv1。
    - Recv1从P2接收到响应,将响应解码后发送给P1。
[图]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值