【问题标题】:WCF service shared storageWCF 服务共享存储
【发布时间】:2013-03-07 13:22:37
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 视情况而定。即使在检索后数据也必须保留吗?这是在多线程环境中吗?您要存储多大的数据?
  • 多线程环境 - 是;数据是否必须在检索后保留 - 是;数据量很小,每个项目几 kb;
  • 您会存储数百个或更多(如数百万个)项目吗? IIS主机被回收,数据是否需要保留?
  • 您会存储数百个或更多(如数百万个)项目吗? - 是 IIS 主机被回收后是否需要保留数据? -是的

标签: .net wcf


【解决方案1】:

您有以下选择:

1. System.Runtime.Caching

优点:

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

缺点:

  • 并发问题,您的密钥需要是唯一的
  • 恶意用户可以通过简单的密钥获取其他用户的数据
  • wcf 服务主机重启后数据会丢失

2。 WCF Session

优点:

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

缺点:

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

3. ASP.NET session state

优点:

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

缺点:

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

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

优点:

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

缺点:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2012-04-10
    • 2014-10-09
    • 1970-01-01
    • 1970-01-01
    • 2016-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多