【发布时间】:2014-11-05 22:36:19
【问题描述】:
我正在构建一个支持记录来自 IP 连接设备的数据的平台。记录器使用专有 API 与连接的设备进行通信并将数据转储到数据库中。我正在使用 ASP.NET Web API 为每个记录器提供启动/停止功能。
在独立服务器环境中,我只需创建一个包含实时记录器列表的全局变量。但这在负载平衡的环境中不起作用。例如,用户 A 的发布请求进入 Web 2,它在 Web 2 上创建一个新的记录器(在数据库中记录 Web 2 有一个具有 X id 的活动记录器)。然后,用户 B 的删除请求进入 Web 5。该请求需要与 Web 2 通信才能真正关闭记录器。
是否有跟踪长时间运行的进程以及该进程在哪个 IIS 实例上运行的常见做法?是否有在负载平衡环境中的实例之间进行通信的最佳实践。我打算使用 SignalR 将状态传达给连接的用户。
如果您有一些指向实际代码示例的链接,那就太好了!
编辑/澄清
我在本地 LAN 上有多个通过第三方 DLL 控制的设备。为了控制特定设备,使用设备的本地 LAN Ip 地址创建第三方 DLL 中定义的类的实例。使用该类实例,可以转动、控制和管理设备。此外,设备通过 TCP/IP 发送可以通过回调方法接收的消息。
我想通过一个负载平衡的网站公开对这些设备的控制和来自这些设备的消息。用户(例如 Greg)可以通过网站请求开始记录设备列表中的任何设备(例如位于 192.168.1.51 的设备)。我的代码将通过 Web API 帖子(比如 devices/51)接收该请求。收到后,我将启动 Device Logger API 类的新实例并注册回调函数。通过回调从设备传入的消息将通过 SignalR 推送到连接的客户端并写入数据库以用于历史记录。另一个用户(比如 Tim)可以附加到 SignalR 集线器以查看来自当前正在记录的设备的消息。 Tim 还可以通过向 Web API(比如 devices/51)提交删除请求来停止设备的实时记录。
我正在寻找一个内部网络服务器通信的示例。由于该网站位于服务器场中并且设备 51 的设备记录器 API 实例位于特定的 Web 服务器上,因此我的设备 Web api 删除将需要在 Web 服务器之间进行通信以关闭日志记录。
也许这就像为网络内通信设置辅助 SignalR 集线器一样简单。让所有 Web 服务器在启动时向集线器注册,然后将命令广播到注册的 Web 服务器。如果接收 Web 服务器有该设备的类实例,它会执行命令,如果没有,它会忽略该命令。
想法?是否有其他方式在 Web 服务器之间进行通信?
【问题讨论】:
标签: signalr load-balancing asp.net-web-api2 long-running-processes