【发布时间】:2020-12-22 07:19:42
【问题描述】:
最近为了解决循环依赖,我们需要将枚举类移动到不同命名空间下的不同项目。有一些参与者和有状态的服务将这个枚举值的实例保持在它们的可靠状态。
枚举类是这样的:
namespace com.libA
{
public enum Foo
{
None = 0,
Foo1 = 1,
Foo2 = 2,
}
}
我们想把它移到另一个名称空间为com.libB 的项目中。这些枚举值存储在参与者和有状态服务中的可靠状态中,并按如下方式获取:
Foo foo = await this.StateManager.GetStateAsync<Foo>("FooKey").ConfigureAwait(false);
其中一个存储Foo 值的actor 服务是一个非常长寿的actor。理论上,它可以在快乐的路径中存活到无穷大,并且永远不会从外部调用删除。我们尝试了简单的重构 > 移动并尝试了我们的非生产环境。这开始在我们的非生产环境中导致SerializationException。错误消息说:
Expecting element 'Foo' from namespace 'http://schemas.datacontract.org/2004/07/com.libB'.. Encountered 'Element' with name 'Foo', namespace 'http://schemas.datacontract.org/2004/07/com.libA'.
这些异常发生在旧演员中获取 Foo 的值之前。
我的问题是:
- 我们如何将
Foo移动到命名空间com.libB?两阶段升级会有所帮助吗? - 是否有可能在不丢失/损坏数据的情况下这样做?
【问题讨论】:
标签: azure-service-fabric service-fabric-stateful service-fabric-actor