IIS Web Garden中的Singleton对象

时间:2010-05-23 19:53:10

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

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

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

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

1 个答案:

答案 0 :(得分:10)

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

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

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

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

  1. 您可以让多个对象与中央商店或彼此同步。
  2. 如果适用,请使用对象序列化。
  3. 使用Windows服务和某种形式的IPC,例如。 System.Runtime.Remoting.Channels.Ipc
  4. 我喜欢大型网站的选项3。对于大型网站,配套Windows服务通常非常有用。发送邮件,批处理作业等许多事情应该已经与前端处理工作进程分离。您可以将单例服务器对象推送到该进程,并在IIS工作进程中使用客户端对象。

    如果你的单例类使用多个共享状态的对象或只是共享初始状态,那么选项1和2应该分别工作。

    修改

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

    那里有很多分布式缓存实现。

    1. Microsoft AppFabric(以前称为Velocity)是他们最近进入这个领域的举动。
    2. Memcached ASP.Net Provider
    3. NCacheMSDN Article ) - OutProc 支持的自定义ASP.Net缓存提供程序。应该有其他自定义缓存提供程序。
    4. 使用Windows服务和IPC(选项3)
    5. 推出自己的分布式缓存

      PS。因为你专门研究聊天。我绝对建议您研究CometComet implementation for ASP.NET?WebSync等)