我对global.asax文件如何在服务器场中运行感到困惑。每个服务器是否都有自己的实例正在运行,或者它是共享实例。
例如,在我的 global.asax Application_Start事件中,我初始化了一个收集统计信息并更新包含统计信息的数据库表的单例对象。发生以下哪项情况?
场景一
- 服务器 1 ->(统计信息 = 10)-> 使用 10 更新数据库
- 服务器 2 ->(统计信息 = 8)-> 使用 8 更新数据库
- 服务器 3 ->(统计信息 = 25)-> 使用 25 更新数据库
- 服务器 4 ->(统计信息 = 5)-> 使用 5 更新数据库
这是每个服务器使用自己的集合更新数据库的第一个示例
场景二
- 服务器 1 ->(统计信息 = 10)-> 使用 10 更新数据库
- 服务器 2 ->(统计信息 = 10)-> 使用 10 更新数据库
- 服务器 3 ->(统计信息 = 10)-> 使用 10 更新数据库
- 服务器 4 ->(统计信息 = 10)-> 使用 10 更新数据库
在上面的示例中,服务器可以访问同一集合。这可能吗?
服务器彼此不知道,因此 global.asax 文件为每个进程和服务器单独运行。即使将 IIS 设置为允许在同一站点和同一台计算机上执行多个工作进程,也是如此。每个工作进程都有自己的全局 .asax Application_Start()
。
因此,为了直接回答您的问题,方案 1 将更密切地模拟 Web 场中实际发生的情况。
如果您希望在所有服务器之间共享"单例",则必须实现所有服务器都可以共享的服务。
另一种选择是使用横向扩展状态服务器(SOSS),我已经看到它在高可用性环境中使用。
[这] 在 Web 或应用程序服务器场中的每台服务器上运行,以存储 任务关键型工作负载数据。横向扩展状态服务器的内存中数据 具有集成的内存中分布式缓存的网格提供了极高的 快速访问关键但快速变化的数据及其 性能和容量随着您向服务器场添加服务器而增长。这 软件自动在服务器之间复制存储的数据,以便 如果服务器发生故障,关键数据不会丢失,并且它维护 可扩展、高度可用的访问,可访问独立数据库服务器 (甚至故障转移数据库群集)无法复制。你也可以 使用 Windows 版本的 Scaling Out 状态服务器透明保存 并检索 ASP.NET 会话状态。