可靠 Collection 缓存作为 Service Fabric 中的缓存
Reliable Collection Caching as Cache in Service Fabric
我的系统使用一堆微服务来处理一个项目,我打算创建一个有状态的微服务来保存项目的最新状态。在该服务中,我计划将所有项目状态存储在一个可靠的字典中,并且每当访问一个项目时更新该项目的上次访问字段。
我的需求是,我只想把最近用到的物品存放在可靠的collection,需要把长时间不用的物品移到azure这样的外存table 贮存,
并且外部存储和可靠 collection 需要同步。
意味着所有项目都应该在外部存储中,最近使用的项目在可靠的 collection 中。
这是为了减少可靠 collection 中的开销。
喜欢可靠collection充当缓存
如上所述实施我的解决方案是最佳做法吗?
枚举 ReliableCollection 是一种好习惯吗?
我会用演员。给每个项目它自己的演员并将状态存储在那里。当 actor 被垃圾回收时,您可以将状态保存在其他地方,或者简单地在 actor 计时器上执行此操作。
这样做意味着您不必复制大量参与者代码来管理大量实例。
警告
如果您的整体设计有意义,这就有意义。正如 Vaclav 在下面的评论中所说,由于 actor 的单线程模型,actor 不适用于通用缓存。但是,如果您的设计有一个代表单个实体的参与者,并且缓存与该实体(例如用户)相关,那么将参与者视为缓存可以很好地工作。
如果 Reliable Dictionary 旨在充当缓存,那么我真的看不出将未使用的项目卸载到 Azure 存储的意义所在。如果它是缓存,我希望清除未使用的项目,并且调用者需要返回到缓存中已过期的任何内容的真实来源。但听起来您希望 Reliable Dictionary 成为最新的真理来源。所以我认为你必须首先决定你是否真的在构建一个缓存,或者一个可以将数据分页到内存之外的真实数据存储源。听起来更像是后者。
在任何一种情况下,都可以按照您的描述完成,但要始终保持它们同步并不容易,因为您没有跨 Reliable Dictionary 和外部存储的交易。
枚举集合很好,但它是一项昂贵的操作,因此我不建议对热路径(例如用户请求路径)中的大量数据执行此操作。可以按计划的方式定期进行。
您需要将数据卸载到外部存储吗?可以卸载到本地磁盘吗? Reliable Collections 很快就会自动将状态卸载到磁盘。
SoCreate 团队刚刚发布了一个名为 Service Fabric 分布式缓存的开源项目,它可能会帮助您或其他使用 Service Fabric 并需要缓存的人。我们构建它是为了不需要 运行 Redis 或类似的东西作为 Service Fabric 中的来宾 exe。这为您提供了一种 运行、监视和管理缓存作为 Service Fabric 可靠服务的方法。您可以在这里了解更多信息:
http://service-fabric-distributed-cache.socreate.it/
或 GitHub 此处:
https://github.com/SoCreate/service-fabric-distributed-cache
我的系统使用一堆微服务来处理一个项目,我打算创建一个有状态的微服务来保存项目的最新状态。在该服务中,我计划将所有项目状态存储在一个可靠的字典中,并且每当访问一个项目时更新该项目的上次访问字段。
我的需求是,我只想把最近用到的物品存放在可靠的collection,需要把长时间不用的物品移到azure这样的外存table 贮存, 并且外部存储和可靠 collection 需要同步。
意味着所有项目都应该在外部存储中,最近使用的项目在可靠的 collection 中。
这是为了减少可靠 collection 中的开销。
喜欢可靠collection充当缓存
如上所述实施我的解决方案是最佳做法吗? 枚举 ReliableCollection 是一种好习惯吗?
我会用演员。给每个项目它自己的演员并将状态存储在那里。当 actor 被垃圾回收时,您可以将状态保存在其他地方,或者简单地在 actor 计时器上执行此操作。
这样做意味着您不必复制大量参与者代码来管理大量实例。
警告
如果您的整体设计有意义,这就有意义。正如 Vaclav 在下面的评论中所说,由于 actor 的单线程模型,actor 不适用于通用缓存。但是,如果您的设计有一个代表单个实体的参与者,并且缓存与该实体(例如用户)相关,那么将参与者视为缓存可以很好地工作。
如果 Reliable Dictionary 旨在充当缓存,那么我真的看不出将未使用的项目卸载到 Azure 存储的意义所在。如果它是缓存,我希望清除未使用的项目,并且调用者需要返回到缓存中已过期的任何内容的真实来源。但听起来您希望 Reliable Dictionary 成为最新的真理来源。所以我认为你必须首先决定你是否真的在构建一个缓存,或者一个可以将数据分页到内存之外的真实数据存储源。听起来更像是后者。
在任何一种情况下,都可以按照您的描述完成,但要始终保持它们同步并不容易,因为您没有跨 Reliable Dictionary 和外部存储的交易。
枚举集合很好,但它是一项昂贵的操作,因此我不建议对热路径(例如用户请求路径)中的大量数据执行此操作。可以按计划的方式定期进行。
您需要将数据卸载到外部存储吗?可以卸载到本地磁盘吗? Reliable Collections 很快就会自动将状态卸载到磁盘。
SoCreate 团队刚刚发布了一个名为 Service Fabric 分布式缓存的开源项目,它可能会帮助您或其他使用 Service Fabric 并需要缓存的人。我们构建它是为了不需要 运行 Redis 或类似的东西作为 Service Fabric 中的来宾 exe。这为您提供了一种 运行、监视和管理缓存作为 Service Fabric 可靠服务的方法。您可以在这里了解更多信息:
http://service-fabric-distributed-cache.socreate.it/
或 GitHub 此处: https://github.com/SoCreate/service-fabric-distributed-cache