2

我有 2 种方法的简单 WCF 服务:写入、读取。第一种方法将简单数据存储在某个存储中,另一种方法将通过键读取这些数据。

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

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

System.Runtime.Caching/memcached/mongodb 之类的东西?

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

4

1 回答 1

2

您有以下选择:

1. System.Runtime.Caching

优点:

  • 内置,实施成本低
  • 有过期机制

缺点:

  • 并发问题,您的密钥需要是唯一的
  • 恶意用户可能会在简单密钥的情况下检索其他用户的数据
  • wcf服务主机重启后数据会丢失

2. WCF 会议

优点:

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

缺点:

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

3. ASP.NET 会话状态

优点:

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

缺点:

  • 仅在兼容模式下工作,混合了两种技术。
  • 需要 sql 服务器

4. 自实现存储,从文件系统到sql server/mongodb

优点:

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

缺点:

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

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

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

如果您需要为测试/演示目的提供快速而肮脏的解决方案 - 使用内存缓存(当然,在这种情况下,您将不得不放弃 -persist after restart- 要求)。

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

于 2013-03-30T21:28:26.550 回答