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