我在 asp.net 应用程序中有很多 Singleton 实现,并且出于某些性能原因想将我的应用程序移动到 IIS Web Garden 环境。
CMIIW,迁移到具有n 个工作进程的 IIS Web Garden,每个工作进程中将创建一个单例对象,这使得它不再是单个对象,因为n > 1。
我可以在 IIS Web Garden 中再次制作所有这些单例对象吗?
我在 asp.net 应用程序中有很多 Singleton 实现,并且出于某些性能原因想将我的应用程序移动到 IIS Web Garden 环境。
CMIIW,迁移到具有n 个工作进程的 IIS Web Garden,每个工作进程中将创建一个单例对象,这使得它不再是单个对象,因为n > 1。
我可以在 IIS Web Garden 中再次制作所有这些单例对象吗?
我不相信你可以(除非你能让那些 IIS 工作人员以某种方式使用共享内存中的对象)。
这是一个范围问题。您的单例实例使用进程空间作为其范围。正如您所说,您的实施现在跨越多个流程。 根据定义,在大多数操作系统上,单例将绑定到某个进程空间,因为它绑定到单个类实例或对象。
你真的需要单身吗?在使用该模式之前,这是一个非常重要的问题。正如维基百科所说,有些人认为它是一种反模式(或代码异味等)。
可能有效的替代设计示例包括...
我喜欢大型网站的选项 3。伴随的 Windows 服务通常对大型网站非常有帮助。发送邮件、批处理作业等许多事情应该已经与前端处理工作进程分离。您可以将单例服务器对象推送到该进程中,并在 IIS 工作进程中使用客户端对象。
如果您的单例类与共享状态或仅共享初始状态的多个对象一起使用,则选项 1 和 2 应该分别起作用。
编辑
从您的评论看来,分布式缓存形式的第一个选项应该适合您。
那里有很多分布式缓存实现。
PS。因为您专门研究聊天。我绝对推荐研究Comet(用于 ASP.NET 的 Comet 实现?和WebSync等)