WCF:跨多个服务共享缓存数据

WCF:跨多个服务共享缓存数据,wcf,Wcf,我们正在开发一个项目,涉及大约10个不同的WCF服务,每个服务都有几个端点。其中一项服务在内存中缓存了几大数据表 我们发现需要从其他服务访问该数据。我希望能够在所有服务中共享这些表,而不是保留缓存的两个副本 我做了一些研究,发现了一些关于使用连接到servicehosts的IExtension来存储共享数据的文章 如果所有的服务都在同一个网站下运行,那会起作用吗?这是正确的方法吗?或者我应该去别处看看吗?如果您的所有服务都是同一个应用程序的一部分,那么您似乎没有任何理由不能通过共享对象引用直接共

我们正在开发一个项目,涉及大约10个不同的WCF服务,每个服务都有几个端点。其中一项服务在内存中缓存了几大数据表

我们发现需要从其他服务访问该数据。我希望能够在所有服务中共享这些表,而不是保留缓存的两个副本

我做了一些研究,发现了一些关于使用连接到servicehosts的IExtension来存储共享数据的文章


如果所有的服务都在同一个网站下运行,那会起作用吗?这是正确的方法吗?或者我应该去别处看看吗?

如果您的所有服务都是同一个应用程序的一部分,那么您似乎没有任何理由不能通过共享对象引用直接共享缓存。最简单的方法是通过静态场


如果您选择这种方法,有一件事需要非常小心,那就是线程安全。如果缓存是通过两个WCF会话并发访问的,则必须确保这两个会话不会通过同时更改缓存而相互干扰。如果缓存是只读的,那么这样做的需要就会减少,但是您可能仍然需要同步缓存的初始化。

如果缓存的数据是多个服务所需要的,那么从面向服务的体系结构的角度来看,无论如何,它不属于您调用它的任何一个服务

如果缓存的数据实际上与两个服务都不相关,而是两个服务都需要的数据,那么它可能属于它自己的独立服务。您是否考虑过将缓存封装在第三个服务中,并执行服务到服务的调用来检索所需的数据?好处包括

  • 它解决了您最初的困境,避免了多次从数据库读取整个缓存的需要
  • 它将缓存封装在一个地方,便于以后维护/更改
  • 它允许您通过放置另一个服务接口将缓存的实现从其他服务中抽象出来 总而言之,我认为这是最好的方法。唯一的缺点是进行服务到服务调用的额外开销,但这肯定比必须从数据库读取整个缓存要好

    或者,如果缓存中的数据与调用缓存的两个服务密切相关,即两个服务都添加/更改缓存中的数据等,那么可能应该将两个现有服务合并为一个服务


    若我说的有些道理,那个么我所借鉴的SOA原则就是

    我经常对常规asp.net应用程序使用静态变量方法,但我担心服务的生命周期。如果服务A尝试访问尚未调用(激活)的服务B中的缓存,是否保证缓存已初始化?您需要将初始化代码放入静态方法或缓存控制器本身。这样,它就从服务A和服务B中封装出来。两者都不依赖于彼此来初始化缓存,第一个访问缓存会导致延迟初始化。嗯,它是一个中型企业应用程序。我同意服务自主权的观点。数据最初是从多个服务的数据库中读取的,但出于性能考虑,我们希望将其移动到内存缓存中。数据是许多服务的“核心”,因此,尽管非正统,但我认为共享缓存是有意义的。感谢澄清。就个人而言,我肯定会将缓存封装在另一个服务中,并实现服务到服务的调用。我会相应地更新我的答案。一切都是正确的,但恕我直言,这是一个过于简略的观点。至少我知道服务之间的一种交互不应该像“常规服务”那样进行:服务方法和安全令牌提供者之间的安全令牌验证(如果我们要在应用层进行验证)(它需要共享有效令牌列表)。日志记录也是如此,日志记录是一种特殊的东西。如果您要通过同一个企业总线登录,则很容易将其破坏。我当然不是在提倡“一刀切”的政策:每项服务都需要根据自身的优点来考虑。OP没有具体说明共享数据或访问它的服务的用途,因此我的答案相应地是一般性的。