可靠的集合缓存作为Service Fabric中的缓存

时间:2016-07-29 10:00:16

标签: c# azure caching architecture azure-service-fabric

我的系统使用一堆微服务来处理项目,我计划创建一个Stateful MicroService来保存项目的最新状态。在该服务中,我计划将所有项状态存储在可靠的字典中,并且每当访问项时,更新项的上次访问字段。

我的要求是,我只想将最近使用的项目存储在可靠的集合中,并且需要将长时间未访问的项目移动到外部存储,如azure表存储, 外部存储和可靠集合需要同步。

意味着所有项目都应该在外部存储中,并且最近使用的项目应该是可靠的集合。

这是为了减少可靠收集的开销。

就像可靠的集合充当缓存一样。

最佳做法是如上所述实施我的解决方案吗? 枚举ReliableCollection是一种好习惯吗?

3 个答案:

答案 0 :(得分:3)

如果Reliable Dictionary意味着充当缓存,那么我真的没有看到将未使用的项目卸载到Azure存储的重点。如果它是一个缓存,我希望清除未使用的项目,并且调用者需要回到从缓存中过期的任何事实的真相来源。但听起来你希望Reliable Dictionary成为最新的真相来源。因此,我认为您必须首先确定您是否实际构建了一个缓存,或者是一个可以将数据从内存中分页的真实数据存储源。听起来更像是后者。

在任何一种情况下,它都可以按照您的描述完成,但保持它们一致同步并不容易,因为您没有可靠字典和外部存储中的事务。

枚举集合很好,但这是一项昂贵的操作,因此我不建议在热路径(例如用户请求路径)中对大量数据执行此操作。可以按计划的方式定期进行。

您是否需要将数据卸载到外部存储?你可以卸载到本地磁盘吗? Reliable Collections很快就会自动将状态卸载到磁盘。

答案 1 :(得分:0)

我会使用演员。给每个项目它自己的actor并在那里存储状态。当actor被垃圾收集时,你可以将状态保存在其他地方,或者只是在actor计时器上执行。

这样做意味着您不必复制很多演员代码来管理大量实例。

<强> CAVEAT

如果您的整体设计有意义,这是有道理的。正如Vaclav在下面的评论所说,由于演员的单线程模型,演员不适合通用缓存。但是,如果您的设计有一个代表单个实体的actor,并且缓存与该实体(例如用户)相关,那么将actor视为缓存可以很好地工作。

答案 2 :(得分:0)

SoCreate团队刚刚发布了一个名为Service Fabric分布式缓存的开源项目,该项目可能会帮助您或其他使用Service Fabric并需要缓存的人。我们构建了此文件,因此我们不需要在Service Fabric中作为来宾exe运行Redis或类似的东西。这为您提供了一种作为Service Fabric可靠服务运行,监视和管理缓存的方法。您可以在此处了解更多信息:

http://service-fabric-distributed-cache.socreate.it/

或在GitHub上: https://github.com/SoCreate/service-fabric-distributed-cache