WCF服务共享存储

时间:2013-03-07 13:22:38

标签: .net wcf

我有两种方法的简单WCF服务:Write,Read。第一种方法将简单数据存储在某个存储器中,另一种方法将通过密钥读取此数据。

写入方法调用后,应该可以立即读取数据。此外,数据应存储很短的时间(可配置,如10分钟TTL)。

为不同用户存储这些数据的最佳解决方案是什么?

类似System.Runtime.Caching / memcached / mongodb?

UPD。有什么建议吗?不理想,但很好?

1 个答案:

答案 0 :(得分:2)

您有以下选项:

<强> 1。 System.Runtime.Caching

优点:

  • 内置,廉价实施
  • 有过期机制

缺点:

  • 并发问题,您的密钥必须是唯一的
  • 如果是简单密钥,恶意用户可能会检索其他用户的数据
  • wcf服务主机重启后数据将丢失

<强> 2。 WCF Session

优点:

  • 对缓存数据的简单访问,相同的服务实例用于处理用户请求。
  • 没有并发问题,用户被会话隔离。

缺点:

  • 为每个会话创建的内存开销,单个服务实例
  • 使用会话开始/结束约束工作流[OperationContract(IsInitiating = true,IsTerminating = true)]
  • wcf服务主机重启后数据将丢失

第3。 ASP.NET session state

优点:

  • 具有持久性机制的内置会话(重启时数据不会丢失,请参阅sessionState模式=&#34; SQLServer&#34;)。
  • 没有并发问题,用户被会话隔离。

缺点:

  • 仅在兼容模式下工作,混合使用两种技术。
  • 需要sql server

<强> 4。自我实现的存储,从文件系统到sql server / mongodb

优点:

  • 重启时数据没有丢失
  • 可能有基于作业的内部数据到期机制。

缺点:

  • 部署/配置/支持成本
  • 手动实施
  • 手动用户隔离/并发/安全处理

根据您评论中的答案,您有: 多线程环境,即使在检索数据之后也必须保留数据 (我假设在到期时间用完之前),数据大小很小,每个项目kb; 您将存储数百个项目,即使在服务重新启动后,数据也需要保留(再次,直到过期)。

现在它取决于 - 在生产级系统的情况下可能需要容错, 负载平衡和扩展 - 我会选择sql server,即使它意味着更大的开发成本。

如果您需要快速而肮脏的解决方案用于测试/演示目的 - 请使用内存中缓存(当然,在这种情况下,您将不得不放弃 - 重新启动后的使用者 - 要求)。

另一个快速解决方案是将数据存储在临时文件中,其中key是文件名。这将在重新启动之间保留数据,但在安全性和并发性方面会遇到同样的问题。