2010-05-23 54 views
6

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

CMIIW,移动的IIS Web园与ň工作进程,会出现在每个工作进程中创建一个单独的对象,这使得它不是一个单一的对象了,因为ň> 1.

能我在IIS Web Garden中再创建所有这些单例对象,再单身?

回答

10

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

这是一个范围问题。您的单例实例使用进程空间作为其范围。正如你所说,你的实现现在跨越了多个进程。 By definition,在大多数操作系统中,单身人员将被绑定到特定的进程空间,因为它被绑定到单个类实例或对象

真的需要一个单身?在使用该模式之前,这是一个非常重要的问题。正如维基百科所说,有些人认为它是一种反模式(或代码味道等)。可工作包括替代设计的

实例...

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

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

如果您的单身人士课程与共享状态的多个对象一起使用,或者刚分享初始状态,则选项1和2应分别起作用。

编辑

从您的评论听起来像一个分布式缓存形式的第一个选项应该为你工作。

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

  1. 微软AppFabric(以前叫做Velocity)是他们最近进入这个领域的。
  2. Memcached ASP.Net Provider
  3. NCacheMSDN Article) - 的OutProc支持自定义ASP.Net缓存提供商。应该有其他自定义的Cache提供程序。
  4. 铺开自己的分布式缓存使用Windows服务和IPC(选项3)

PS。因为你正在专注于聊天。我肯定会推荐研究CometComet implementation for ASP.NET?WebSync等)

+0

它是一个非常复杂的聊天室,流量很大,但我们希望它尽可能的快速响应。我们不会将消息记录到数据库,所以我需要单身对象来将消息保存在内存中。 – 2010-06-05 11:20:40

+0

问题到选项1:如何在不同的进程中同步对象? – 2010-06-05 11:22:18

+0

选项3似乎很有前途的解决方案。将单身对象移动到IpcServerChannel(可能是一个控制台应用程序),IpcClientChannel将代理该对象。你的意思是? – 2010-06-05 11:36:30