我正在开发一个主从命令模型,通过该模型,某些应用程序“主”将命令发送到称为“从”的同质进程以执行某些任务,然后以状态完成或进程失败响应。他们还应该根据请求向可用的主服务器公开一些数据。
这个模型在 WCF 中会是什么样子?
Master和Slave的每个实例会托管他们自己的服务吗?难道只有法师主持?只有奴隶?我应该使用回调合同吗?数据合同?或只是服务合同。
作为旁注,这是一个用于产品测试的低带宽、低强度、仅限内部的分发项目,不应被视为“大型高需求”项目。
我正在开发一个主从命令模型,通过该模型,某些应用程序“主”将命令发送到称为“从”的同质进程以执行某些任务,然后以状态完成或进程失败响应。他们还应该根据请求向可用的主服务器公开一些数据。
这个模型在 WCF 中会是什么样子?
Master和Slave的每个实例会托管他们自己的服务吗?难道只有法师主持?只有奴隶?我应该使用回调合同吗?数据合同?或只是服务合同。
作为旁注,这是一个用于产品测试的低带宽、低强度、仅限内部的分发项目,不应被视为“大型高需求”项目。
您肯定会有某种形式或形式的服务合同——这是必须的。这只是定义了您的服务及其上的操作(方法)(OperationContract)。
如果它是一个内部“防火墙后”系统,您可以查看双工绑定,例如让主设备调用从设备,从设备完成后在双工通道上报告。开箱即用,只有 WsDualHttpBinding 支持双工,但由于您是内部的,在防火墙后面,您可能希望查看创建自己的基于 TCP 的双工绑定(这并不像听起来那么难第一的!)。
在这种情况下,所涉及的两个应用程序实际上同时是服务器和客户端。
您将以某种方式、形状或形式拥有 DataContracts 来定义在 Master 和 Slave 之间移动的 DATA - 所以再次,是的,您将必须拥有 Data Contracts。
编辑:当然,另一种方法可能是使用两个 MSMQ 消息队列;Master 将他的“工作”请求放入队列中,Slave 监听并获取工作请求。当 Slave 完成后,它会依次将响应放入 Master 作为侦听器的响应队列中,并收到有关正在以这种方式完成的工作的通知。
马克
我同意 Jeremy 的观点。你所描述的不需要回调合同的复杂性。工作节点可以简单地公开 WCF 服务(或者甚至是 WSDL 或 REST Web 服务……),然后控制器只需要知道每个子节点的 URL 并将消息发送到工作节点。
如果您希望控制器能够广播一条消息并让所有工作人员(我真的不喜欢主/从类比......我很久以前改称它为控制器/工作人员)节点做一些响应并发布他们的回到小组,那么您可能想要使用 WCF 中经常被低估的 P2P 渠道。这允许一组用 WCF 编写的服务作为对等方同时相互交谈,使用的 URL 几乎就像主题/对话分隔符一样。
因此,例如,您可以在net.p2p://labs/commands频道上发出命令。只有控制器在该通道上发送命令,但所有工作节点都在监听。当他们异步完成他们的工作时,他们可以在net.p2p://labs/status频道上报告进度。这种方法的另一个好处是(如果您需要此功能),单个工人将获得了解所有其他工人在做什么的能力。
但是请记住,如果您使用 P2P,那么您将不得不处理争用 - 您最终可能会有 2 个节点接受相同的命令。如果这没问题,那么 P2P 就是您的工具。如果您需要发出命令,并且仅在单个节点空闲时才串行接收(在告诉远程节点运行单个测试脚本等时更有可能发生这种情况),那么您可以使用 MSMQ 绑定而不是 P2P。然后所有的工作人员都成为从队列接收消息的客户端,您可以更轻松地抵消多个工作人员接受同一请求的情况。
更多参考: 我不久前在 Peer Channel 上写的一篇博文。
MSDN 上的 Peer Channel Scenarios - 这很好,因为您可以从这里转到 Peer Channel 概念到参考指南。
如果从属处理需要很长时间,那么回调合约可能是有序的。否则,您可以阻止主服务器等待从服务器完成(您可能必须调整 WCF 客户端配置,使其不会超时)。
根据您的描述,我认为您实际上只需要在从节点上托管 WCF 服务,而主节点可能只是一个使用从节点公开的 WCF 服务的客户端。