asp.net - IIS Web Garden 中的单例对象

标签 asp.net singleton worker-process web-garden

我在 asp.net 应用程序中有很多 Singleton 实现,并且出于某些性能原因想将我的应用程序移动到 IIS Web Garden 环境。

CMIIW,迁移到具有 n 个工作进程的 IIS Web Garden,每个工作进程中将创建一个单例对象,这使得它不再是单个对象,因为 n > 1。

我可以在 IIS Web Garden 中再次制作所有这些单例对象吗?

最佳答案

我不相信你可以(除非你能让那些 IIS 工作人员以某种方式使用共享内存中的对象)。

这是一个范围问题。您的单例实例使用进程空间作为其范围。正如您所说,您的实现现在跨越多个流程。 By definition ,在大多数操作系统上,单例将绑定(bind)到某个进程空间,因为它绑定(bind)到单个类实例或对象。

你有吗真的需要单例吗?在使用该模式之前,这是一个非常重要的问题。正如维基百科所说,有些人认为它是一种反模式(或代码异味等)。

可能有效的替代设计示例包括...

  • 您可以让多个对象针对中央存储或彼此同步。
  • 如果适用,请使用对象序列化。
  • 使用 Windows 服务和某种形式的 IPC,例如。 System.Runtime.Remoting.Channels.Ipc

  • 我喜欢大型网站的选项 3。伴随的 Windows 服务通常对大型网站非常有帮助。发送邮件、批处理作业等许多事情应该已经与前端处理工作进程分离。您可以将单例服务器对象推送到该进程中,并在 IIS 工作进程中使用客户端对象。

    如果您的单例类与共享状态或仅共享初始状态的多个对象一起使用,则选项 1 和 2 应该分别起作用。

    编辑

    从您的评论看来,分布式缓存形式的第一个选项应该适合您。

    那里有很多分布式缓存实现。
  • 微软AppFabric (以前称为 Velocity )是他们最近进入这个领域的举措。
  • Memcached ASP.Net Provider
  • NCache ( MSDN Article ) - OutProc 支持的自定义 ASP.Net 缓存提供程序。应该有其他自定义缓存提供程序。
  • 使用 Windows 服务和 IPC(选项 3)推出您自己的分布式缓存

  • PS。因为您专门研究聊天。我绝对推荐研究 Comet ( Comet implementation for ASP.NET?WebSync 等)

    关于asp.net - IIS Web Garden 中的单例对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2893202/

    相关文章:

    javascript - Onfocus 文本框用户名放入文本框名字值和文本框姓氏值分割

    c# - 为什么在 UI 中使用 DataTable 是错误的?

    javascript - 使用 javascript 动态设置 div 最大高度

    c# - Internal.Cryptography.CryptoThrowHelper.WindowsCryptographicException

    f# - 如何实现单例模式(语法)

    java - java中SomeObject.class的含义是什么?

    iis-7.5 - 在 IIS 中看不到工作进程图标

    java - 通过枚举对 Singleton 进行单元测试抛出 java.lang.NoClassDefFoundError

    asp.net - IIS 工作进程使用大量内存?

    iis - IIS 工作进程在回收时是否会清除 session 变量?