【问题标题】:Azure in-memory session state?Azure 内存中会话状态?
【发布时间】:2012-11-26 02:07:05
【问题描述】:

我会将我的 ASP.NET MVC4 应用程序作为冗余 Azure 应用程序托管。在会话期间,应用程序执行计算量大的操作,这些操作会产生不可序列化的对象。对象的创建是可重复的;每次需要对象时,我都可以执行昂贵的操作,但我宁愿只在第一次执行此操作并保存对象以供以后重用。

我想使用 Azure 中的标准分布式会话状态机制来存储通常的会话状态信息,但该机制要求会话数据是可序列化的。我可以使用另一种机制来缓存创建成本高、不可序列化的对象吗?

鲍勃

【问题讨论】:

    标签: asp.net session azure


    【解决方案1】:

    Windows Azure 提供的所有分布式缓存服务目前都需要序列化,不仅是共享缓存,还包括专用/共存缓存。

    但如果要在内存缓存中使用,则不需要序列化。但这不利于横向扩展,如果您只有 1 个实例,您可能无法拥有 azure SLA。

    所以我的建议是优化你的序列化并尝试使用 azure 缓存。

    【讨论】:

      【解决方案2】:

      这些对象是否必须存储在集中式存储中,或者您可以将它们存储在“InProc”会话状态中吗?

      如果没有,恐怕您需要将它们序列化为某种东西(SQL Azure、文件、应用程序结构缓存等)。

      因此,要么找到一种方法将它们序列化为可持久化的东西,要么将它们存储在 RAM 中,并在每个 Web 服务器上都有一个额外的副本

      【讨论】:

      • 感谢伊戈雷克!不,我不需要集中存储(显然需要序列化)。我正在寻找可以让我在每个服务器实例上根据需要制作我的对象的东西,并且只保留一个本地副本以供在该服务器实例上重复使用。我是整个网络编程的新手,所以我需要帮助弄清楚如何将“InProc 会话状态”和“将它们存储在 RAM 中”等基本术语映射到 ASP.NET 中。
      • 这些对象对每个会话都是全局的吗?如果是这样,您可以在公共静态类中使用公共静态声明来声明这些(使用 lock() 语句包装它们的设置以防止多线程问题)。 stackoverflow.com/questions/5118610/…
      • 令人着迷。好的,让我确保我理解这一点:我的 Web 应用程序(无论是由 Azure 还是由某人的 ASP.NET 托管服务托管)在一个或多个服务器实例的上下文中运行。每个服务器实例在启动时加载我的程序集一次,并永远加载它们(或直到它遇到不合时宜的结束)。因此,公共静态数据的生命周期与服务器的生命周期一样长。顺便说一下,确保静态数据访问是线程安全的。 (在下一条评论中继续...)
      • 所以,我似乎应该很容易创建一个 SessionCache 类,该类封装了创建字典的过程,该字典使用会话 ID 作为键添加到公共静态字典中,使用用于存储内容的每个会话字典,并在会话消失时删除该每个会话字典。这是一个相关的问题:我是否保证一次只执行一个与给定会话 ID 关联的线程(除非我明确创建多个线程)?
      • 是的。您应该使集合线程安全。但是,如果除此之外您没有其他要存储在 Session 状态中的内容,或者您​​没有其他需要保持集中的内容,我建议您使用 HttpContext 构造使用 InProc 提供程序将 SessionData 存储在其中。该构造将使缓存字典仅修剪为活动会话
      猜你喜欢
      • 1970-01-01
      • 2013-01-08
      • 2011-11-22
      • 1970-01-01
      • 2013-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多