2016-07-29 75 views
5

我的系统使用一堆微服务来处理一个项目,并且我计划创建一个有状态的MicroService来保存该项目的最新状态。在该服务中,我打算将所有项目状态存储在可靠的字典中,并且每当访问项目时都会更新项目的最后访问字段。可靠集合缓存作为服务结构中的缓存

我的要求是,我只想将最近使用的项目存储在可靠的集合中,并且需要将不能长时间访问的项目移动到外部存储,如天蓝色表格存储, 以及外部存储和可靠的采集需要同步。

含义所有项目应在外部存储和最近使用的项目在可靠的集合。

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

像可靠的收集行为作为缓存。

如上所述,实施我的解决方案是否是最佳实践? 枚举ReliableCollection是否是一个好习惯?

回答

3

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

无论是哪种情况,都可以按照您所描述的方式完成,但始终保持同步并不会很容易,因为您没有跨Reliable Dictionary和外部存储进行事务处理。

枚举集合是好的,但它是一个昂贵的操作,所以我不建议在热路径中的大量数据上执行它,例如用户请求路径。可以按照计划的方式定期进行。

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

+0

我只需要从Reliable集合中卸载数据。如果卸载到本地磁盘可用,这将是很好的....谢谢。 –

+2

它正在进行中。在最新版本(5.1)中,数据总是在内存和磁盘上。在未来的发行版中,只有热数据才会在内存中,所有数据仍将保留在磁盘上。 –

+0

我很期待 - 有没有办法看到内存中有多少? –

0

我会用演员。给每个项目分配自己的演员并在那里存储状态。当演员被垃圾收集后,你可以将状态保存在别的地方,或者干脆在演员定时器上做。

这样做意味着您不必复制大量的actor代码来管理大量实例。

CAVEAT

这是有道理的,如果你的整体设计是否合理。正如瓦茨拉夫在下面的评论所说的,由于演员的单线程模型,演员对通用缓存不太好。但是如果你的设计有一个代表单个实体的actor,并且缓存与该实体(比如用户)有关,那么把这个actor当作缓存就可以很好地工作。

+3

参与者通常不是高速缓存的好主意,因为每个参与者实例都强制执行单线程访问。这意味着多个阅读器不能同时访问相同的数据,导致吞吐量不佳。 –

+0

伟大的一点!我想这是关于缓存的用户是否分区与演员分区相同的方式。 –

+2

是的,它可以在没有并发读取的特殊情况下工作,就像每个actor实例表示一个用户,其中客户端和actor实例映射到1:1一样。但作为通用缓存,这不是一个好主意。 –