web-dev-qa-db-ja.com

2つの異なるAPIの双方向同期

現在割り当てられているタスクは、2つのERP関連ソフトウェア間の双方向同期をプログラムする必要があることです。1つはWebサービス(Visual Studio Webリファレンス)を提供し、もう1つはREST APIを提供します。

APIのフィールドを一致させることができたので、同じデータを使用して、両方のAPIでオブジェクトの作成を開始できる可能性があります。ところが、実際の同期にたどり着き、思ったより難しいです。

私の頭の中では、すべてがうまくいきます。

Grabbing the data -> determine, what change it is on which side -> sync the data from the source system to the target system

しかし、実際のコーディングでは、いくつかの深刻な問題が発生しています。

  • どちらのAPIにも、データが最後に変更されたとき、それがどのような種類の変更であるかを判断するのが難しいため、どのような方法で通知するかがありません(以前の同期のリストを比較することを考えましたが、別の問題)
  • REST APIを使用するシステムには優先度があるため、同時に2つの変更がある場合、REST APIの変更がカウントされます
  • どの順序で同期する必要がありますか? REST APIに重点が置かれている場合、REST APIはWebサービスの後に変更を適用する必要がありますよね?
  • 同期ソフトウェアはサーバー上で実行され、現時点では、データを取得し、変更を比較して適用するという永続的なループにあります。変更されたデータのみを同期したいのですが、問題に関しては、どのような変化が起こったか(何かが作成された、何かが変更された、何かが削除された)かどうかを判断する方法がないということは不可能です

信頼性とリソースに配慮した方法でこれを達成する方法についてアドバイスをいただけますか?

WebサービスAPIはREST APIよりもはるかに低速です。つまり、何も同期されない間隔があります(愚かに聞こえるかもしれませんが、この問題はシングルスレッドで解決できると思いました)。 。ここでマルチスレッド化が必要になる可能性はありますか?WebサービスAPIのレートは10000/hrに制限されています。

統合の世界へようこそ。それについて最も難しいことは、ほとんどのベンダーがあなたが何を必要としているのか、そしてその結果として彼らのインターフェースに生じたギャップをどれほど理解していないかです。

この場合、あなたは本当に扱いにくい問題を抱えているようです:

  1. いつ変更が行われたかを正確に知る必要がある
  2. 変更がいつ行われたかを正確に伝える方法はありません

統合の設計では、APIのこの欠陥は修正されません。ベンダーにこの問題に対処してもらう必要があります(特に、最終更新時間を含める必要があります。提供しない理由はありません)、または要件を満たすために別のアプローチを考え出す必要があります。

あなたがやろうとしているのは、ある間隔で、2つのシステムを見て、一方の変更を他方に適用することだと思います。両方のシステムが変更された間隔で、他のシステムよりも優先したい場合。これは可能ですが、間隔がかなり長いと、非優先システムで行われた変更が失われる可能性があります。あなたが提供したものに基づいてこれを行う方法は、すべてのレコードを見て、それらが変更されたかどうかを判断するために保持しているある種のレコードと比較することです。たとえば、レコードIDのテーブルとレコードのハッシュを保持できます。ハッシュが変更されると、前回のチェック以降に変更があったことがわかります。次に、更新を適用できます。これは効率的ではなく、読み取りに問題がある可能性があります。

あなたが解決しようとしている問題は、本質的には 結果整合性 の問題です。たとえばビットコインには、それに対処するためのかなり興味深い方法があります。それがどのように達成されるかを読んだ場合、それを機能させるために必要なデータ要素が不足していることに気付くと思います。

3
JimmyJames

両方のサイトのデータを比較できますが、特に、削除の問題が再び発生する可能性があります。

あるシステムとそれ自体を比較するためにスナップショットを維持し、後で各システムのみで変更されたものを見つけ、それらの変更をもう一方の側で解決しながら、それぞれのスナップショットを更新する必要があると思います。

その種類のスナップショットを使用すると、中間更新(たとえば、同じレコードが2回更新された)を見逃す可能性がありますが、おそらくそれは大丈夫だと思います。

ただし、スナップショットがアトミックに取得されるようにして、スナップショットが特定の時点で完全に正しいことを確認します。

1
Erik Eidt