シナリオ
アプリケーションのDBがダウンしました。これにより、DBへの重要なデータのコミットを担当するアクターが接続の取得に失敗します。
推奨される動作重要なデータは、将来
バックアップされるときにデータベースに書き込まれます。
現在の実装
アクターはDBExceptionをキャッチし、データをDBWriteFailedケースクラスにラップして、メッセージをスーパーバイザーに送信します。次に、スーパーバイザーは、system.scheduler.scheduleOnce(...)を使用して、将来のある時点(たとえば、1分)に別の書き込みをスケジュールします。これにより、DBが復旧するのを待っている間、サークル内でスピンしすぎないようにします。
この実装は確かに機能しますが、もっと良い方法があるのではないかと思います。
- コミットが成功した後、コミットするアクターが元の送信者に応答する必要がある場合、プロトコルは少し厄介になります。
- コミットしているアクターへのメッセージの通常のフローは決して抑制されず、アクターは新しいメッセージを喜んで処理し、メッセージのすべてのDBに接続できない可能性があります。
- メッセージがこの再試行ループに長時間とどまると、コミットしているアクターのメールボックスが膨らみ始めます。このデータをコミットすることは重要ですが、過度のメモリ使用量が原因でアプリケーションがクロールして停止したりクラッシュしたりしても、問題はありません。
私はakkaの初心者であり、スーパーバイザー戦略に関してはほとんど経験がありませんが、この再試行ロジックの一部を処理するためにそれらの1つを活用できる可能性があると感じています。
このような問題を解決するためのakkaの一般的なアプローチはありますか?私は正しい方向に進んでいますか、それとも別の方向に向かっている必要がありますか?
どんな助けでも大歓迎です。