akka.net config multi tenant
В нашем приложении у нас есть мультитенантная конфигурация для Akka. Мы используем следующую конфигурацию:
akka : { persistence : { journal : { plugin : set-in-entity-persistent-actor $tenantId : { class : "Akka.Persistence.SqlServer.Journal.SqlServerJournal, Lias.AkkaPersistence.SqlServer" plugin-dispatcher : akka.actor.default-dispatcher connection-string : "$tenantConnectionString" connection-timeout : 60s schema-name : dbo table-name : EventJournal auto-initialize : on timestamp-provider : "Akka.Persistence.Sql.Common.Journal.DefaultTimestampProvider, Akka.Persistence.Sql.Common" metadata-table-name : Metadata } } snapshot-store : { plugin : set-in-entity-persistent-actor $tenantId : { class : "Akka.Persistence.SqlServer.Snapshot.SqlServerSnapshotStore, Akka.Persistence.SqlServer" plugin-dispatcher : akka.actor.default-dispatcher connection-string : "$tenantConnectionString" connection-timeout : 60s table-name : SnapshotStore schema-name : dbo auto-initialize : on } } query : { $tenantId : { class : "Akka.Persistence.Query.Sql.SqlReadJournalProvider, Akka.Persistence.Query.Sql" write-plugin : akka.persistance.journal.$tenantId refresh-interval : 3s max-buffer-size : 100 } } } }
Блоки, начинающиеся с $tenantId
повторяются для каждого арендатора. $tenantId
заменяется на Guid, представляющий идентификатор арендатора. $connectionString
заменяется фактической строкой подключения для этого арендатора. (У нас есть отдельные базы данных для каждого арендатора.)
В конструкторе персистентного актера мы делаем this.JournalPluginId = $"akka.persistence.journal.{tenantId}";
а также this.SnapshotPluginId = $"akka.persistence.snapshot-store.{tenantId}"
,
Части журнала и магазина моментальных снимков работают нормально. Приложение записывает события и снимки в базу данных.
Однако, когда мы запускаем программу чтения журнала, мы получаем следующее сообщение об ошибке:
System.ArgumentException: Persistence config is missing plugin config path for: [the actual tenant Id] at Akka.Persistence.PersistenceExtension.NewPluginHolder(ExtendedActorSystem system, String configPath, String fallbackPath) at Akka.Persistence.PersistenceExtension.<>c__DisplayClass25_0.<PluginHolderFor>b__1() at System.Lazy`1.ViaFactory(LazyThreadSafetyMode mode) at System.Lazy`1.ExecutionAndPublication(LazyHelper executionAndPublication, Boolean useDefaultConstructor) at System.Lazy`1.CreateValue() at Akka.Persistence.PersistenceExtension.PluginHolderFor(String configPath, String fallbackPath) at Akka.Persistence.PersistenceExtension.JournalFor(String journalPluginId) at Akka.Persistence.Query.Sql.AbstractEventsByTagPublisher..ctor(String tag, Int64 fromOffset, Int32 maxBufferSize, String writeJournalPluginId) at Akka.Persistence.Query.Sql.LiveEventsByTagPublisher..ctor(String tag, Int64 fromOffset, Int64 toOffset, TimeSpan refreshInterval, Int32 maxBufferSize, String writeJournalPluginId)
Вместо установки write-plugin в akka.persistance.journal.$tenantId
, мы попытались $tenantId
, Но тоже не работает.
Как нам настроить раздел запросов, чтобы читатель журнала мог найти подходящий плагин для правильного арендатора?