6

Akka.NETを使用して新しいシステムを作成し、シャーディングと永続性を備えた基本的なクラスタセットアップを行います。Akka .NET接続プールのタイムアウトに関する問題

シャーディングが正しく機能するように、公式のドキュメントとPetBridgeブログの記事を使用しました。ただし、シャードがSQL Server接続プールで許可されている最大接続数を超えているという問題が発生しました。 04::そのため、我々は...

2017年4月20日14を次のメッセージを取得している31.433 01:00 [警告]「タイムアウトが期限切れ前に接続を取得する経過 タイムアウト時間。 プールされた接続がすべて使用されており、 の最大プールサイズに達したために発生している可能性があります。

シャードがシャーディングジャーナルを更新しているときに、これが起こっていると思われます。

どのようにシャーディングモジュールがSQL接続を適切に管理しないのですか?ここに設定上の問題はありますか?

この種のエラーが発生した場合に再試行することはできますか?現状のまま、このエラーが発生するたびにメッセージが失われます。

ここでは、関連するHOCON

cluster.sharding { 
    journal-plugin-id = "akka.persistence.journal.sharding" 
    snapshot-plugin-id = "akka.persistence.snapshot-store.sharding" 
} 
persistence { 
    journal { 
     plugin = "akka.persistence.journal.sql-server" 
     sql-server { 
      class = "Akka.Persistence.SqlServer.Journal.SqlServerJournal, Akka.Persistence.SqlServer" 
      connection-string = "Server=.;Database=akkasystem;Integrated Security=true" 
      schema-name = dbo 
      auto-initialize = on 
     } 
     # a separate config used by cluster sharding only 
     sharding { 
      connection-string = "Server=.;Database=akkasystem;Integrated Security=true" 
      auto-initialize = on 
      plugin-dispatcher = "akka.actor.default-dispatcher" 
      class = "Akka.Persistence.SqlServer.Journal.SqlServerJournal, Akka.Persistence.SqlServer" 
      connection-timeout = 30s 
      schema-name = dbo 
      table-name = ShardingJournal 
      timestamp-provider = "Akka.Persistence.Sql.Common.Journal.DefaultTimestampProvider, Akka.Persistence.Sql.Common" 
      metadata-table-name = ShardingMetadata 
     } 
    } 
    snapshot-store { 
     sharding { 
      class = "Akka.Persistence.SqlServer.Snapshot.SqlServerSnapshotStore, Akka.Persistence.SqlServer" 
      plugin-dispatcher = "akka.actor.default-dispatcher" 
      connection-string = "Server=.;Database=akkasystem;Integrated Security=true" 
      connection-timeout = 30s 
      schema-name = dbo 
      table-name = ShardingSnapshotStore 
      auto-initialize = on 
     } 
    } 
} 

答えて

1

イベントがあることを、プールからの次の接続のために待っている間、SQLジャーナルがとても重く着信イベントが殺到しているというサイン、その接続タイムアウトトリガすることもあります解放。

あなたの設定からは、イベントを永続化して高比率のシャード/エンティティを作成し始めた場合、これが起こっている可能性があります。既存のSQLジャーナルは、近い将来大幅なスピード・ブーストを受ける予定です(batching journals参照)。うまくいけば、これはあなたの問題を解決するのに役立ちます。

+0

現時点の主な懸念は、私たちが効果的にこれらのメッセージを一度で配信することです。 SQLタイムアウトが発生するたびに、実行されたはずのアクションが失われます。 私たちはAkka.Persistenceを使用することで、少なくとも一度の配信を実現できることを期待していました。これはこれまでのところそうではないようです。タイムアウトが発生したときにアクションが再試行されるように/メッセージが失われないように、これを達成する方法についてアドバイスできますか? – Aaron

+0

[このスニペット](https://gist.github.com/Horusiath/64d829720b66df16bc59dbf106a8008e)は、少なくとも一度の配信ゲートウェイとして機能するプロキシアクタを構築する方法の多かれ少なかれです。しかし、それはあなたの俳優が偶像崇拝の方法で着信メッセージを処理するように制限することを忘れないでください。また、少なくとも一度は配信セマンティクを得たい場合は、キュー(つまりRabbitMQまたはKafka)を通信チェーンの前に置くことをお勧めします。失敗した場合は、処理されていないメッセージのプロセスを再開するだけです。 – Horusiath

関連する問題