7

アプリケーションは n 秒ごとに、トレーディング システム内の証券のライブ価格を提供するリモート JSON ファイルを要求しています。JSON には、必要なデータを含むmarketdataブロック ( ) と、現在のデータを含むブロックdataversion(versionおよびseqnum) があります。

現在、 ActionController::Live(EventSourceクライアント側で) を使用して、更新されたデータをブラウザーにプッシュしています。すべてのアクションは 1 つのメソッド内で実行されます。

  1. SSE接続を開く;
  2. 動的 URL の形成;
  3. リモート サーバーから新しいデータを取得する。
  4. 値の比較/再割り当てseqnum;
  5. 必要に応じてデータベースを更新します。

したがって、私の目標は、データベースのプルと更新 ( ActiveJob) と、更新された値のブラウザーへのプッシュ( ) を分離することActionController::Liveです。これを達成するには、次のものが必要です。

  • サーバー側のどこかに保存し、コントローラーseqnumversionバックグラウンドジョブの間で共有します。
  • または、フィールドの最新の変更についてデータベースを監視しますupdated_at

だから基本的に私は2つの質問があります:

  • 上記の 2 つのオプションのうち、どちらがより効率的ですか?他に良い方法はありますか?
  • (最初のものに存在する権利がある場合)このアプローチをどのように実装しますか?
4

1 に答える 1

3

たとえば、複数の rails プロセスが実行されている可能性があるという事実を考慮すると、何らかの方法で activejob が直接 rails コントローラーと通信できるようにすることは非常に困難になると思います。

間違いなく storeseqnumversion、私は決して依存しません。updated_atランダムに更新するのは簡単すぎるため、実際の理由なしにクライアントに送信することになります。また、この場合、ファイルが更新されているかどうかを指摘するための非常に堅実なフィールドのように見えます。

ポーリングあり

そうは言っても、何らかの方法で「シグナル」を送信したいActionController::Live場合は、クライアント側でファイルが更新されたかどうかを知る必要がある特定の瞬間がない限り、ここでポーリングすることが唯一の選択肢です。 websockets などを使用したい場合があります。

だから、次のようなもの

cached_request = YourCachedRequest.latest # Assuming it returns a single record
updated        = true
loop do
  if updated
    updated = false
    response.stream.write cached_request.serialize_in_some_way
  end
  current_version = cached_request.version # use seqnum too if you need
  cached_request = cached_request.reload
  updated = true if cached_request.version > current_version
  sleep 20.0
end

ポーリングなし

ポーリングを伴わないオプションが必要な場合は、私が信じている websocket のみを使用できます。ただし、より効率的なオプションがあります。

クライアントがポーリングするミニ アプリケーション (evenmachine/sinatra/something light) を作成します (メイン アプリケーションを通過して、これをこのミニ アプリケーションの別のノードに配布できます)。このアプリのポイントは、メインからメッセージを再ルーティングすることだけです。ポーリング クライアントへのアプリケーション。

これで、遅延ジョブでのみ使用されるメイン アプリケーションの内部 API エンドポイントを作成できます。遅延ジョブは、フェッチされた JSON が現在保存されている JSON に対して実際に更新されていることに気付いた場合にのみ、このエンドポイントにヒットします。その場合、メインアプリの API エンドポイントにヒットし、メッセージが送信されます (再び、おそらくミニアプリの HTTP API エンドポイントを介して)。あなたのクライアントに。

このようにして、メイン サーバーに過負荷をかけることはありませんが、これらのミニノードのみが局所的に停止する可能性があります(これは、大きなシステム停止の代わりに大きな利点です)。

于 2015-07-20T15:48:47.153 に答える