データベースにデータを書き込むアプリケーションがあります。ネットワークが故障した場合、データベースへの接続が失われ、dbクエリによってアプリケーション全体がフリーズします。
そのため、非同期にするために、メッセージキューメカニズムを使用して、「dbクエリ」部分と「コアアプリケーション部分」を分離しました。
問題は、データベースがオンラインに戻るまで、その間に生成されたすべてのデータが失われることです。
この問題に取り組むのに役立つソフトウェア設計はどのようなものですか?
問題の核心は、非同期メッセージキューを導入することにより、dbクエリが失敗し始めた場合に、アプリケーションが(例外メッセージなどの)即時のフィードバックを受け取らないことです。これを処理するための基本的に2つの概念的なオプションがあります。
メッセージキューに入れられた操作が失敗した場合(データベースの書き込み操作など)、失敗した操作ごとにキューがエラーメッセージをアプリケーションに送信して、アプリケーションがこれを処理できるようにします。
または、これらのネットワーク障害が一時的にのみ発生することが確実にわかっている場合は、キューに問題を処理させます。たとえば、予想される最大のブレーク時間間隔で予想される数のメッセージを格納するのに十分な大きさのローカルバッファをキューに追加できる場合があります(ローカルの永続ストレージを利用している可能性があります)。
2番目のアプローチの場合でも、ネットワークのダウンタイムについて(非同期メッセージ/シグナルによって)アプリケーションに通知することをお勧めします。たぶん、「オフライン」モードのようなものに切り替えて、それ以上のメッセージの生成を停止することができるので、MQのローカルバッファが過負荷になることはありません。