我正在研究构建分布式应用程序,并希望获得一些关于最佳方法的建议。
我的系统将包括一个中央管理Web应用程序,其中将定义任务,以及一些将安装在不同机器上以处理这些任务的任务运行程序。
我需要解决的是如何将任务分发给客户?我应该只创建一个任务队列,并且任务运行者不断轮询队列以查看新任务是否准备就绪?确保任务的最佳方法是由一个任务运行员处理?我怎样才能确保任务在任务运行者之间均匀分布,这样一个任务运行器不会最终处理负载,而其他任务只处理一个满员?
我能想到的唯一其他方法是每个任务运行器与服务器建立TCP连接并注册它的兴趣,然后当新任务准备就绪时,Web应用程序选择任务运行器并将任务推送到任务转轮要处理?
有人有任何其他想法吗?指针?还是评论?
非常感谢
马特
答案 0 :(得分:4)
解决这个问题的一般方法是:
实施一组WCF服务,将“任务运行”功能公开为操作;
在作为Windows服务托管的多台主机/计算机上部署WCF服务(它们都必须使用相同的合同);
在事务模式下,将WCF服务配置为使用Microsoft Message Queuing binding(netMsmqBinding
),所有这些服务都使用相同的队列;
配置各个管理应用程序,使用相同的netMsmqBinding
;
或者,将管理应用/服务部署在负载均衡的网络中,例如IIS Web Farm(如果您希望在前端获得更多可扩展性)。
这可能是最无摩擦的方法,因为您可以依靠经过验证的工具来处理负载平衡(IIS / NLB),消息安全和序列化(WCF)以及消息传递和事务管理(MSMQ)。大部分工作已经完成。
当然,在实际实施和部署方面有很多理由可以覆盖,但这可能有点太多,无法在这里提出一个问题/答案。这至少应该指向正确的方向。
答案 1 :(得分:2)
为Aaronaught +1,但我也建议查看类似NServiceBus的内容,它可以为您提取相当多的实现细节。您仍然可以使用MSMQ和/或WCF进行实际传输,只需简化发布商和订阅者的设置。
答案 2 :(得分:0)
我前段时间就写了这样的东西,我选择的是一种简单的方法,几乎就是你描述的内容:每个代理(任务运行)都将自己注册到“管理服务器”以用于管理目的。然后定期轮询服务器以进行工作。如果队列中有任何内容,则需要第一个(最旧的)作业。服务器将此作业标记为正在进行中,因此没有其他代理会接受它。负载平衡不是问题,因为每个代理一次只运行1个作业。 WCF非常好地处理了消息排队,因此没有人担心两个代理会执行相同的工作。当代理完成作业时,它会告诉服务器并传回任何输出。
我为我的管理服务器定义了三个WCF端点:一个用于代理,一个用于“控制台”用于提交作业(一个winforms应用程序),另一个用于管理工具。我的管理服务器是作为Windows服务托管的Web服务实现的。
我知道这并不能解答您的所有问题,但这是一个有效工作解决方案的示例:它是否适合您,取决于您的要求的复杂程度。