2010-04-05 83 views
2

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

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

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

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

任何人有任何其他的想法?指针?或评论?

非常感谢

马特

回答

3

这个问题的一般方法是:

  • 实行一套公开的功能操作的“正在运行的任务” WCF服务;

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

  • 将WCF服务配置为使用Microsoft Message Queuing bindingnetMsmqBinding),它们全部使用相同的队列,处于事务模式;

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

  • (可选)将管理应用程序/服务部署在负载平衡网络中,例如IIS Web Farm(如果您希望在前端具有更多可伸缩性)。

这可能是你可以依靠可靠的工具来处理负载平衡(IIS/NLB),信息安全和系列化(WCF),以及消息传递和事务管理(MSMQ)最摩擦的方法。大部分工作已经完成。

当然,在实际实施和部署方面还有很多理由可以覆盖,但这里可能有点太多材料无法涵盖在单个问题/答案中。这应该至少指出你在正确的大方向。

+0

看起来像我有一些阅读要做=) – 2010-04-10 15:00:12

+0

如果我说客户端机器是志愿者,这将需要什么不同?即我希望人们注册并下载客户端软件,因此更简单,更好 – 2010-04-10 16:59:06

+0

@Matt:不是,如果这些客户端位于同一个区域/网络中。如果你试图建立自己的大规模分布式Folding @ Home系统,并且你有成千上万的客户端不可靠/不可信,那么这可能有些过于简单化 - 但是*量的问题不是我可以在几分钟甚至几小时内回答。 – Aaronaught 2010-04-10 17:44:19

2

+1对于Aaronaught,但我也建议寻找像NServiceBus这样的东西,它可以为你抽象一些实现细节。您仍然可以使用MSMQ和/或WCF来完成实际的传输,只需设置发布者和订阅者即可轻松完成。

+0

NServiceBus的附加好处是它已经具有内置的工作分配机制。 – 2011-01-04 06:39:09

0

我写的东西就是这样的一段时间回来,我选择了什么,我觉得是一个简单的方法,你描述的差不多就是:每个代理(任务运行)与“管理服务器”的管理宗旨自行注册。然后,它定期轮询服务器进行工作。如果队列中有任何内容,则需要第一个(最早的)工作。服务器将此作业标记为正在进行,因此没有其他代理会采用它。负载平衡不是问题,因为每个代理一次只能运行1个作业。 WCF很好地处理了排队的消息,因此不需要担心两个代理正在进行同样的工作。当一个代理完成一项工作时,它会通知服务器并返回任何输出。

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

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

相关问题