Akka.NET Cluster Sharding с Akka.Persistence.MongoDB

Пытаюсь оживить указанную в заголовке связку.
Этот текст — напоминание будущему себе как это сделать. Надеюсь пригодится кому-нибудь ещё.

Первая серьёзная проблема — в коллекцию Journal попадали записи с пустой записью Payload.

Проблема в том, что:
1) Mongo драйвер понятия не имеет о большинстве классов, которые попадают в это поле. (см. сообщения из Akka.Cluster.Sharding, например ShardRegionRegistered)
2) Кастомный сериализатор через BsonSerializer.RegisterSerializer добавлять бесполезно, ибо иногда туда попадают объекты вида internal protected sealed EntityStarted

И это в то время, когда сериализация/десериализация очевидно давно уже сделана за нас (см. класс ClusterShardingMessageSerializer), осталось лишь ею воспользоваться.

Шаг первый, создаём маппинг классу Akka.Persistence.MongoDb.Journal.JournalEntry:

Шаг второй, объясняем как сериализовать поле Payload:

Шаг третий, добавляем конфигурационной магии, которую так любят авторы акки (значения взяты из тестов akka.net, например SnapshotSerializerPersistenceSpec)

Вызываем ClusterShardingPersistenseConfig.Initialize после того как создали наш ActorSystem, убеждаемся что всё заколосилось.

Show your support

Clapping shows how much you appreciated vetinary’s story.