1

私はサードパーティのWebサービスに接続し、情報を取得してmongoコレクションに保存する小さなサービスを持っています。このサービスが興味を持っているデータはかなり静的ですが、例外的な状況(それはサッカースケジュール、btwです)の下で変更することができます。変更の通知を受けるために、サービスは3〜6時間ごとにチェックして、一致またはキャンセルされた一致があるかどうかを確認します。新しいエントリはデータベースに入り、古いものは既にコレクションに入っているので破棄されます。複数インスタンスサービスの不要な作業を減らす

サービスは、ユーザーが接続するGETエンドポイントも公開します。

これは、サービスの単一インスタンスを実行するとうまくいきますが、複数のインスタンスがある場合はうまくいきません(おそらく、すべてのインスタンスが3時間ごとにデータサービスを照会し、結果)。

私はこの解決方法以下のアイデアを持っている:

  • リーダー選挙アルゴリズムのいくつかの種類を使用し、唯一のリーダーは、サードパーティのサービス
  • を照会すべき二つにサービスを分離:1より小さいサービスを希望(複数のインスタンスでは依然として問題がある)、結果をメッセージキューに入れて、その結果を1人の消費者が処理して処理するようにしてください。
  • クエリーサービスのリーダー選定、データ
  • 何らかの種類の分散ロックを使用します(私はRedis/Jedisのソリューションを認識しています)ので、1つのサービスだけがクエリを実行します。これは、しかし、少し過剰な感じです。ちょうどロックのためのRedisを追加すると、一般的に

:-)このような場合に使用されるより良い、他のアイデアは、あなたが好ましい解決策があるかどうか私に教えてくださいません

  • ...まあまあ...のようですそのような問題に?

  • +0

    なぜ同じデータをチェックするインスタンスがたくさん必要ですか?冗長性のためだけに? –

    +0

    サービスはGETエンドポイントも持っているので、このサービスを高可用性にしたいと考えています。私は本当にシステムの単一の障害点を望んでいません。 – TamasGyorfi

    答えて

    2

    私は物事を簡単にし、過度の複雑さを避けるでしょう。 WSレスポンス時間と各インスタンスをWSを再度呼び出す前に保持しておくと、最後の呼び出しからどれだけの時間が経過したかをDBで確認する必要があります。

    +0

    しかし、タイムスタンプが期限切れになると、このタイムスタンプをインスタンスの1つだけに更新することが許可されるはずです。それ以外の場合は、到着した要求ごとに、タイムスタンプが期限切れであることが通知され、新しい更新が必要になります。 – Andrei

    +0

    タイムスタンプの「猶予期間」が満了し、インスタンスがWSからのデータを再度要求すると、新しいデータが新しいタイムスタンプで保持されるため、タイムスタンプをチェックする他のインスタンスは有効なタイムスタンプを見つけます。 –

    +1

    はい、タイムスタンプが更新されたときに、時間間隔[t1、t2](t1は更新要求の開始時刻、t2は更新が確定した時刻)に複数の要求が受信された場合、最初に要求を行うこともできます(t1以降、t2前)。また、インスタンスがタイムスタンプを更新してから要求を出した場合、タイムスタンプの値の読み取り/書き込み時にブロックされた何らかのブロックが必要です。これにより、1つのインスタンスだけが値を読み取るようになります。インスタンスはタイムスタンプを更新し、WSへの要求を行うことができます – Andrei

    関連する問題