我有一项服务已经运行了一年多,每天收到 500K - 100 万个请求,并且处理了大量的处理。通常一个请求会持续 30-45 秒。因此,我们已指定服务使用 ConcurrencyMode = Multiple 和 InstanceContextMode = PerCall。这对我们来说效果很好。
我遇到的问题是我的代码区域使用单例模式来公开一个静态实例,我需要保证它只能有一个副本。故障排除后我遇到的问题是,有多个应用程序域创建多个实例。这导致了问题。如何保证只为一项服务创建一个应用程序域?
不直接回答问题:如何保证只为一项服务创建一个应用程序域?,
如何将您的这个“单例”组件完全分离到一个单独的进程中,从 IIS 中分离出来,例如作为 Windows 服务并通过 WCF-Named-Pipe 绑定使用它的服务?我使用过named-pipe+WCF+win-service,发现通信框架针对性能进行了大量优化。所有 ram/cpu 成本都是在单例服务方法中运行的代码。
当然,如果单例服务提供者需要与实际服务代码进行内存连接,那么这可能是个问题。仍然是一个想法。
如果您在谈论代码方面的问题,可能值得在这里查找 Jon Skeets Singleton 解决方案
但是,如果您正在运行整个程序的多个实例,那么您别无选择,只能提取对 Windows 服务、Web 服务或数据库调用的单例调用。