在ASP.NET中通过负载平衡创建的问题

时间:2009-10-27 17:50:00

标签: asp.net web-applications

0    我有一个ASP.NET 3.0应用程序,可以在一台服务器上正常工作。它使用应用程序变量来检查用户是否已签出文件并将其锁定给所有其他用户。当我将应用程序放在负载平衡服务器上时,应用程序没有按预期工作,因为多个用户被发送到多个服务器,每个用户都可以检出所需的文件。

重点是,有什么方法可以在我的应用程序中共享应用程序变量,即使它分布在多个服务器上。或者有更好的方法来获得全局变量吗?

编辑:我正在检查Application [“FileLocked”]是否检出文件是真还是假

4 个答案:

答案 0 :(得分:2)

您是如何告诉系统文件已签出的?我希望你没有使用会话变量。您应该将状态存储在数据库字段中,然后检查是否已选中/未选中字段(bool / bit)。系统是在多个服务器上还是一个无关紧要。与应用程序的连接将使用相同的连接字符串,因此使用相同的数据。

答案 1 :(得分:2)

您需要考虑两件事:

  1. 在负载平衡环境中,一台服务器中的实例数据将无法供另一台服务器使用。虽然您可以使用进程外会话状态,但您无法轻松地跨服务器提供缓存项或静态类数据。用户的请求不会始终路由到同一服务器(除非您使用粘性会话之类的东西) - 这可能会导致其他问题。

  2. 您可能应该使用更持久的机制(如锁定文件)来确定特定用户是否正在使用文件。否则,您可能会在系统中引入竞争条件 - 如果用户的会话在没有解锁文件的情况下结束,您将最终在系统中找到孤立的锁定文件。

答案 2 :(得分:2)

应用程序变量存储在ASP.NET中,这意味着服务器之间会有重复的变量。

正如JonH建议的那样,将其存储在数据库中。这就是这种类型的信息应该去的地方。原因:

  1. 消除对会话和应用程序变量的负载平衡影响
  2. 即使应用程序重置,也会保留值。通常,在20分钟不活动后卸载ASP.NET应用程序(?)。使用您的方案,即使在单个服务器上,这意味着如果有人签出文件,回家,并在第二天返回,它将不再被检出。将此信息存储在数据库中可以消除该问题。

答案 3 :(得分:0)

我认为这是数据库的任务。如果您还没有,请在某处创建MySQL或其他RDBMS实例,并使用它来共享这样的信息。如果您使用应用程序内存来​​存储该信息,则只要必须回收应用程序池或重新启动Web服务器,它就会丢失。