IIS Web Garden 中的单例对象
我在 ASP.NET 应用程序中有很多 Singleton 实现,出于某些性能原因,我想将我的应用程序移动到 IIS Web Garden 环境。
CMIIW,迁移到具有 n 个工作进程的 IIS Web Garden,每个工作进程中都会创建一个单例对象,这使其不再是单个对象,因为 n > 1.
我可以在 IIS Web Garden 中再次创建所有这些单例对象吗?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我不相信你可以(除非你能让这些 IIS 工作人员以某种方式使用共享内存中的对象)。
这是一个范围问题。您的单例实例使用进程空间作为其范围。正如您所说,您的实施现在跨越多个流程。 根据定义,在大多数操作系统上,单例将绑定到某个进程空间,因为它与单个类实例或对象相关联。
您真的需要单身人士吗?在使用该模式之前,这是一个非常重要的问题。正如维基百科所说,有些人认为它是一种反模式(或代码气味等)。
可能有效的替代设计示例包括...
我喜欢大型网站的选项 3。一般来说,配套的 Windows 服务对于大型网站非常有帮助。许多事情(例如发送邮件、批处理作业等)应该已经与前端处理工作进程分离。您可以将单例服务器对象推送到该进程中,并在 IIS 工作进程中使用客户端对象。
如果您的单例类与共享状态或仅共享初始状态的多个对象一起使用,则选项 1 和 2 应该分别起作用。
编辑
从您的评论来看,分布式缓存形式的第一个选项似乎适合您。
有很多分布式缓存实现。
。因为您专门研究聊天。我绝对建议研究 Comet ( ASP.NET 的 Comet 实现? 和 WebSync 等)
I don't believe you can ( unless you can get those IIS workers to use objects in shared memory somehow ).
This is a scope issue. Your singleton instance uses process space as its scope. And like you've said, your implementation now spans multiple processes. By definition, on most operating systems, singletons will be tied to a certain process-space, since it's tied to a single class instance or object.
Do you really need a singleton? That's a very important question to ask before using that pattern. As Wikipedia says, some consider it an anti-pattern ( or code smell, etc. ).
Examples of alternate designs that may work include...
I like option 3 for large websites. A companion Windows Service is very helpful in general for large websites. Lots of things like sending mail, batch jobs, etc. should already be decoupled from the frontend processing worker process. You can push the singleton server object into that process and use client objects in your IIS worker processes.
If your singleton class works with multiple objects that share state or just share initial state, then options 1 and 2 should work respectively.
Edit
From your comments it sounds like the first option in the form of a Distributed Cache should work for you.
There are lots of distributed cache implementations out there.
PS. Since you're specifically looking into chat. I'd definitely recommend researching Comet ( Comet implementation for ASP.NET?, and WebSync, etc )