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

用于共享数据访问的wcf

  •  1
  • Audrius  · 技术社区  · 14 年前

    我对WCF有一点经验,想听听您对如何解决以下问题的意见/建议:

    Web服务需要同时从多个客户端访问,并且服务需要从共享数据集返回结果。我正在进行的具体项目必须存储IP地址/范围的列表。为了验证的目的,这个列表将被一堆web服务器查询,我们提到每分钟有几千个或更多的查询。

    我最初的方法是将windows服务用作wcf主机,其中的服务协定实现类用servicebhavior(instanceContextMode=instanceContextMode.single,concurrencyMode=concurrencyMode.multiple)修饰,该类具有列表对象和用于访问的自定义锁定它。所以基本上我有一个wcf服务singleton,它有一个list=共享数据->多个客户端。我不喜欢的是,数据和通信层被合并为一个,从性能上看,这感觉不“对”。

    我真正想要的是windows服务运行一个包含容器类对象的ip列表实例,第二个服务运行wcf服务契约实现,以及后者以一种很好的方式使用最小的阻塞查询前者。使用另一个wcf频道不会真的让我远离最初的草案实现,或者会吗?

    你会采取什么方法?该项目仍处于一个非常早期的阶段,所以完全重新设计是不可能的。

    所有的想法都是值得赞赏的。谢谢!

    更新:数据集将动态更改。Web服务将有一个单独的方法来添加IP或IP范围,在此基础上,将有一个计划任务,根据某些规则,该任务将每隔10-15分钟触发一次数据清理。

    更新2:将启动一个单独的基准测试项目,该项目应使用mysql作为数据后端(而不是在内存列表中)。

    1 回复  |  直到 14 年前
        1
  •  1
  •   Marc Gravell    14 年前

    这取决于它的规模。如果一台服务器就足够了,那就好;把它方便地保存在内存中(只要服务器重新启动时可以重新创建数据)。如果数据量低,那么简单的阻塞( lock )应该可以很好地同步数据,或者更高的吞吐量 ReaderWriterLockSlim . 我可能不会储存 直接地 不过,在wcf类实例中。

    我会避免任何涉及会话的事情(如果/当这与wcf生命周期相关时);这对简单的服务很少有帮助。

    对于分布式负载(在多个服务器上),我会考虑一个单独的专用后端。数据库或memcached/appfabric/etc值得考虑。