代码之家  ›  专栏  ›  技术社区  ›  axel_c

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

wcf
  •  3
  • axel_c  · 技术社区  · 16 年前

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

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

    我做了一些研究,找到了一些关于使用附加到服务主机的IExtension来存储共享数据的文章。

    如果所有的服务都在同一个网站下运行,这会有效吗?这是正确的方法吗?还是我应该找别的地方?

    2 回复  |  直到 16 年前
        1
  •  3
  •   razlebe    16 年前

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

    如果正在缓存的数据与任何一个服务都没有真正的关系,但是这两个服务都需要,那么它可能属于它自己的独立服务。您是否考虑将缓存封装到第三个服务中,并执行服务到服务的调用以检索所需的数据?好处包括…

    1. 它解决了您原来的困境,避免了多次从数据库读取整个缓存的需要;
    2. 它将缓存封装在一个地方,以便以后维护/更改。
    3. 它允许您通过放置另一个服务接口来将缓存的实现从其他服务中抽象出来。

    总之,我建议这是最好的方法。唯一的缺点是额外的服务到服务调用开销,但是这肯定比从数据库中读取整个缓存要好。

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

    如果我说的是有意义的话,那么我所采用的SOA原则是 Service Autonomy .

        2
  •  2
  •   Jimmy McNulty    16 年前

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

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

    推荐文章