C# 关于构建分布式应用程序的建议?

C# 关于构建分布式应用程序的建议?,c#,distributed,C#,Distributed,我正在研究构建一个分布式应用程序,并希望获得一些关于最佳方式的建议 我的系统将包括一个中央管理web应用程序,其中将定义任务,以及将安装在不同机器上处理这些任务的多个任务运行程序 我需要解决的是如何将任务分配给客户机?我是否应该创建一个任务队列,然后任务运行者不断轮询该队列以查看新任务是否已准备就绪?确保一个任务只由一个任务运行者处理的最佳方法是什么?我怎样才能确保任务在任务运行者之间均匀分布,这样一个任务运行者就不会处理负载,而另一个只处理一把 我唯一能想到的另一种方法是,每个任务运行程序与服

我正在研究构建一个分布式应用程序,并希望获得一些关于最佳方式的建议

我的系统将包括一个中央管理web应用程序,其中将定义任务,以及将安装在不同机器上处理这些任务的多个任务运行程序

我需要解决的是如何将任务分配给客户机?我是否应该创建一个任务队列,然后任务运行者不断轮询该队列以查看新任务是否已准备就绪?确保一个任务只由一个任务运行者处理的最佳方法是什么?我怎样才能确保任务在任务运行者之间均匀分布,这样一个任务运行者就不会处理负载,而另一个只处理一把

我唯一能想到的另一种方法是,每个任务运行程序与服务器建立TCP连接并注册它的兴趣,然后当新任务准备就绪时,web应用程序选择一个任务运行程序并将任务下推到该任务运行程序进行处理

有人有其他想法吗?指针?还是评论

非常感谢


Matt

解决此问题的一般方法是:

  • 实现一组WCF服务,将“任务运行”功能公开为操作

  • 在作为Windows服务托管的多个主机/计算机上部署WCF服务(它们都必须使用相同的合同)

  • 将WCF服务配置为在事务模式下使用Microsoft(),所有这些服务都使用相同的队列

  • 使用相同的
    netMsmqBinding
    ,配置各个管理应用程序将其请求发送到消息队列

  • (可选)在负载平衡的网络中部署管理应用程序/服务,例如(如果您希望前端具有更高的可扩展性)

这可能是最无摩擦的方法,因为您可以依赖经验证的工具来处理负载平衡(IIS/NLB)、消息安全和序列化(WCF)以及消息传递和事务管理(MSMQ)。大部分工作已经为您完成


当然,在实际的实现和部署方面有很多方面需要涉及,但是在这里,一个问题/答案中可能涉及的内容太多了。这至少可以为您指出正确的总体方向。

+1对于Aaronaught,但我也建议您考虑类似的东西,它可以为您抽象出相当多的实现细节。您仍然可以使用MSMQ和/或WCF来进行实际传输,只是简化了发布者和订阅者的设置。

不久前我写了类似的东西,我选择了一种简单的方法,与您描述的方法非常相似:每个代理(任务运行器)都会在“管理服务器”中注册自己以进行管理。然后,它会定期轮询服务器是否正常工作。如果队列中有任何内容,它将接受第一个(最早的)作业。服务器将此作业标记为正在进行,因此其他代理将不会接受它。负载平衡不是问题,因为每个代理一次只运行一个作业。WCF很好地处理了消息队列,这样就不用担心两个代理执行相同的任务。当代理完成作业时,它会通知服务器并传回任何输出

我为我的管理服务器定义了三个WCF端点:一个用于代理,一个用于提交作业的“控制台”(winforms应用程序),一个用于管理工具。我的管理服务器是作为一个托管在Windows服务中的web服务实现的


我知道这并不能回答您所有的问题,但这是一个有效解决方案的示例:它是否适用于您取决于您需求的复杂性

如果我说客户机是志愿者,这需要什么不同吗?ie我希望人们注册并下载客户端软件,因此越简单越好better@Matt:如果这些客户端位于同一个常规区域/网络中,则不一定。如果你想建立自己的大规模分布式系统Folding@Home系统中有数千个客户端都不可靠/不受信任,这可能有点太简单了-但我无法在几分钟甚至几小时内回答这么大的问题。NServiceBus的附加好处是它已经具备了这一点内置工作分配机制。