代码之家  ›  专栏  ›  技术社区  ›  Anwar Chandra

IIS Web花园中的singleton对象

  •  6
  • Anwar Chandra  · 技术社区  · 16 年前

    我在ASP.NET应用程序中有很多单例实现,出于性能方面的原因,我希望将我的应用程序移到IIS Web花园环境中。

    CMIIW,移动到IIS Web花园 n 工作进程,在每个工作进程中都将创建一个单独的对象,这使得它不再是一个单独的对象,因为 n gt;1。

    我能把所有这些单件物品,在IIsWebGarden中再次单件制作吗?

    1 回复  |  直到 16 年前
        1
  •  10
  •   Community Mohan Dere    9 年前

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

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

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

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

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

    我喜欢大型网站的选项3。一个配套的Windows服务通常对大型网站非常有用。许多事情,如发送邮件、批处理作业等,都应该与前端处理工作进程分离。您可以将singleton服务器对象推送到该进程中,并在您的IIS工作进程中使用客户端对象。

    如果您的singleton类与共享状态或只共享的多个对象一起工作 最初的 状态,那么选项1和2应该分别工作。

    编辑

    从你的评论来看,这听起来像是 分布式缓存 应该为你工作。

    有很多分布式缓存实现。

    1. 微软 AppFabric (以前称为速度)是他们最近进入这个空间的运动。
    2. Memcached ASP.Net Provider
    3. NCache ( MSDN Article ) -的自定义ASP.NET缓存提供程序 外部过程 支持。应该有其他自定义缓存提供程序。
    4. 使用Windows服务和IPC部署自己的分布式缓存(选项3)

    另外,因为你是专门研究聊天的。我绝对会推荐研究 Comet ( Comet implementation for ASP.NET? WebSync 等)

    推荐文章