为什么可靠的集合在微服务升级后是空的而不是调用事件OnDataLossAsync来从外部备份恢复状态?
我们有基于有状态服务的大规模系统
<StatefulServiceType ServiceTypeName="UserServiceType" HasPersistedState="true" />
HasPersistedState设置为true,并且在VM故障数据仍然有效的情况下跨副本复制数据,并使用OnDataLossAsync进行恢复但升级后的集合为空。
我已经尝试了所有升级选项(删除,保留,自动升级)应用程序,结果相同 - 集合为空。
现在我们决定将数据复制到blob存储并在服务更新后恢复它,这不是完美的解决方案,数据恢复需要几分钟时间,这使得某些服务在那段时间不可用/不一致。
因此,我们正在寻找能够在升级后保存数据的解决方案。
答案 0 :(得分:3)
升级有状态服务不按照设计删除Reliable Collection中的数据。整个Service Fabric平台旨在通过滚动状态服务的就地升级来解决这个问题。
我的猜测是,您要么实际上没有执行滚动升级,而是要删除并重新创建服务。这就是Visual Studio应用程序调试模式中默认的“删除应用程序”设置 - 它会在您停止调试时删除应用程序(从而删除状态)。 “自动升级”选项不会删除该应用程序,并会在您下次按F5时自动执行滚动升级。如果您的状态在这种情况下消失了,那么我愿意打赌您的服务代码中存在错误。尝试使用全新的有状态服务项目。