使用WCF作为主从命令模型

时间:2009-04-13 21:23:09

标签: c# .net wcf master-slave

我正在开发一个主从命令模型,通过该模型,某些应用程序“Master”将命令发送到称为“Slave”的同类进程来执行某项任务,然后回复状态完成或进程失败。他们还应该根据要求向主人公开一些数据。

这个模型在WCF中会是什么样子?

Master和Slave的每个实例都有自己的服务吗?只会主人主持?只有奴隶?我应该使用回拨合同吗?数据合同?或者只是服务合同。

作为旁注,这是一个低带宽,低强度,内部唯一的分销项目,用于产品测试,不应被视为“大型高需求”项目。

3 个答案:

答案 0 :(得分:2)

你肯定会有某种形式或形式的服务合同。这只是定义了您的服务及其上的操作(方法)(OperationContract)。

如果它是内部的“防火墙后”系统,您可以查看双工绑定,例如让Master调用Slave,Slave在完成时报告双工通道。开箱即用,只有WsDualHttpBinding支持双工,但由于你是内部的,在防火墙后面,你可能想看看创建自己的基于TCP的双工绑定(它不像它听起来那么难第一!)。

在这种情况下,两个涉及的应用程序确实同时是服务器和客户端。

您将以某种方式,形状或形式使用DataContracts来定义在Master和Slave之间移动的DATA - 所以再次,是的,您将必须拥有数据合同。

编辑: 当然,另一种方法可能是使用两个MSMQ消息队列; Master将他的“作业”请求放入队列中,Slave会侦听并获取作业请求。当Slave完成后,它会将响应丢弃到Master作为监听器的响应队列中,并以这种方式通知作业。

马克

答案 1 :(得分:1)

我同意杰里米的观点。你所描述的并不需要回调合约的复杂性。工作节点可以简单地公开WCF服务(或者甚至是WSDL或REST Web服务......)然后控制器只需要知道每个子节点的URL并将消息发送到工作节点。

如果您希望控制器能够广播单个消息并拥有所有工作人员(我真的不喜欢主/从类比......我很久以前切换到称为控制器/工作者)节点做了一些响应并将他们的进度发回给组,然后您可能想要使用WCF中经常被低估的P2P频道。这允许一组在WCF中编写的服务一次性相互通信,因为使用的URL几乎就像主题/会话分隔符一样。

因此,例如,您可以在 net.p2p:// labs / commands 频道上发出命令。只有控制器在该通道上发送命令,但所有工作节点都在监听。当他们异步完成他们的事情时,他们可以在 net.p2p:// labs / status 频道上报告进度。这种方法的另一个好处是(如果你需要这个功能),个体工人将有能力知道所有其他工人正在做什么。

请记住,但是如果您使用P2P,那么您将不得不处理争用 - 最终可能会有2个节点接受相同的命令。如果这很好,那么P2P就是你的工具。如果您需要发出命令并且只有单个节点在它们变为空闲时串行选择(更有可能在告诉远程节点运行单个测试脚本时等),那么您可以使用MSMQ绑定而不是P2P。然后,所有工作人员都成为从队列接收消息的客户端,您可以更轻松地抵消多个工作人员接受相同请求的情况。

供参考: A blog post I wrote a while back on the Peer Channel

Peer Channel Scenarios on MSDN - 这很好,因为你可以从这里转到Peer Channel概念到参考指南。

Peer Channel Team Blog

答案 2 :(得分:0)

如果从属处理需要很长时间,那么回调合同可能是有序的。否则你可能只是阻塞主服务器等待从服务器完成(你可能需要调整你的WCF客户端配置,以便它不会超时)。

根据您的描述,我认为您实际上只需要在Slave节点上托管WCF服务,而Master可能只是一个消耗Slaves公开的WCF服务的客户端。