Azure Service Fabric 中有状态服务和外部持久性之间的转换
Transition between stateful service and external persistence in Azure Service Fabric
Azure Service Fabric 似乎专注于所有数据都可以放入 RAM 并将持久性用作后备存储的场景。 Reliable Services 旨在将信息存储在 Reliable Collections 中,它使用 log-checkpoint system where logged information is written into RAM. Meanwhile, for Reliable Actors, the default actor state provider is "the distributed Key-Value store provided by Service Fabric platform." 这似乎表明同样的限制也适用。
但是,在某些情况下,人们可能希望将 Service Fabric 用于 "hot data",但将 "cold data" 写入某种形式的永久存储。处理这种转变的最佳做法是什么?
在奥尔良,这似乎是自动处理的,使用 Azure 表等持久性存储。但似乎 Service Fabric 和 Reliable Collections 的主要设计目的是避免需要外部服务,从而增强数据局部性。当前的文档预计人们可能希望将数据移动到某个永久存储中 disaster recovery and analytics,但它没有讨论在持久性支持的内存中参与者和更永久的形式之间来回移动数据的可能性存储。
一个可能的答案是 Service Fabric 已经这样做了。也许 Reliable Dictionary 有一些内置机制,用于在持久性支持的内存存储和永久存储之间切换。
或者,也许答案是必须自己管理。一种方法可能是让 Actor 跟踪 "hot" 它的状态并根据需要切换其持久性存储。但这牺牲了 Actor 模型的一个好处,即 Actor 的自动分配和释放。同样,我们可能会定期从 Reliable Dictionary 中删除项目并将其添加到其他某个持久性存储,然后再将它们添加回来。不过,这需要知道何时进行转换才有意义。
几个例子可能有助于明确这一点:
(1) 假设我们正在实现一个多人游戏,里面有很多不同的 "rooms." 我们不需要内存中的所有房间,但是我们需要将它们移动到内存中并使用本地持久化作为玩家加入后的备份。
(2) 假设我们正在实现一个仅附加 B 树作为数据库的一部分。诱惑是让每个 B-Tree 节点都是有状态的参与者。我们希望热 B 树保留在内存中,但当然不能将整个索引都保留在内存中。这似乎是一个核心场景,已经为 DocumentDB 之类的东西实现了,但我从文档中不清楚如何做到这一点。
我发现的一个相关问题是 。但这个问题集中在何时使用 Azure Service Fabric 与外部服务。我的问题是是否需要在它们之间进行转换,或者 Azure Service Fabric 是否已经具备此处所需的所有功能。
KvsActorStateProvider 确实将 actor 状态存储在 KeyValueStore 中,它与 ReliableDictionary 的结构相似。
我要问的第一个问题是您是否需要将旧演员状态降级到冷藏库?将所有内容保存在内存中的限制并不限制您的参与者总数,而是每个副本的总数。因此,您必须首先考虑分区策略,以便您的参与者分布在多个不同的副本中。随着您的需求增长,您可以向集群添加更多机器,ServiceFabric 将协调副本到新机器的移动。有关 Actor 服务分区的更多信息,请参阅 http://azure.microsoft.com/en-gb/documentation/articles/service-fabric-reliable-actors-platform/
如果您确实想在一段时间后使用冷存储,那么您有两种选择。首先,您可以使用自定义 ActorStateProviderAttribute 装饰您的 actor,returns 您自己的 IActorStateProvider 实现可以根据您的决定处理持久性。
或者,您可以完全在您的 Actor 实现中处理它。在未来的某个指定时间连接到 Actor Lifecycle and in OnDeactivateAsync such that when the instance is garbage collected, or use an Actor Reminder,序列化状态并存储在冷存储中,例如 blob 或 table 存储,并清空状态 属性。然后可以使用 ActivateAsync 覆盖从离线存储中检索此状态并反序列化。
键值存储状态提供程序不要求将所有内容保存在内存中。该提供者实际上将所有参与者的状态存储在本地磁盘上,并且状态也会复制到其他节点上的本地磁盘。所以KVS store被认为是持久可靠的store。
除此之外,active actors 的状态也存储在内存中。当一个 actor 有一段时间没有被使用时,它会被停用并被垃圾收集。发生这种情况时,内存中的副本将被释放,只保留磁盘上的副本。当 actor 再次被激活时,只要 actor 处于活动状态,状态就会从磁盘中获取并保留在内存中。
此外,KVS 不是唯一的内置状态提供程序。我们还有 VolatileActorStateProvider (http://azure.microsoft.com/en-gb/documentation/articles/service-fabric-reliable-actors-platform/#actor-state-provider-choices)。这是将所有内容保存在内存中的状态提供程序。
Azure Service Fabric 似乎专注于所有数据都可以放入 RAM 并将持久性用作后备存储的场景。 Reliable Services 旨在将信息存储在 Reliable Collections 中,它使用 log-checkpoint system where logged information is written into RAM. Meanwhile, for Reliable Actors, the default actor state provider is "the distributed Key-Value store provided by Service Fabric platform." 这似乎表明同样的限制也适用。
但是,在某些情况下,人们可能希望将 Service Fabric 用于 "hot data",但将 "cold data" 写入某种形式的永久存储。处理这种转变的最佳做法是什么?
在奥尔良,这似乎是自动处理的,使用 Azure 表等持久性存储。但似乎 Service Fabric 和 Reliable Collections 的主要设计目的是避免需要外部服务,从而增强数据局部性。当前的文档预计人们可能希望将数据移动到某个永久存储中 disaster recovery and analytics,但它没有讨论在持久性支持的内存中参与者和更永久的形式之间来回移动数据的可能性存储。
一个可能的答案是 Service Fabric 已经这样做了。也许 Reliable Dictionary 有一些内置机制,用于在持久性支持的内存存储和永久存储之间切换。
或者,也许答案是必须自己管理。一种方法可能是让 Actor 跟踪 "hot" 它的状态并根据需要切换其持久性存储。但这牺牲了 Actor 模型的一个好处,即 Actor 的自动分配和释放。同样,我们可能会定期从 Reliable Dictionary 中删除项目并将其添加到其他某个持久性存储,然后再将它们添加回来。不过,这需要知道何时进行转换才有意义。
几个例子可能有助于明确这一点:
(1) 假设我们正在实现一个多人游戏,里面有很多不同的 "rooms." 我们不需要内存中的所有房间,但是我们需要将它们移动到内存中并使用本地持久化作为玩家加入后的备份。
(2) 假设我们正在实现一个仅附加 B 树作为数据库的一部分。诱惑是让每个 B-Tree 节点都是有状态的参与者。我们希望热 B 树保留在内存中,但当然不能将整个索引都保留在内存中。这似乎是一个核心场景,已经为 DocumentDB 之类的东西实现了,但我从文档中不清楚如何做到这一点。
我发现的一个相关问题是
KvsActorStateProvider 确实将 actor 状态存储在 KeyValueStore 中,它与 ReliableDictionary 的结构相似。
我要问的第一个问题是您是否需要将旧演员状态降级到冷藏库?将所有内容保存在内存中的限制并不限制您的参与者总数,而是每个副本的总数。因此,您必须首先考虑分区策略,以便您的参与者分布在多个不同的副本中。随着您的需求增长,您可以向集群添加更多机器,ServiceFabric 将协调副本到新机器的移动。有关 Actor 服务分区的更多信息,请参阅 http://azure.microsoft.com/en-gb/documentation/articles/service-fabric-reliable-actors-platform/
如果您确实想在一段时间后使用冷存储,那么您有两种选择。首先,您可以使用自定义 ActorStateProviderAttribute 装饰您的 actor,returns 您自己的 IActorStateProvider 实现可以根据您的决定处理持久性。
或者,您可以完全在您的 Actor 实现中处理它。在未来的某个指定时间连接到 Actor Lifecycle and in OnDeactivateAsync such that when the instance is garbage collected, or use an Actor Reminder,序列化状态并存储在冷存储中,例如 blob 或 table 存储,并清空状态 属性。然后可以使用 ActivateAsync 覆盖从离线存储中检索此状态并反序列化。
键值存储状态提供程序不要求将所有内容保存在内存中。该提供者实际上将所有参与者的状态存储在本地磁盘上,并且状态也会复制到其他节点上的本地磁盘。所以KVS store被认为是持久可靠的store。
除此之外,active actors 的状态也存储在内存中。当一个 actor 有一段时间没有被使用时,它会被停用并被垃圾收集。发生这种情况时,内存中的副本将被释放,只保留磁盘上的副本。当 actor 再次被激活时,只要 actor 处于活动状态,状态就会从磁盘中获取并保留在内存中。
此外,KVS 不是唯一的内置状态提供程序。我们还有 VolatileActorStateProvider (http://azure.microsoft.com/en-gb/documentation/articles/service-fabric-reliable-actors-platform/#actor-state-provider-choices)。这是将所有内容保存在内存中的状态提供程序。