我晚上都在评估 Azure Service Fabric 作为我们当前 WebApps/CloudServices 堆栈的替代品,并且有点不确定如何决定何时具有状态的服务/参与者应该是有状态的参与者,以及何时应该是无状态的参与者外部持久化状态(Azure SQL、Azure 存储和 DocumentDB)。我知道这是一个相当新的产品(至少对公众而言),因此可能还没有很多关于此的最佳实践,但我已经阅读了 Microsoft 提供的大部分文档,但没有找到明确的回答这个。
我正在接近的当前问题域是我们的事件存储;我们的部分应用程序基于事件溯源和 CQRS,我正在评估如何将此事件存储转移到 Service Fabric 平台。事件存储将包含大量时间序列数据,并且由于它是我们保存在那里的数据的唯一真实来源,因此它必须是一致的、复制的并存储到某种形式的持久存储中。
我考虑过的一种方法是使用有状态的“EventStream”演员;使用事件源的聚合的每个实例都将其事件存储在一个隔离的流中。这意味着有状态的参与者可以跟踪它自己的流的所有事件,并且我已经满足了我对数据存储方式(事务性、复制性和持久性)的要求。但是,某些流可能会变得非常大(数十万,如果不是数百万,事件),这就是我开始不确定的地方。我想,当这些大型数据模型需要序列化到磁盘或从磁盘反序列化时,拥有大量状态的参与者会对系统的性能产生影响。
另一种选择是让这些参与者保持无状态,让他们从 Azure SQL 等外部存储中读取数据 - 或者只使用无状态服务而不是参与者。
基本上,演员/服务的状态量何时“过多”,您应该开始考虑其他处理状态的方式?
另外,Service Fabric Actors 设计模式中的这一部分:一些反模式文档让我有点困惑:
将 Azure Service Fabric Actors 视为事务系统。Azure Service Fabric Actors 不是提供 ACID 的基于两阶段提交的系统。如果我们不实现可选的持久性,并且actor正在运行的机器死亡,它的当前状态将随之消失。演员将很快出现在另一个节点上,但除非我们实现了支持持久性,否则状态将消失。但是,在利用重试、重复过滤和/或幂等设计之间,您可以实现高水平的可靠性和一致性。
“如果我们不实现可选的持久性”在这里表示什么?我的印象是,只要您修改状态的事务成功,您的数据就会持久存储并复制到至少一部分副本中。这一段让我想知道是否存在我的演员/服务中的状态会丢失的情况,如果这是我需要自己处理的事情。我从文档其他部分的有状态模型中得到的印象似乎抵消了这种说法。