【问题标题】:Sharing a List<int> among all servers in a web farm在网络场中的所有服务器之间共享 List<int>
【发布时间】:2012-04-15 02:29:46
【问题描述】:

我已阅读有关存储会话状态 out-of-process 的信息,但通过将 Web 应用配置为使用诸如 StateServer 之类的提供程序,它仍然在内存中

我有一个包含accountIDsList&lt;int&gt;,我希望在网络场中的所有服务器之间共享它。该列表不是与任何特定帐户相关的会话数据,它是我希望在内存中(但可能是进程外)的全局列表,以便场中的每个服务器可以检查每个请求以查看是否它包含一个accountID

能否像共享会话状态一样共享此数据?请问你能详细说明应该如何做吗?

这是一个好的解决方案吗?尝试访问同一个列表的许多服务器是否会影响性能?

编辑:额外...

在我的应用中,用户帐户有一个 _accountStatus,如果设置为 suspended,应用会使用它来限制用户可以执行的操作。 _accountStatus 保留在定制的身份验证票证中。问题是用户可以保持登录状态,他们可以在今天登录,离开并在一个月后再次登录,仍然可以登录。同时,站点管理员可能已经暂停了他们的帐户,但是因为 _accountStatus 是保留在身份验证票证中,它现在不正确,用户仍然拥有他们不应该访问的权限。

因此,当管理员更改用户的 _accountStatus 时,他们的 _accountID 会添加到 the list。然后在每个请求中检查列表。如果帐户在列表中,则它必须从数据库中重新加载它的 _accountStatus(始终具有正确的值)并更新身份验证票证。

所以是的,也许在 SQL Server 中保留列表是最好的解决方案。

另一种解决方案可能是将 _accountStatus 不存储在身份验证票证中,而是存储在会话中。当一个新会话开始时,它可以被加载。但是现在有一个问题,如果管理员决定在用户​​会话期间暂停帐户怎么办。应用程序如何访问该用户的会话并从 HttpApplication 外部更新 _accountStatus?或者在用户的请求之间,如果你明白我的意思吗?

【问题讨论】:

    标签: .net asp.net-mvc-3 web-farm


    【解决方案1】:

    没有任何内置功能。

    对此类列表的并发写访问需要锁定以确保数据一致性。写入常见吗?我希望不会因为那会破坏性能。

    我建议您将该列表保存在 SQL Server 中。也许文件共享上的文本文件也足够了。

    【讨论】:

    • 感谢 usr,写入并不常见,但必须在每次请求时检查列表。我怀疑不断进行 sql 查找对性能没有好处。我想我必须找到一个替代解决方案。
    • 我猜你已经为每个请求多次与 SQL Server 交谈。简单的查询非常便宜(比如 0.5 毫秒)。您还可以将结果缓存 10 秒左右。
    • 在这种情况下,也许它是可行的,并且可能是最好的解决方案。
    • 好的,显然这些数据应该存储在 SQL Server 中并缓存几分钟(这意味着帐户暂停可以延迟几分钟,这应该没有问题?)。即使只是 10 秒的缓存也会带走几乎所有的负载。每 10 秒一次的数据库查询是nothing
    • 感谢您的专业知识和帮助。我仍然想知道是否可以从已加载该会话的 HttpApplication 外部修改会话中的数据。但我想这是另一个问题。谢谢,
    猜你喜欢
    • 1970-01-01
    • 2017-03-29
    • 1970-01-01
    • 1970-01-01
    • 2020-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-03
    相关资源
    最近更新 更多