IIS Web Garden 中的单例对象

发布于 2024-10-30 20:02:38 字数 229 浏览 4 评论 0 原文

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

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

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

I have a lot of Singleton implementation in asp.net application and want to move my application to IIS Web Garden environment for some performance reasons.

CMIIW, moving to IIS Web Garden with n worker process, there will be one singleton object created in each worker process, which make it not a single object anymore because n > 1.

can I make all those singleton objects, singleton again in IIS Web Garden?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

韶华倾负 2024-11-06 20:02:38

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

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

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

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

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

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

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

编辑

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

有很多分布式缓存实现。

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

。因为您专门研究聊天。我绝对建议研究 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...

  1. You can have multiple objects synchronize against a central store or with each other.
  2. Use object serialization if applicable.
  3. Use a Windows Service and some form of IPC, eg. System.Runtime.Remoting.Channels.Ipc

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.

  1. Microsoft AppFabric ( formerly called Velocity ) is their very recent move into this space.
  2. Memcached ASP.Net Provider
  3. NCache ( MSDN Article ) - Custom ASP.Net Cache provider of OutProc support. There should be other custom Cache providers out there.
  4. Roll out your own distributed cache using Windows Services and IPC ( option 3 )

PS. Since you're specifically looking into chat. I'd definitely recommend researching Comet ( Comet implementation for ASP.NET?, and WebSync, etc )

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文