我正在开发一个ASP.NET应用程序,它将作为Azure Web应用程序托管。部分应用程序将通过每N秒检索一次快照来连续记录多个基于Web的摄像头。我想设计应用程序,以便记录摄像机的进程可以在多个实例上运行。我希望它能在所有实例之间进行负载平衡,但不能为任何一台摄像机重复工作。
例如,如果我有100个摄像头,并且我在2个实例上运行,我希望每个实例可以处理50个摄像头。如果我有5个实例,每个实例应该有20个摄像头要处理。当我向上/向下添加摄像机或缩放实例时,我希望系统能够均衡地平衡工作。
如果可行的话,由于成本增加,我宁愿不再为专用虚拟机加工摄像机。
我对Akka.NET,Hangfire和WebJobs有点熟悉,但目前还不清楚这些在这种情况下是否会有所帮助。我使用Hangfire和WebJobs进行后台处理,但没有使用这种负载平衡要求。这些或其他一些框架或工具是否可以帮助我在Azure Web App实例中均衡地平衡这些后台任务?我应该如何设置这些或另一个框架来执行此操作?
答案 0 :(得分:0)
老实说,我不认为你想要平衡"服务器。我想你只是想确保工作分配得很好。如果我是你,我会使用像SQS这样的队列系统来排队所有需要快照的摄像机,并让每个实例工作人员一次出列一个并处理它。
一个好的方法可能是让主服务器负责排队快照,然后让所有的工作服务器完全在这个共享队列之外工作。即使一个服务器碰巧处理的次数超过其他服务器,也没关系,因为其他服务器在同一个队列中工作。这只意味着该服务器能够比其他服务器更快地处理其作业。
说实话,有很多方法可以解决这个问题。您可以做一些简单的事情,就像拥有相机的共享列表,以及最后一个快照的时间戳,并使用它来解决问题。每个服务器都会请求一个摄像头,他们会查看列表并找到一个陈旧的,然后更新时间戳并为摄像头执行快照。这种情况的缺点是你将面临非原子操作以及多个工作人员同时发出请求并且在同一服务器上工作的可能性。这些是队列系统将帮助您的事物类型,因为只要其中一个队列项目在飞行中,它们将不再可用。而且,因为每个服务器负责在项目完成后使其无效,如果服务器在快照中间崩溃,这项工作将很容易回到队列中。
无论您选择哪种解决方案,都可以归结为拥有一个用于提供过时摄像头的中央系统/列表。
答案 1 :(得分:0)