1

私は、リクエストを受け取り、リクエスト内のデータを使用してサードパーティのWebサービスを呼び出し、応答を処理してから元のリクエスターに応答を送信し、さらに別のサービスにPUTリクエストを発行するRailsアプリを設計しています。

標準的なRails構造とは異なるため、このRailsアプリの設計方法に頭を悩ませようとしています。

オブジェクトはリストとタスクです。各リストには多くのタスクがあり、各タスクはリストに属しています。

私が受け取るリクエストは次のようなものです。

http://myrailsapp.heroku.com/v1/lists?id=1&from=2012-02-12&to=2012-02-14&priority=high

この例では、リスト#1で優先度の高い2012年2月12日から2012年2月14日までのタスクをリクエストしています。

次に、次のようなサードパーティのWebサービス呼び出しを発行します。

http://thirdpartywebservice.com/v1/lists?id=4128&from=2012-02-12&to=2012-02-14&priority=high ご覧のとおり、データに対していくつかの処理が行われました(この場合はidが変更されました)

結果は、PUTを介してリクエスターと別のWebサービスに返送されます。

私の質問は、これらのタイプの動作を処理するようにRailsアプリを設定するにはどうすればよいですか?コントローラの構造はどのように変化しますか?これはキューの良いユースケースのように見えますが、キュー間で複数の同時リクエストを分散するにはどうすればよいですか?

1つには、データの永続性が不要であり(応答の送信後にデータを破棄できます)、データ構造の設計も簡素化されます。(私はルビーオブジェクトを必要としないと思います。これらを表す単なる辞書またはハッシュは、より軽量でより迅速に実装できます)

編集

そこで、アプリのワークフローをこれらのコンポーネントに分解しました

  • 着信リクエストを解析する
  • 第3部のWebサービスリクエストを作成する
  • サードパーティのリクエストを送信する
  • 期待される応答を処理するためにワーカーをキューに入れます
  • 応答が到着したら処理します
  • 解析された結果を応答として送り返します

これらの各ステップを処理する標準のルビーコントローラーはどれですか?リストとタスク以外に必要なモデルは何ですか?

4

1 に答える 1

2

Resqueへのデータの受け渡しは面倒なので、引き続きデータベースを使用する必要があります。むしろ、それをデータベースに保存してから、IDをワーカーに渡し、データをフェッチし、新しいデータをコミットするか、レコードを削除する必要があります。それは本当にあなた次第ですが、この方法はよりクリーンです。また、fayeなどのプッシュサービスを使用して、処理が完了したことをユーザーに通知することもできます。

多数の同時リクエストが予想される場合は、メモリを大量に消費することが少ないため、Sidekiqをお勧めします。4〜5人のresqueワーカーがいると、すでに約512MBを消費する可能性があります。コントローラの構造は変更しないでください。明確にする必要があることについてコメントしてください。回答を更新させていただきます。

編集

Postgresなどの別のデータベースストアを使用することをお勧めします。必要なモデルが重要かどうかはわかりませんが、基本的にはこれが発生するはずです。

  1. コントローラで、Requestこのサードパーティサービスにクエリを実行するクエリパラメータを含むオブジェクトを作成します。次に、Sidekiq / Resqueによって処理されるジョブをキューに入れ、これThirdPartyRequestを呼び出して、作成したオブジェクトのIDをRequest引数として渡します。次に、オブジェクトを示すビューをここにレンダリングしRequestます。まだ処理されていないため、まだ空であるとしましょうRequest#response。まだ処理中であることをユーザーに知らせます。
  2. 次に、ワーカーがあなたの仕事を処理しますThirdPartyRequestThirdPartyRequest次に、オブジェクトをフェッチしRequest、サードパーティのサービスに接続するために必要なクエリパラメータを取得する必要があります。その後、リクエストを取得します。Requestこのリクエストでオブジェクトを更新してから保存します。

    class ThirdPartyRequest
      def self.perform(request_id)
        request = Request.find(request_id)
    
        # contact third party service
    
        request.response = ...
        request.save
      end
    end
    
  3. ユーザーは自分のページを継続的に更新して、自分のRequestオブジェクトを確認できます。応答で更新されると、完了したことがわかります。ページを自動的に更新する場合は、faye / juggernaut/private_pubまたはPusherなどのSaaSソリューションを調べてください。

于 2012-08-22T00:52:59.390 に答える