6

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

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

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

4

1 回答 1

10

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

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

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

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

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

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

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

编辑

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

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

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

PS。因为您专门研究聊天。我绝对推荐研究Comet用于 ASP.NET 的 Comet 实现?WebSync等)

于 2010-06-04T14:07:59.333 回答