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

我们已经从上一个笔记中知道了Client-Dispatcher-Server是从那种环境中,为了解决何种问题而提出的,而且也知道了Client-Dispatcher-Server的结构和动态场景。但是如何在我们的开发过程中实现这一模式?这个问题在本次笔记中详细描述。


本段笔记是《Pattern-Oriented Software Architecture vol.1 A system of patterns》原书[page 327-331]的山寨翻译:),包括了Client-Dispatcher-Server模式的剩余部分,主要描述实现小节。
--------------------------------------------

[page 327]

[图]

[实现]
采用以下步骤可以实现Client-Dispatcher-Server的结构,这些步骤不用严格按照给定的顺序执行,因为有一些是相关的:
  1 将应用程序分为server和client。定义出哪些组件应该被实现成server,并标识出访问这些server的client。如果正在构建的应用程序必须集成已存在的server,则在某种程度上已经预先确定了client和server。如果client也可以充当server,server也可做client,则他们的角色不能预先确定,需要在运行时动态的改变。
[page 328]
  2 确定采用何种通信设施。选择client-dispatcher-server三者之间的通信设施(包括:client-dispatcher,dispatcher-server,client-server)。对于这三种连接,每种都可以采用不同的通信机制,也可以采用相同的通信机制。采用单个通信设施可以减少实现时的复杂性,但有时候因为性能之类的原因采用这种单个通信设施的方式不合适,也不可行,如:当client和相应的dispatcher在同台机器上时,这两种进程间通信的最快方法是用共享内存;而server也许是分布在与client和dispatcher不同的机器上,因此dispatcher与server之间以及client与server之间的通信,socket才是更好的选择。
  如果要将已存在的server集成到应用程序中,则此server采用的通信机制将会影响通信机制的选择。
  如果所有组件都位于相同地址空间,则组件间的交互可以依赖于传统的接口调用。
  3 定义组件间的交互协议。考虑下图:
[图]
[page 329]
  协议描述了一系列有序的组件间通信通道初始化和维护动作,也描述了之间传输的的消息和数据的结构。client-dispatcher-server模式实现了3种不同的协议。
  server和dispatcher之间的交互协议DSprotocol,致力于2个论题:描述server如何注册到dispatcher;描述哪些动作是建立dispatcher和server的通信通道的必要动作。
  client和dispatcher之间的CDprotocol,定义了client请求dispatcher同特定server建立连接的交互协议。如果因为网络或server问题造成通信连接失败,dispatcher会将此失败通知给client,在报告错误之前dispatcher也许会尝试建立几次连接。
  CSprotocol描述client和server之间如何对话,这种对话包含以下步骤:
  - client使用之前建立的通信通道发送消息到server,client和server都要知晓他们之间传递的message语法和语义。
  - server收到消息,解析之,并调用相应的服务,在服务完成后,server返回一条消息给client。
  - client从消息中取得服务的结果,并继续执行它的任务。
  4 确定如何命名server。4字节的网络IP地址不适合用来命名server,因为它没有提供位置透明性,如果用IP地址,client将依赖server的具体位置。需要引入唯一标识server的名字,但是这个名字不应该带任何位置信息,如:用类似‘ServerX’这样的字符串或类似ID_SERVER_X这样预定义的常量,这些独立于位置的名字通过Dispatcher映射到物理地址(参见步骤5)。
[page 330]
  5 设计并实现Dispatcher。确定如何采用可用的通信设施来实现在第3步引入的协议,例如:如果dispatcher和client位于同一个地址空间内,则CDprotocol可以用本地的过程调用来实现;在其他情况下,可以用来类似TCP端口或共享内存的方式来实现通信协议。
  在某些通信机制中,可用的通信通道中的资源可能受到限制。例如:socket描述符的数量受操作系统中的描述符表的容量限制,有多种方法可以绕过这些限制。如:每个server分配他们自己的socket,限制server的数量,当client请求到达时,dispatcher返回server的socket描述符给client;或者,dispatcher可以将client的请求临时存储到一个内部的消息队列中,它会公布一个socket端口出来,便于server来查询是否新的请求已经到达,当新请求到达时,server打开新的socket,并将此新的socket描述符传给dispatcher,dispatcher将它转发给client。在client和server之间的交互完成后,server关闭socket描述符。
  基于已选择的通信机制和已采用的server标识方法,定义请求、响应和错误消息的详细数据结构。
  Dispatcher包含了一个server名字到物理地址的映射仓库。表示server位置的方式依赖于你所采用的client-server之间的通信机制,如:物理位置可以被描述成socket端口、tcp端口、共享内存句柄或其他合适的方式。
  需要考虑性能问题。当多个client用一个dispatcher访问多个server时,这个dispatcher显然就构成了瓶颈,如果有可能,在dispatcher中采用如线程池这样的多线程机制,当请求到达时,一个线程会用于处理此请求,多线程使得dispatcher可以并行处理多个请求,提高了响应和执行效率。
[page 331]
  6 根据你的dspatcher接口方案和决策,实现client和server组件,配置系统,注册server到dispatcher中(也可以让server自己动态地注册或取消注册)。在这些操作中需要遵从第5步描述的性能优化策略。

[例子解决方案]
……

[变体]
……
[page 332]
……

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值