状态在有状态微服务中的位置

Location of state within stateful microservices

借助 Azure Service Fabric,我可以使用有状态服务构建微服务应用程序。为了构建微服务应用程序,Service Fabric 提供了两个用于构建服务的高级框架:Reliable Actors API 和 Reliable Services API。

我想使用有状态的可靠参与者作为服务。在 actor 内部我可以保持任何状态。我的问题是,在 actor 实例中保存的 "state data" 的最大大小是多少?状态保存在哪里?在内存中?当我停用一个 actor 时,状态会发生什么变化?

例如我的演员代表一个物联网设备。所以演员在列表中收集测量值。处理状态的最佳选择是什么?我应该多久将数据刷新到持久存储中?在遇到性能问题或其他问题之前,服务可以收集状态中的数据多长时间?

状态同时保存在 RAM 和本地磁盘上。 Service Fabric 代表您处理集群中多个节点之间的数据复制,以确保数据持久且 highly-available。您不需要将数据刷新到外部存储以使其持久化,但如果您有大量冷数据要卸载以供离线分析,则可以考虑这样做。

当一个 actor 被停用时,它会从活动 actor 列表中删除,它的状态也会从 RAM 中删除,但它会继续保存到磁盘中。当停用的 actor 稍后为 re-activated 时,其在磁盘 RAM 中的状态为 re-hydrated。

理论上没有最大状态大小,但在 actor 使用的复制存储和传输中有 configurable size limits。演员的一般概念倾向于大量的小事情,尽管您可以找到合适的平衡点来满足您的要求。

鉴于此,有状态参与者有两种模型:

StatefulActor - 在此模型中,您有一个任何类型 T 的状态对象。这最适用于 state,其大小不随着时间的推移增长,因为整个状态对象被复制并存储在actor方法的末尾。如果你不断地添加到状态(例如,一个不断增长的列表),那么你最终会遇到与 Shlemiel the painter.

相同的性能问题

StatefulActor - 在此模型中,您的状态保存在 key-value 数据结构中,您可以在其中明确保存状态。这更适合不断增长的状态,因为您不会每次都复制所有状态。