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, Но тоже не работает.

Как нам настроить раздел запросов, чтобы читатель журнала мог найти подходящий плагин для правильного арендатора?

0 ответов

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