【问题标题】:Scaling singletons缩放单例
【发布时间】:2010-01-08 11:36:18
【问题描述】:

在为我的基于服务器的应用程序考虑了一些架构问题后,我觉得我将不得不使用单例来实现我的目标。纯粹出于以下原因(证明我的气味是合理的):

  • 我不需要将昂贵的对象深入到调用堆栈中
  • 我可以在任何上下文中对单例管理对象执行功能。 (很多代码已经存在,因此我不愿意重写大量其他工作代码)

除此之外,单身人士提出了另一个问题。我的基于服务器的应用程序本质上是一个 DLL,它带有一个可以调用多个服务器实例的类。服务器实例类包含单例管理对象。通常,这将由 Windows 服务管理,因此服务器与机器的比例将为 1:1。

因此您可以将其视为(其中 -> 是 1:1,=> 是 1:many):

MACHINE -> ServiceHost(Windows 服务?) -> 服务器实例 -> 单例管理对象

但是,我们希望允许 SaaS 模型,这需要服务主机(无论是 Windows 服务还是 Win32 应用程序)能够根据业务需要启动多个服务器。因此,一台物理机可以运行一个服务器主机,该主机将运行多个服务器实例。

这将是(其中 -> 是 1:1,=> 是 1:many):

MACHINE -> ServiceHost(Windows 服务?)=> 服务器实例 -> 单例管理对象

问题是这些单例将在服务器之间共享。这不可能发生。单例必须与服务器实例 1:1。

假设我无法摆脱这些单例,我是否可以通过将服务实例类调用为单独的进程/内存空间来将这些服务器实例彼此分开?

我只能想象我需要启动多个 EXE(并使用 WCF 进行管理),每个服务器实例一个。这显然不是很好。

【问题讨论】:

  • 想一想,我能不能用某种方式反射?
  • 服务器实例如何访问管理对象?
  • 你在做什么?上面似乎没有描述您的问题;而且我不知道“Scaling Singletons”是什么意思......(你怎么有超过 1 个......;这似乎违反直觉,至少可以这么说:P)
  • @silky:我基本上是在尝试将作为 Web 应用程序的应用程序作为 Win32 服务,但增加了扩展服务器实例以提供潜在 SaaS 业务案例的可能性。因此,如果您有 IServerInstance 具有自己的静态属性,我需要能够启动第二个实例,独立于第一个实例 - 但最好没有中间层 - 例如。单独的进程,因此 WCF
  • Program.X:啊哈。我知道了。好像你想在一个新的 AppDomain 中启动它,就像 Benjamin 下面建议的那样。但我不认为你的意思是“Win32”服务(即甚至不是.net)。我会说如果你可以完全删除单例是值得考虑的,但这可能不切实际。祝你好运!

标签: c# wcf design-patterns anti-patterns


【解决方案1】:

不同“实例”的不同 AppDomain 怎么样?

【讨论】:

  • 看看这个,这看起来很有希望。看起来我什至可以在主机和 AppDomain(包含单个服务器实例)之间进行通信。谢谢。
猜你喜欢
  • 1970-01-01
  • 2012-07-28
  • 2015-06-24
  • 2016-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
相关资源
最近更新 更多