web-dev-qa-db-ja.com

2つの異なるシステム間のデータ同期を実現するための障害の少ないソフトウェアレストAPI呼び出しの設計

私はより良い設計アプローチを探していましたが、ここに私の問題の説明と同様の例を示します。まだロジックはありませんが、より良いアプローチを最初に試すことを考えている解決策を心に留めています。

私には2つの異なるsystem-Asystem-Bがあり、system-Bsystem-Aに依存しています。

私はsystem-Aの登録プロセスに取り組んでいます。ここでは、エリア内のすべての学校を登録し、私のデータベース(schoolId、schoolname、teacherIdで構成される)に学校のテーブルを保存します。そして、その中にTeacherテーブル(teacherId、schoolId、studentId)があります。また、学生テーブル(studentId、teacherId、schoolId)。そして、私の要件になると、新しい学校が建設されるか、登録に使用されるようになるたびに、新しい学校を追加し、学校には複数の生徒を扱う複数の教師がいるので、上記の表のいずれかのレコードが追加されると、他のシステムを更新する必要があります。

これを達成するために、私はトリガーをsystem-Aに書き込むことを考えています。これは、これらの上記のテーブルに挿入されたすべてのレコードを検索するか、または教師が生徒、次にこれらのトリガーが呼び出され、Rest api呼び出しを介してsystem-Bに送信されます。また、学校はいつでも追加でき、教師または生徒は学校が追加されるといつでも追加できます。

したがって、ネットワークコールがいつでも失敗する可能性があると想定して、データ同期を実現するための最良のプロセスは何ですか。私のデザインでは、そのレコードが処理されたかどうかを追跡する列はありません。それで私はより良いアプローチを使用していますか?またはより良い効率的な方法はありますか?.Java、Restテンプレート、SQLサーバーを使用してデータを保存しています。

上記のデザインの修正や、何か見落としがある場合は、助けてください。

1

システムAに何らかの形式のメモリが必要です。レコードが変更されたが、まだ同期されていないため、回避策はありません。

提案されたソリューション:

データベース変更のトリガーがすぐに同期を試みるのではなく、CHANGESテーブルにエントリを挿入するようにします。順序に依存する変更を処理するには、これらのエントリに順次IDが必要です。

エントリが追加された後、エントリを順番に列挙してsystem-Bに送信する同期手順が実行されます。送信が成功すると、各エントリが削除されます。送信が成功しない場合、プロセスは停止し、問題を調査できる誰かに通知電子メールを送信する可能性があります。

この手順は、断続的な障害に追いつくためにも定期的に実行されます。

トリガーの処理と同期をさらに分離したい場合は、トリガーからの同期手順の呼び出しを省略して、定期的にのみ実行することができます。呼び出しの間隔によっては、データベースが同期されない短いウィンドウが表示されます。データの検索にのみ使用され、自動処理には使用されない場合、これはおそらく許容されます。

3