3

次のようなコードを作成しようとしています。

  • いくつかのリクエストで2つのWebサービスにアクセスする
  • レスポンスは一連のオブジェクトで、各オブジェクトは ID で識別され、レスポンスは ID で昇順でソートされます
  • 応答は大きく、ストリーミングされます (または gzip チャンク)
  • 結果は、ID に基づく 2 つの入力からのデータのマージになります。

私が達成しようとしているのは、応答の対応する部分が利用可能になったら、出力を書き出す必要があるということです。また、メモリが不足するため、応答全体が整うのを待ちたくありません。できるだけ早くストリーミング出力を開始し、メモリをできるだけ少なくしたいと考えています。

どのような方法で始めるのがよいでしょうか?

私は aleph と lamina、また async.http.client を見てきました。これらのツールが役立つようですが、両方の Web サービスからの応答の同じ部分に反応する 1 つのコードを作成する方法を理解するのに苦労しています。

4

1 に答える 1

3

このようなことを行うことができます(aleph を使用 - ボンネットの下でラミナ チャネルの抽象化を使用)。

  • sync-http-request2 http リクエストの作成に使用
  • :body上記で作成した 2 つのリクエスト オブジェクトから を取得します。例: https://github.com/ztellman/aleph/wiki/Consuming-and-Broadcasting-a-Twitter-Stream
  • :bodyはラミナ チャネルです。ラミナ メソッドを使用しjoinて 2 つのチャネルを 1 つのチャネルに結合します。
  • 上記のチャンネルを購読します(これはjoin呼び出しの結果でした)。

これで、サブスクリプション コールバックは、いずれかのチャネルに到着するとすぐに各 JSON オブジェクトを受信atomし、2 つのチャネルと値からの結果を結合したい値であるキーを持つマップであるローカルを持つことができます。同じキーの値を格納するベクトルです。したがって、これは次のようになります。

  • コールバックでアイテムを受信すると、ローカルatomマップにキーが既にあるかどうかを確認します
  • キーが既にある場合は、キーの 2 つのアイテム (マップに既に存在するものと受け取ったばかりのアイテム) を保存するか、その他の処理を行い、キーをマップから削除します。
  • キーがそこにない場合は、キーと値を、[item]つまり現在受信中の 1 つのアイテムのベクトルとして作成します。
于 2012-06-17T06:50:20.207 に答える