Windows AzureとF#を使用したTwitterストリーミングAPI録音と処理
質問
1か月前、F#エージェントを使用してTwitterStreamingAPIデータを処理および記録しようとしました ここ. 。ちょっとした演習として、私はコードをWindows Azureに転送しようとしています。
これまでのところ、私には2つの役割があります。
キューにメッセージ(ツイートのJSONであるメッセージ)を配置する1つの労働者の役割(出版社)。
キューからメッセージを読み取り、JSONを解読し、データをクラウドテーブルにダンプする1つのワーカーロール(プロセッサ)。
これは多くの質問につながります:
- 労働者の役割をエージェントとして考えても大丈夫ですか?
- 実際には、メッセージは8 kbを超える可能性があるため、ブロブストレージを使用して、ブロブへの参照をメッセージとして渡す必要があります(または別の方法はありますか?)、それはパフォーマンスに影響しますか?
- 必要に応じて、プロセッサワーカーの役割のインスタンスの数を増やすことができ、キューは魔法のようにより速く処理されると言うのは正しいですか?
これらすべての質問を叩いてすみません、気にしないでください。
どうもありがとう!
解決
労働者の役割をエージェントとして考えても大丈夫ですか?
はい、間違いなく。
実際には、メッセージは8 kbを超える可能性があるため、ブロブストレージを使用して、ブロブへの参照をメッセージとして渡す必要があります(または別の方法はありますか?)、それはパフォーマンスに影響しますか?
はい、あなたが話しているテクニックを使用して(JSONを「JSonmessage-1」という名前でBlobストレージに保存し、「jsonmessage-1」の内容を持つキューにメッセージを送信する)は、標準的な方法のようです8kbよりも大きいAzureでメッセージを渡します。 Azureストレージに2つの通話を行っているため、キューメッセージを取得するには1、BLOBコンテンツを取得するには1、キューから削除するために1、BLOBを削除するために1)が遅くなります。著しく遅くなりますか?おそらくそうではありません。 Base64エンコード(これはStorageClient LibraryのGotchaです)の場合、かなりの数のメッセージが8kbを超える場合は、ロジックを入れて送信方法を決定できます。
必要に応じて、プロセッサワーカーの役割のインスタンスの数を増やすことができ、キューは魔法のようにより速く処理されると言うのは正しいですか?
ワーカーの役割を書いて、それが自己抑制され、インスタンスがお互いに登場しないようにしている限り、はい、インスタンスカウントを増やすと、スループットが増加します。あなたの役割が主にストレージの読み書きだけである場合、お金を節約するインスタンスカウントを増やす前に、最初に労働者の役割をマルチスレッドすることで利益を得ることができます。
他のヒント
lokad.cloudという名前のOpenSourceライブラリがあり、大きなメッセージを透過的に処理できます。 http://code.google.com/p/lokad-cloud/
労働者の役割をエージェントとして考えても大丈夫ですか?
これはそれを考えるのに最適な方法です。マクドナルドの労働者を想像してみてください。各ワーカーには特定のタスクがあり、メッセージを介してお互いに通信します (話した).
実際には、メッセージは8 kbを超える可能性があるため、ブロブストレージを使用して、ブロブへの参照をメッセージとして渡す必要があります(または別の方法はありますか?)、それはパフォーマンスに影響しますか?
メッセージが不変である限り、これはそれを行うための最良の方法です。文字列は非常に大きいため、ヒープに割り当てられます。彼らは不変であるため、参照を渡すことは問題ではありません。
必要に応じて、プロセッサワーカーの役割のインスタンスの数を増やすことができ、キューは魔法のようにより速く処理されると言うのは正しいですか?
プロセスが何をしているのかを見て、IOバウンドまたはCPUバウンドであるかどうかを決定する必要があります。通常、IOバウンドプロセスは、エージェントを追加することでパフォーマンスが向上します。あなたが使用している場合 ThreadPool
エージェントの場合、CPUバインドプロセスでも作業のバランスが取れますが、制限に到達します。そうは言っても、あなたのアーキテクチャを台無しにすることを恐れないでください 測定 各実行の結果。これは、使用するエージェントの量のバランスをとる最良の方法です。