По умолчанию, где Akka.net хранит свои сообщения?

Я скачал пример кода с github и запустил AtLeastOnceDelivery.sln. При каждом новом запуске он отправляет сообщения вместе с ним. И если я изменяю пространство имен сообщения, оно показывает ошибку, начатую с

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

Если я смогу очистить постоянство, надеюсь, он примет измененное пространство имен и перезапустит идентификатор обмена сообщениями.

1 ответ

Решение

По умолчанию все снимки хранятся в виде файлов непосредственно в ./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 свойство должно быть уникальным в области кластера - обычно значения ниже 100 используются внутренними сериализаторами akka.net, поэтому лучше использовать более высокие значения.

Как связать сериализатор, который будет использоваться для данного типа

По соглашению Akka.NET использует пустые интерфейсы для маркировки типов сообщений, которые должны быть сериализованы. Затем вы можете настроить свою конфигурацию HOCON на использование определенного сериализатора для данного интерфейса:

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

куда MyInterface интерфейс назначен типу сообщения, с которым вы хотите сериализовать / десериализовать MySerializer,

Другие вопросы по тегам