服务升级后服务结构可靠集合数据丢失

Service fabric reliable collections data loss after service upgrade

为什么微服务升级后没有调用事件OnDataLossAsync从外部备份恢复状态后可靠集合为空?

我们有基于有状态服务的大型系统

<StatefulServiceType ServiceTypeName="UserServiceType" HasPersistedState="true" />

HasPersistedState 设置为 true,并且跨副本复制数据,以防 VM 故障数据仍然有效并使用 OnDataLossAsync 恢复但升级后集合为空。

我已经尝试了所有升级选项(删除、保留、自动升级)应用程序,结果相同 - 集合为空。

现在我们决定将数据复制到 blob 存储并在服务更新后恢复它,这不是完美的解决方案,数据恢复需要几分钟,并且它会在这段时间内提供一些服务 unavailable/inconsistent。

所以我们正在寻找允许在升级后保存数据的解决方案。

升级有状态服务不会删除可靠集合中的数据。整个 Service Fabric 平台都是围绕着通过有状态服务的滚动就地升级来解决这个问题而构建的。

我的猜测是您实际上没有执行滚动升级,而是删除并重新创建服务。这就是 Visual Studio 应用程序调试模式中的默认 "Remove Application" 设置所做的 - 它会在您停止调试时删除应用程序(从而删除状态)。 "Auto Upgrade"选项不会删除应用程序,会在您下次按F5时自动为您执行滚动升级。如果在这种情况下您的状态消失了,那么我敢打赌您的服务代码中存在错误。尝试使用全新的有状态服务项目。