3

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

我想使用有状态的可靠参与者作为服务。在actor内部我可以保持任何状态。我的问题是,演员实例中保存的“状态数据”的最大大小是多少?状态保存在哪里?在内存中?当我停用演员时,状态会发生什么?

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

4

1 回答 1

2

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

当一个actor被停用时,它会从活动actor列表中删除,并且它的状态也会从RAM中删除,但它会继续保存到磁盘上。当一个停用的actor稍后被重新激活时,它的状态会从磁盘重新存储在RAM中。

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

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

StatefulActor<T> - 在这个模型中,你有一个任何类型 T 的状态对象。这最适用于大小不随时间增长的状态,因为整个状态对象被复制并存储在 actor 方法的末尾。如果您不断地添加到状态中(例如,像一个不断增长的列表),那么您最终会遇到与Shlemiel thepainter相同的性能问题。

StatefulActor - 在此模型中,您的状态保存在一个键值数据结构中,您可以在其中显式保存状态。这更适合增长的状态,因为您不会每次都复制所有状态。

于 2016-01-08T19:50:15.693 回答