.NET处理主服务器和工作服务器之间的队列通信

时间:2011-02-23 21:12:18

标签: .net architecture communication

我正在努力找出为简单的工作委派创建主工作者架构的最佳方法。

1个将作业委派给多个工作进程的主进程。 - 主人需要不断运行并将工作委派给工人(并完成其他任务)。 - 工人(在不同的服务器上)只需要接收工作,处理并报告。 - 主进程将接收一个作业队列,并将它们委派给工作节点,然后工作节点将处理该请求并通知主节点该作业已被处理。主人不需要等待工人完成,但可以委派工作,然后在工人完成后接收工作人员的更新。

在.NET中促进此通信的最佳方法是什么?我已经有了用于处理作业的类库,但我正在寻找一种良好的通信方法。

MSMQ? Windows服务? 远程处理?

由于

2 个答案:

答案 0 :(得分:3)

为了这个目的,我使用带有net.tcp绑定的WCF,并使用回调接口让主控制程序知道作业已完成(是的,它被称为“MCP”,启动作业的进程是被称为“Sark”,网络被称为“游戏网格”,如图所示。

“Sark”既作为控制台应用程序又作为Windows服务实现(为了便于开发和“将我们的脚趾”放入新的工作机器中),而MCP则是一个长期运行的GUI。如果我要重新实现它,我可能也会将主控制作为Windows服务,但是IT部门有必要查看已安排的作业以及在备份作业或其他维护任务时暂停MCP过期了。今天,我仍然将MCP作为服务,并为它提供GUI“远程控制”。

作业被编写为.Net DLL程序集,其中包含用于调用任务的界面。 “Sark”会在文件共享上复制最新版本的二进制文件,创建一个新的AppDomain,在该AppDomain中加载并运行该作业,然后在完成后将其关闭。这使得可以更新作业而无需重新启动MCP或“Sarks”。

此外,每个“Sark”实例还使用MSMQ和短期消息(超时10秒)来报告每台工作机器上的负载。然后,MCP将使用加权随机选择来选择将工作分配给哪个工作机器。也就是说:如果一台机器报告它是80%闲置,那么它将获得80'投票'以接受下一个计划任务,这意味着它比仅有10%空闲的机器更可能。这是一种在避免热点的同时均匀分配负载的合理有效方式。

我选择net.tcp作为WCF绑定来调度作业并接收结果,因为“fire and forget”在实践中不能很好地工作。失败发生:存在内存不足异常,服务器上的运行时出现问题(主要的一个问题是当需要使用FoxPro表的任务时,以及来自Microsoft的ODBC FoxPro驱动程序没有出现在64-位版本 - 当我们混合使用32位和64位工作机器时出现问题),或者是因为一百个意外的意外情况,例如当工作人员在一个IP地址上时,它想要通过机器防火墙至。通过回调立即响应,MCP可以选择将作业重新分配给另一台机器上的另一个工作人员。

然而,MSMQ非常适合报告工作机器的运行状况,因为MCP不必为了让工作人员报告他们的负担而运行,并且消息的短暂超时意味着MCP不会收到太陈旧的信息。

答案 1 :(得分:3)

MSMQ是一种消息传输协议,它应该适用于您的场景,因为主服务器不需要工作人员的立即响应 - “即时消失”。此外,它还允许工作人员在备份时关闭并接收消息队列。您可以使用WCF作为MSMQ的抽象 - MSMQ是一种绑定类型。至于托管,Windows服务是一个选项,但您可能希望查看AppFabric,它将服务作为IIS网站托管。借助Windows Server 2008 R2中新的自动启动功能,这是Windows服务的完美替代方案,尤其适用于您的应用程序类型。