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

标签 .net architecture communication

我正在尝试找出为简单的工作委派创建主从架构的最佳方法。

1 个主进程,将作业委托(delegate)给多个工作进程。 - master 需要持续运行并将工作委托(delegate)给 worker(并执行其他任务)。 - 工作人员(在不同的服务器上)只需要接收工作、处理工作并返返回告。 - 主进程将收到一个作业队列,并将它们委托(delegate)给工作节点,工作节点随后将处理请求并通知主进程该作业已被处理。 master 不需要等待 worker 完成,而是可以委托(delegate)工作,然后在工作完成时从 worker 接收更新。

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

MSMQ? window 服务? 远程处理?

谢谢

最佳答案

正是出于这个目的,我将 WCF 与 net.tcp 绑定(bind)一起使用,并使用回调接口(interface)让主控制程序知道工作已完成(是的,它被称为“MCP”,启动工作的进程是称为“Sark”,网络被称为“Game Grid”,请看图)。

“Sark”被实现为控制台应用程序和 Windows 服务(为了便于开发和“试探”新的工作机器),而 MCP 是一个长期运行的 GUI。如果我要重新实现它,我可能也会将 Master Control 设为 Windows 服务,但它有利于 IT 部门查看安排了哪些作业并在备份作业或其他维护任务时暂停 MCP过期了。今天,我仍然会让 MCP 成为一项服务,并为其提供一个 GUI“远程控制”。

作业被编写为 .Net DLL 程序集,带有用于调用任务的接口(interface)。 “Sark”会通过文件共享复制最新版本的二进制文件,创建一个新的 AppDomain,在该 AppDomain 中加载并运行作业,然后在完成后将其关闭。这使得更新作业成为可能,而无需重新启动 MCP 或“萨克斯”。

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

我选择 net.tcp 作为 WCF 绑定(bind)来调度作业和接收结果,因为“即发即弃”在实践中效果不佳。失败发生:会出现内存不足异常,服务器运行时出现问题(一个主要问题是当任务需要使用 FoxPro 表时,Microsoft 的 ODBC FoxPro 驱动程序不是 64-位版本——当我们混合使用 32 位和 64 位工作机器时会出现问题),或者由于一百种意外情况,例如当工作人员使用的 IP 地址被它想要交谈的机器防火墙保护时至。对回调的立即响应使 MCP 可以选择将工作重新分配给另一台机器上的另一名 worker 。

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

关于.NET 处理主服务器和工作服务器之间的队列通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5097175/

相关文章:

c# - UWP 和 WPF 之间的 (UDP) 通信

grails - Grails Mail Plugin无法安装-尝试在Config中修复,但仍然无法正常工作

c# - 单个事务中的多线程

.net - 如何在 .NET 中显示缩写路径名

c# - 对象的组成与函数: Should I use one method interfaces or delegates?

rest - 使用 Play 2.1 作为后端构建 AngularJS 客户端代码的好方法

java - Android - 另一个线程中的 Activity 和 Service 之间的通信

c# - 选择所有带有所有标签的帖子

c# - 如何在定义的位置弹出工具窗口

c# - MVVM WPF 教程