使用共享长时间运行进程的负载平衡Web API的最佳实践?

时间:2014-11-05 22:36:20

标签: signalr load-balancing asp.net-web-api2 long-running-processes

我正在构建一个支持来自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 delete将需要在Web服务器之间进行通信以关闭日志记录。

这可能就像为网络内部通信设置辅助SignalR集线器一样简单。让所有Web服务器在启动时注册到集线器,然后将命令广播到已注册的Web服务器。如果接收Web服务器具有该设备的类实例,则执行该命令,否则忽略该命令。

思考?是否有其他方式在Web服务器之间进行通信?

1 个答案:

答案 0 :(得分:3)

根据我的经验,保持自动复制的负载均衡服务无状态是最好的。在您的示例中,Web 2上的记录器具有Web 1没有的状态,因此您所描述的服务不是无状态的。要删除记录器,请求必须转到自动复制的服务实例池中的特定实例。

您可以做的是为日志记录提供额外的后端(非公共面)服务。每次前端服务的N个副本中的一个需要创建,交互或销毁记录器时,它可以通过单个后端日志记录服务上的API来完成。

想:

  • POST / loggers>> 204创建,位置:/ loggers / 48913
  • PUT / loggers / daily-statistics
  • POST / loggers / 48913 / messages
  • DELETE / loggers / 48913

对编辑/澄清的回应:

现在您正在考虑您的系统,如下图所示:

A     B     C     D      Web API instances
|\         /|\    |
U V   Q   W X Y   Z      Devices

A,B,C和D是负载平衡的Web API,U,V,W,X,Y和Z是您正在监视的设备。 Web API实例和设备之间的连接用线表示。

当请求到B停止收听设备Y时会发生什么?它必须重新路由到C,因为它是连接的Web API。

当C请求开始收听Q时会发生什么?当B保持空闲时,它是否接收第四个设备?

我的建议是以这种方式开始考虑你的系统:

A     B     C     D      Web API instances

   1     2     3         Device listeners
  /|\   / \   / \
 U V Q W   X Y   Z       Devices

Web API实例是100%无状态的。对于Web API的客户端,A,B,C或D中的哪一个正在处理该请求是隐藏且无关紧要的。

另一方面,设备侦听器已明确解决。它们可以相互通信,并且知道哪个设备侦听器连接到哪个设备。当请求到达有关日志记录设备X的Web API实例时,会将适当的请求随机转发给其中一个设备侦听器。

  • 如果请求是开始记录设备X,则接收请求的设备侦听器会检查其他设备侦听器,以查看当时是否有任何较少的工作负载。如果是这样,它将响应重定向到该设备侦听器。如果没有,它会为该设备创建记录器。

  • 如果请求要与记录器交互或停止侦听设备,则接收请求的设备侦听器会响应重定向到相应的设备侦听器,或者如果连接到的话,则自行完成工作指定的设备。

将Web API实例和设备侦听器拆分为两个不同的组,可以使前端成为无状态Web服务的理想选择。