2017-10-23 5 views
0

私の会社が販売するシステムは、マルチマシンソリューション用のソフトウェアです。場合によっては、マシンの1つにUIがあり、別のマシンにバックエンド/ APIがあります。これらのシステムは、さまざまな操作および記憶値のために通信し、それぞれが独自のクロックを使用します。あるマシンのWebサーバーUIがバックエンド/他のAPIと同期していない場合、どうすれば対処できますか?

UIのシステムクロックがバックエンドより30秒以上先行すると、UIのタイムスタンプがキー情報としてREST要求に送信されるため、クエリが誤動作するようになります。 「私が更新したもの」クエリが30秒ごとに発生し、非同期になると、タイミングウィンドウの外にあるので、更新されたデータが失われます。

ソフトウェアがインストールされているシステムを制御できないため、コード側で解決策が必要です。私は顧客に時計を同期させるよう強制することはできません。

  • をUIがそれのシステム時刻のためのバックエンドを照会し、そのをキャッシュすることができます:私が考えた

    可能な解決策。

  • バックエンド/ APIは、アップデートを探す際に、さらに時間を遡ってアクセスできます。これにより、クロックに余裕を持たせることができますが、大きなデータセットを持つシステムでは、より重いクエリ負荷が発生します。

+0

....この領域で多くの時間を費やすことなく、ログイン時にサーバ時間をキャッシュする必要がありますが、私の大きな疑問は「なぜ30秒ごとに?」です。オートセーブのようなことをしている場合は、「30秒、または最初に変更があったときのどちらか早いほうがよい」となります。しかし、一般的に言えば、UIクロックを無関係にしようとするべきです( "クライアントを信用しない"の一部 - _future_タイムスタンプが与えられた場合どうなりますか?)。さもなければ、私はこのシステムがどのように相互作用するかについてより詳細な情報が必要だと思います。 –

+0

@ Clockwork-Muse - 私はこの分野では非常に新しいですが、クライアントによって行われた変更は、「このエントリーの所有者を変更する」または「状況を変更する」ようなイベントです。自動保存はまったくありません。ウェブUIは1〜50人で同時に使用できるように設計されているため、30秒のアップデートが重要です。しかし、30秒は本当に競争条件から保護するつもりはない...それは、現在の状態で「同期しているために最善を尽くしてみよう」のより多くのものである。 – Shadoninja

+0

実際、私は周りを見回し、人々と話すほど、NTPサーバーで適切に構成されたマシンのネットワークがシステム管理者に期待されるようです。私はこのトピックに関する私の心配は少し誇張していると思う。私は人々が何を言わなければならないかを見るために1日か2日間質問を残し、それから私はそれを閉じます。 – Shadoninja

答えて

1

あなたの最善の策は、あなたのAPIを幾分再構成することです。

まず、NTPは良いアイデアですが、実際にはその使用が保証されていません。さらに、有効になっている場合でも、OS(Windows少なくとも)は、特定の攻撃(数分のオーダー)を防ぐために、同期がとれていないパケットを拒否することがあります。

このような分散サービスを扱う場合、マントラは「クライアントを信頼しないでください」です。これは実際にクライアントを制御している場合でも適用され、必ずしもクライアントが悪意のあるものを試しているとは限りません。つまり、クライアントが信頼できるソースではないということです。
タイムスタンプが含まれている必要があります。
タイムスタンプは、クライアントの時間を使用してサーバーを照会しようとしているため、ここでは問題になります。ただし、クライアントを信頼する必要はありません。代わりに、サーバーが要求が処理されたときのタイムスタンプ、またはデータベースの最新のエントリの更新スタンプを返すようにして、新しい更新プログラムを取得するための後続のクエリで使用できるようにする必要があります最初のクエリはあなた次第です)。

同時更新を安全に処理することは少し難しく、衝突時に何が起こるかによって異なります。問題のデータベース中心のバージョンを取り扱っているほとんどの質問と回答から実際には異なるものはありません。状況を正しく処理または検出するためにAPIに追加のフィールドを追加する必要があるかもしれないことに注意してくださいまだしていない。

+0

私は、リクエストが処理されたときにAPIが呼び出し元に伝えるようにするアプローチが好きです。これにより、すでに行われているコールに時間同期が統合されます。私はちょうどリクエスト処理の時間をキャッシュして、後続のリクエストごとにそれを(そしてそれを更新して)使用することができます。私はこの作業をした後に報告します。 – Shadoninja

関連する問題