默认情况下,Akka.net 在哪里存储其消息?



>我已经从github下载了一个示例代码并运行了AtMinimumOnceDelivery.sln 每次新运行它都会发送消息。如果我更改消息命名空间,它会显示一个错误,开头为

Error loading snapshot [SnapshotMetadata<pid: delivery, seqNr: 0, timestamp: 2018/09/24>], remaining attempts: [0]

如果我能清除持久性,希望它会接受然后更改的命名空间并重新启动消息传递 id。

默认情况下,所有快照都作为文件直接存储在应用程序的目录中./snapshots而事件则存储在内存中。因此,您应该考虑使用一个 akka.persistence 插件来实现生产目的。

发生您的问题是因为您使用的是 akka.net 默认序列化程序(专用于网络(,这些序列化程序的版本容忍度不是很高 - 因此更改任何字段、其类型、类名或命名空间会使类的先前版本不可反序列化 - 并且将来可能会更改。这也是为什么强烈建议不要使用默认序列化程序进行持久性的原因。

如何创建自定义 Akka.NET 序列化程序

虽然有计划改进序列化程序 API,但目前(Akka.NET v1.3.9(,要制作自己的序列化程序,您需要简单地从类继承Akka.Serialization.Serializer

public sealed class MySerializer : Serializer
{
public MySerializer(ExtendedActorSystem system) : base(system) { }
public override int Identifier => /* globaly unique serializer id */;
public override bool IncludeManifest => true;
public override byte[] ToBinary(object obj)
{
// serialize object
}
public override object FromBinary(byte[] bytes, Type type)
{
// deserialize object 
}
}

请记住,Identifier属性在群集范围内必须是唯一的 - 通常 akka.net 内部序列化程序使用低于 100 的值,因此最好使用较高的值。

如何绑定要用于给定类型的序列化程序

按照约定 Akka.NET 使用空接口来标记应序列化的消息类型。然后,您可以将 HOCON 配置设置为对给定接口使用特定的序列化程序:

akka.actor {
serializers {
my-serializer = ""MyNamespace.MySerializer, MyAssembly""
}
serialization-bindings {
""MyNamespace.MyInterface, MyAssembly"" = my-serializer
}
}

其中MyInterface接口分配给要使用MySerializer进行序列化/反序列化的消息类型。

最新更新