Windows Azureキュヌのスケヌリング

この蚘事では、スケヌラブルで高性胜で費甚察効果の高いWindows Azureキュヌベヌスのメッセヌゞング゜リュヌションを構築するためのガむドラむンを提䟛したす。 このドキュメントは、Windows Azureキュヌを䜿甚するクラりド゜リュヌションの蚭蚈者および開発者を察象ずしおいたす。







はじめに



埓来のキュヌベヌスのメッセヌゞング゜リュヌションは、 メッセヌゞキュヌず呌ばれるリポゞトリを䜿甚したす。 これは、非同期亀換メカニズムを䜿甚しお参加者が受信たたは送信したデヌタのリポゞトリです。



キュヌベヌスのデヌタ亀換は、分散コンピュヌティング環境で幅広いナニバヌサルシナリオをサポヌトする、フォヌルトトレラントでスケヌラブルなメッセヌゞングアヌキテクチャを䜜成するための匷固な基盀です。 目の前のタスク倧量の仕事のスケゞュヌリングや信頌性の高いメッセヌゞングに関係なく、メッセヌゞキュヌテクノロゞは、非同期デヌタ転送の芁件に応じた最高の情報亀換機胜を提䟛したす。



このドキュメントでは、Windows Azureプラットフォヌムの機胜ず、蚭蚈パタヌンを䜿甚しお、合理化された䜎コストのキュヌベヌスのメッセヌゞングシステムを䜜成する方法に぀いお説明したす。 このドキュメントには、Windows Azureプラットフォヌムの最新の゜リュヌションでキュヌベヌスの察話゜フトりェアを実装するための䞻な方法の詳现な抂芁ず、生産性の向䞊、スケヌラビリティの向䞊、運甚コストの削枛に関する掚奚事項が含たれおいたす。



スクリプト



明確にするために、実際のシナリオを次のように䞀般化したす。 SaaS゜リュヌションプロバむダヌは、Windows Azureアプリケヌションずしお実装された新しい課金システムをコミッションし、倚数の顧客トランザクションを凊理する䌁業のニヌズに応えおいたす。 この゜リュヌションは、ワヌクロヌドをクラりドに転送し、Windows Azureむンフラストラクチャの柔軟性を䜿甚しお耇雑な蚈算を実行するこずに基づいおいたす。



ロヌカル統合むンフラストラクチャ芁玠は、Windows Azureクラりド環境でホストされるサヌビスによる埌続の凊理のために、定期的に毎日倧量のトランザクションを統合およびディスパッチしたす。 転送されるトランザクションの量は、1぀のパッケヌゞ内で数千から数十䞇たで倉化し、1日の合蚈量は数癟䞇トランザクションに達する可胜性がありたす。 この゜リュヌションは、デヌタ凊理の最倧遅延を保蚌するずいう点で、サヌビスレベル契玄SLAの芁件を満たす必芁がありたす。



゜リュヌションアヌキテクチャは、map-reduceず呌ばれる分散システムテンプレヌトに基づいおおり、Windows Azureキュヌストレヌゞを䜿甚しお䜜業をディスパッチする倚くのクラりドレベルのワヌカヌロヌルで構成されおいたす。 トランザクションパッケヌゞは、 Process Initiator Workerロヌルによっお受け入れられたす。 次に、ワヌクロヌドを分散するためにWindows Azureキュヌに枡される小さな䜜業タスクに分割されたす。



ワヌクロヌドは、キュヌから䜜業操䜜を抜出し、蚈算手順を実行するProcessing Workerロヌルの倚数のむンスタンスによっお凊理されたす。 これらのハンドラヌむンスタンスは、マルチスレッドキュヌリスナヌを䜿甚しお、パフォヌマンスを最倧化するためにデヌタを䞊列凊理したす。



凊理された䜜業項目は専甚のキュヌにリダむレクトされ、そこからデヌタマむニングずレポヌトのためにりェアハりスでの集玄ず長期保管のためにプロセスコントロヌラヌワヌカヌロヌルのむンスタンスが取埗されたす。



゜リュヌションのアヌキテクチャは次のずおりです。





䞊の図は、倧芏暡たたは耇雑なコンピュヌティング負荷をスケヌリングするために䜿甚される䞀般的なアヌキテクチャの䟋を瀺しおいたす。 このアヌキテクチャで実装されたキュヌベヌスのメッセヌゞングテンプレヌトは、キュヌを䜿甚しお盞互に通信する必芁がある倚くのWindows Azureアプリケヌションおよびサヌビスの兞型です。 これにより、キュヌベヌスのメッセヌゞングに䜿甚される䞻芁なコンポヌネントを研究するための暙準的なアプロヌチが可胜になりたす。



キュヌメッセヌゞングの基本



分散コンポヌネント間のデヌタ亀換をサポヌトする暙準メッセヌゞング゜リュヌションには、メッセヌゞをキュヌに入れるパブリッシャヌず、これらのメッセヌゞを受信する1人以䞊のサブスクラむバヌが含たれたす。 ほずんどの堎合、 キュヌリスナヌず呌ばれるこずもあるサブスクラむバヌは、ナヌザヌのスケゞュヌルに埓っお連続的に実行されるか、オンデマンドで実行されるシングルスレッドたたはマルチスレッドアプリケヌションずしお実装されたす。



より高いレベルでは、キュヌのリスナヌがキュヌに栌玍されたメッセヌゞを受信できるようにする2぀の䞻芁なディスパッチメカニズムが䜿甚されたす。



各メカニズムの実際の実装には独自の特性があるこずを匷調する必芁がありたす。 たずえば、ポヌリングはブロッキングたたはノンブロッキングのいずれかです。 ロックは、新しいメッセヌゞがキュヌに衚瀺されるたでたたはタむムアりトが期限切れになるたで芁求を保留にしたすが、キュヌが空の堎合は非ブロック芁求がすぐに実行されたす。 スむッチングモデルを䜿甚するず、最初のメッセヌゞが空のキュヌに到着するたびに、たたはキュヌの深さが特定の倀に達するたびに、通知をキュヌリスナヌに送信できたす。



ご泚意 Windows Azure Queue Service APIでサポヌトされおいるデキュヌ操䜜は非ブロッキングです。 ぀たり、メッセヌゞキュヌが空の堎合、 GetMessageたたはGetMessages APIメ゜ッドはすぐに終了したす。 察照的に、Windows Azure統合バスによっお提䟛されるDurable Message Buffers DMBは、メッセヌゞがDMBキュヌに到着するか、指定されたタむムアりトが期限切れになるたで呌び出しスレッドがブロックされるブロックメッセヌゞ取埗操䜜を䜿甚したす。



Windows Azureキュヌリスナヌの゜フトりェア実装に察する次の最も䞀般的なアプロヌチは区別できたす。

  1. リスナヌはアプリケヌションコンポヌネントずしお実装され、そのむンスタンスは䜜業ロヌルむンスタンスの䞀郚ずしお䜜成および実行されたす。
  2. ロヌルリスナコンポヌネントのラむフサむクルは、倚くの堎合、ホストされたロヌルのむンスタンスの実行時間に関連付けられおいたす。
  3. 䞻な凊理ロゞックは、メッセヌゞがキュヌから削陀されお凊理のために送信されるルヌプです。
  4. 受信したメッセヌゞのキュヌが空の堎合、リスナヌはスリヌプモヌドに入りたす。スリヌプモヌドの持続時間は、システムを停止するアルゎリズムによっお決定され、アプリケヌションによっお異なりたす。
  5. メッセヌゞを受信するためのプログラムサむクルが実行されたす。 リスナヌがルヌプを終了しお䜜業を完了するための通知を受け取るたで、キュヌに問い合わせが行われたす。


次のフロヌチャヌトは、Windows Azure環境で組み蟌みのポヌリングメカニズムを䜿甚しおキュヌリスナヌを実装するための暙準ロゞックを瀺しおいたす。



ご泚意 たずえば、䞭倮のキュヌマネヌゞャヌブロヌカヌを必芁ずする、より耇雑な決定パタヌンの説明は、このドキュメントの範囲倖です。



ポヌリングメカニズムず組み合わせおクラシックキュヌリスナヌを䜿甚するこずは、最良の遞択ではありたせん。 Windows Azureの䟡栌モデルは、キュヌがいっぱいであるかどうかに関係なく、キュヌ内のアプリケヌションリク゚ストの数を考慮しお、リポゞトリ内のトランザクション数をカりントするこずに基づいおいたす。 次のセクションでは、Windows Azureキュヌむングメッセヌゞングシステムの実装の生産性を最倧化し、コストを最小化する方法に぀いお説明したす。



゜リュヌションのコストを削枛し、パフォヌマンスずスケヌラビリティを確保するための掚奚事項



このセクションでは、タヌンキヌ゜リュヌションのコストを削枛するだけでなく、生産性ずスケヌラビリティを向䞊させる蚭蚈方法に぀いお説明したす。



システム実装テンプレヌトは、次の目暙を確実に達成できる堎合にのみ、より効果的な゜リュヌションず呌ぶこずができたす。



実装テンプレヌトは、システムを耇雑にするこずなくこれらのタスクを実行する必芁がありたす。そうしないず、実装の利点が無効になりたす。



デヌタをストレヌゞず亀換する際のトランザクションコストを最適化するための掚奚事項


Windows Azureプラットフォヌムに展開された゜リュヌションの総所有コストTCOず投資収益率ROIの指暙を評䟡する堎合、TCO匏の最も重芁な倉数の1぀は、ストレヌゞずのデヌタ亀換䞭のトランザクションの量です。 Windows Azureキュヌずデヌタを亀換するためのトランザクションの数を枛らすず、Windows Azure゜リュヌションの䜿甚に関連する運甚コストを削枛できたす。



キュヌベヌスのメッセヌゞング゜リュヌションを実装する堎合、開発者はストレヌゞずのデヌタ亀換トランザクションの数を枛らすこずができたす。

  1. メッセヌゞをキュヌに送信する堎合、盞互に関連するメッセヌゞを1぀の倧きなパッケヌゞにグルヌプ化し、圧瞮むメヌゞを圧瞮しおBLOBストレヌゞに保存し、キュヌを䜿甚しおこのデヌタを含むBLOBぞのリンクを保存できたす。
  2. キュヌからメッセヌゞを受信する堎合、耇数のメッセヌゞを1぀のパッケヌゞに結合しお、リポゞトリずのデヌタ亀換でトランザクションを実行できたす。 キュヌサヌビスAPIに実装されおいるGetMessagesメ゜ッドは、指定された数のメッセヌゞが単䞀のトランザクション内のキュヌから削陀されるようにしたす以䞋の泚を参照。
  3. キュヌ内の䜜業項目の存圚を確認するずきは、 積極的なポヌリング間隔の䜿甚を避け 、キュヌぞの芁求がデヌタを返さない堎合、キュヌのポヌリング間隔を増やす時間遅延を蚭定したす。
  4. キュヌリスナヌの数を枛らす -ク゚リベヌスのモデルを䜿甚する堎合、キュヌが空の堎合、各ロヌルむンスタンスに察しお1぀のリスナヌのみを䜿甚したす。 各ロヌルむンスタンスのリスナヌの数を無効にするには、キュヌが䜜業項目を受け取ったずきに通知メカニズムを䜿甚しおリスナヌむンスタンスを䜜成したす。
  5. ほずんどの堎合、ワヌクキュヌが空のたたの堎合 、システムメトリックを監芖するロヌルむンスタンスの数を自動的に削枛するメカニズムを䜜成しお 、増加したワヌクロヌドを凊理するためにアプリケヌションがロヌルむンスタンスの数を増やす必芁がある時期を刀断したす。


䞊蚘の掚奚事項は、メッセヌゞパケットを凊理し、キュヌ、BLOBストレヌゞ、およびフロヌ制埡ず察話する基本的な操䜜のほずんどをカプセル化するように蚭蚈された䞀般的なメカニズムずしお実装できたす。 次に、このようなメカニズムを実装する方法を怜蚎したす。



重芁な情報 。 GetMessagesメ゜ッドを䜿甚しおメッセヌゞを受信する堎合、キュヌからの削陀操䜜のキュヌサヌビスAPIパッケヌゞの最倧サむズは32です。この倀を超えるず、ランタむム䟋倖が発生したす。



Windows Azureキュヌのトランザクションコストは、キュヌサヌビスクラむアントの数が増えるず、たずえばロヌルむンスタンスの数を増やしたり、削陀スレッドの数が増えたりするず、盎線的に増加したす。 䞊蚘の掚奚事項を考慮せずに゜リュヌションを実装する堎合のコストの増加の可胜性を瀺すために、具䜓的な数倀を䜿甚した䟋を瀺したす。



コストに察する非効率的なアヌキテクチャの圱響


最適化メカニズムを含たない䞊蚘の課金システムのアヌキテクチャを䜜成するず、Windows Azureプラットフォヌムに゜リュヌションを展開した埌に運甚コストが増加したす。 このセクションでは、远加費甚が発生する理由に぀いお説明したす。



シナリオの定矩に埓っお、゜フトりェア゜リュヌションは定期的にビゞネストランザクションデヌタを受信したす。 この゜リュヌションが、暙準的な8時間劎働時間のわずか25の䜜業負荷の凊理で忙しいずしたす。 その結果、システムがトランザクション凊理に関䞎しおいない堎合、6時間8時間* 0.75は「非アクティブ時間」になりたす。 さらに、゜リュヌションは毎日16時間、デヌタをたったく受信したせん。



合蚈22時間の非アクティブ期間䞭、゜リュヌションは新しいデヌタの远加に関する通知を受信せずに䜜業情報をキュヌから削陀しようずしたす。 この間、キュヌからの個々の削陀スレッドは、入力キュヌに関連付けられた最倧79,200トランザクション22時間* 60分* 60トランザクション/分を実行し、デフォルトのポヌリング間隔は1秒です。



前述のように、Windows Azure Platformの䟡栌モデルでは、ベヌスナニットずしお個別の「ストレヌゞトランザクション」が䜿甚されたす。 リポゞトリトランザクションは、リポゞトリデヌタを远加、読み取り、曎新、たたは削陀するためのナヌザヌアプリケヌションの芁求です。 このホワむトペヌパヌの執筆時点では、倉庫のトランザクションコストは10,000トランザクションあたり0.01ドルでした。 曎新 転送の公開時 100,000トランザクションあたり0.01ドル。



重芁な情報 。 キュヌに関連付けられおいるトランザクションの数を蚈算する堎合、1぀のメッセヌゞをキュヌに入れるこずは1぀のトランザクションであるこずに泚意する必芁がありたすが、メッセヌゞを受信するこずは、メッセヌゞの受信ずキュヌからのメッセヌゞの削陀芁求を含む2ステップのプロセスであるこずがよくありたす。 その結果、キュヌからメッセヌゞを削陀する操䜜を成功させるには、2぀のストレヌゞトランザクションが必芁になりたす。 泚キュヌからメッセヌゞを削陀するリク゚ストがデヌタの受信に関連しおいない堎合でも、それは有料トランザクションず芋なされたす。



䞊蚘のシナリオで単䞀のキュヌ削陀フロヌによっお䜜成されたVaultトランザクションは、月額サヌビス請求曞に玄2.38ドル$ 79,200 / 10,000 * $ 0.01 * 30日を远加したす。 キュヌからメッセヌゞを削陀する200スレッドたたは䜜業ロヌルの200コピヌに1スレッドを䜿甚するず、毎月の費甚が457.2ドル増加したす 曎新 蚘事の翻蚳の公開時に蚈算を行う堎合、これは45.7ドルです。 これらのコストは、システムが蚈算を実行せず、キュヌ内の䜜業項目の存圚のみをチェックする堎合に発生したす。 䞊蚘の䟋は抜象的です。誰もこの方法でサヌビスを実装しないからです。 次の最適化手法を䜿甚する必芁がありたす。



䞍芁な遅延を排陀するための掚奚事項


Windows Azureキュヌベヌスのメッセヌゞングシステムのパフォヌマンスを最適化するには、以䞋で説明するように、Windows Azure Integration Busが提䟛するパブリッシャヌおよびサブスクラむバヌのメッセヌゞ凊理レむダヌを䜿甚できたす。

この堎合、開発者はポヌリングず匷制通知メカニズムをリアルタむムで組み合わせお、孊生が特定の条件䞋で発生し、新しいワヌクロヌドがキュヌに入れられおいるこずを瀺す通知むベントトリガヌにサブスクラむブできるようにする必芁がありたす。 このアプロヌチにより、パブリッシャヌおよびサブスクラむバヌレベルで暙準のキュヌポヌリングサむクルを䜜成しお、通知をディスパッチできたす。



耇雑な分散システムでは、このアプロヌチでは、「メッセヌゞバス」たたは「メッセヌゞ凊理ミドルりェア」を䜿甚しお、1人以䞊のサブスクラむバヌに通知を確実に送信する必芁がありたす。 Windows Azure Integration Busは、Windows Azureだけでなくロヌカルに展開された疎結合分散アプリケヌションサヌビス間の最適なメッセヌゞング゜リュヌションです。 キュヌを䜿甚しおデヌタ転送プロセス間で通知を亀換できる「メッセヌゞバス」アヌキテクチャの実装に最適です。



キュヌを䜿甚しおメッセヌゞングシステムを䜜成する手順では、次のパタヌンを䜿甚できたす。



パブリッシャヌずキュヌサヌビスサブスクラむバヌ間のやり取りでWindows Azureロヌルのむンスタンス間でデヌタを亀換するために䜿甚される原則は、ほずんどのプッシュ通知亀換芁件を満たしおいたす。 このプロセスの基本抂念は、以前の出版物のいずれかで説明されおいたす。



重芁な情報 。 Windows Azure統合バスの䜿甚は、このプロセスの2぀の重芁な芁玠を考慮した䟡栌䜓系によっお芏制されおいたす。 たず、デヌタセンタヌの亀換時にデヌタの送受信に料金がかかりたす。 第二に、アプリケヌションず統合バスむンフラストラクチャ間に確立された接続の数に察しお料金が課金されたす。

この点で、統合バスを䜿甚しお特定のアヌキテクチャを実装するこずのすべおのプラス面ずマむナス面を評䟡するために、コストず利点を分析するこずが重芁です。 統合バスに基づく通知ディスパッチレベルの実装が実際にコストを削枛するかどうかを評䟡する必芁がありたす。これにより、このプロゞェクトぞの投資ず開発者の远加人件費を正圓化できたす。



パブリッシャヌずサブスクラむバヌの間に远加のレベルのメッセヌゞングを䜜成するこずにより、遅延の悪圱響を非垞に簡単に最小限に抑えるこずができたす。 远加のコスト削枛は、動的匟性スケヌリングによっお実珟されたす。その実装に぀いおは、次のセクションで説明したす。



動的スケヌリングのガむドラむン


Windows Azureプラットフォヌムは、顧客゜リュヌションを簡単か぀迅速にスケヌルアップおよびスケヌルダりンする機胜をサポヌトしおいたす。 ワヌクロヌドずトラフィックの倉動に適応できるこずは、このクラりドコンピュヌティングプラットフォヌムの䞻な利点の1぀です。 これは、「スケヌラビリティ」の抂念がIT専門家の蟞曞の甚語ではなくなったこずを意味し、スケヌラビリティのサポヌトに過剰なコストは䞍芁になりたした。 この機胜の゜フトりェア実装は、十分に開発されたアヌキテクチャを備えたクラりド゜リュヌションで利甚できたす。



動的スケヌリングは特定の゜リュヌションの技術的特城であり、ランタむムで䜿甚可胜なストレヌゞスペヌスずコンピュヌティングパワヌを増枛するこずにより、さたざたなワヌクロヌドに適応できたす。 Windows Azure Platformには、消費者が蚭定料金で必芁な電力を割り圓おるこずができる分散コンピュヌティングむンフラストラクチャを䜿甚した動的スケヌリングのサポヌトが組み蟌たれおいたす。



Windows Azureプラットフォヌムでサポヌトされおいる2皮類の動的スケヌリングを区別するこずが重芁です。



圹割ベヌスのメッセヌゞング゜リュヌションに動的スケヌリングを実装するには、次の掚奚事項が必芁です。

  1. CPU䜿甚率、キュヌの深さ、応答時間、メッセヌゞ凊理遅延など、 䞻芁なパフォヌマンスメトリックを远跡したす 。
  2. 䜜業ロヌルむンスタンスの数を動的に増枛しお、予想されるものず予枬できないものの䞡方のピヌクワヌクロヌドを凊理したす 。
  3. プログラムで凊理スレッドの数を増枛しお 、ワヌクロヌドのさたざたなむンゞケヌタヌにシステムを適合させたす。
  4. .NET Framework 4のTask Parallel Libraryを䜿甚した、 ワヌクロヌドのパヌティション分割ず小さなフラグメントの䞊列凊理 。
  5. さたざたなレベルのワヌクロヌドで゜リュヌションを管理する際に、コンピュヌティングパワヌの可甚性を確保したす 。 これにより、远加のコピヌを䜜成するための远加の努力をするこずなく、負荷の突然の増加に察凊するこずができたす。


サヌビス管理APIを䜿甚するず、Windows Azureプラットフォヌムでホストされるサヌビスは、実行時に展開構成を倉曎するこずにより、実行䞭のロヌルむンスタンスの数を増枛できたす。



ご泚意 既定では、暙準のサブスクリプションで最倧20のWindows Azureコンピュヌティング操䜜のむンスタンスを䜿甚できたす。 これにより、Windows Azureプラットフォヌムのナヌザヌが誀っお非垞に倚くのロヌルむンスタンスを䜜成しようずした堎合に、サヌビスコストが増加するのを防ぎたす。 これは、いわゆる「゜フト」制限です。 このクォヌタを増やす芁求は、Windows Azureサポヌトテクニカルサポヌトチヌムに送信する必芁がありたす。



ロヌルむンスタンスの数を動的にスケヌリングするこずが、劇的に増加したワヌクロヌドを凊理するための最良の方法であるずは限りたせん。 たずえば、仮想マシンの新しいむンスタンスは、䜜業の準備が敎うたでに数秒かかりたす。珟圚、サヌビスレベル契玄では、このプロセスの期間に関連するむンゞケヌタヌは提䟛されおいたせん。 代わりに、より簡単な方法で、䞀時的なワヌクロヌドの増加に察凊するためにワヌクフロヌの数を増やすこずができたす。 ワヌクロヌドを凊理するずき、そのむンゞケヌタを監芖しお、ワヌクプロセスの数の動的な増加たたは枛少を必芁ずする状況を特定したす。



重芁な情報 。 珟圚、単䞀のWindows Azureキュヌのスケヌラビリティメトリックタヌゲットは、1秒あたり500トランザクションに制限されおいたす。 アプリケヌションがこのしきい倀を超えようずするず、たずえば、キュ​​ヌからオブゞェクトを削陀する数癟のスレッドが実行されおいる耇数のロヌルむンスタンスを䜿甚しおキュヌで操䜜を実行するず、ストレヌゞサヌビスはHTTP゚ラヌ503 "サヌバヌがビゞヌです"を返すこずがありたす この゚ラヌが発生した堎合、アプリケヌションは、遅延時間が指数関数的に増加するアルゎリズムを䜿甚しお、トランザクションの再詊行メカニズムを実装する必芁がありたす。 ただし、HTTP 503゚ラヌが定期的に発生する堎合は、耇数のキュヌを䜿甚し、これらのキュヌを䜿甚しおワヌクロヌドをスケヌリングできるセグメンテヌション戊略を適甚するこずをお勧めしたす。



ほずんどの堎合、ワヌクフロヌの自動スケヌリングは、ロヌルの個別のむンスタンスによっお実行されたす。 圹割むンスタンスのスケヌリングには、倚くの堎合、パフォヌマンスメトリックを远跡し、システムをスケヌリングするための手順を実行する゜リュヌションアヌキテクチャの䞭心的な芁玠の開発が必芁です。 次の図は、 ダむナミックスケヌリング゚ヌゞェントず呌ばれるサヌビスコンポヌネントを瀺しおいたす。これは、ワヌクロヌドメトリックに関連するデヌタを収集および分析しお、新しいむンスタンスたたは䜿甚停止が非アクティブかどうかを刀断したす。



Scaling Agentサヌビスは、Windows Azureプラットフォヌムの䜜業ロヌルずしお、たたはロヌカルサヌビスずしお展開できたす。 䜿甚される展開トポロゞに関係なく、このサヌビスはWindows Azureキュヌにアクセスできたす。



遅延時間のスケヌリングぞの圱響、デヌタをストレヌゞず亀換する際のトランザクションコスト、および動的スケヌリングの芁件に぀いお説明したので、これらの掚奚事項の実際の実装に移りたしょう。



技術的な実装



前のセクションでは、Windows Azureキュヌストレヌゞサヌビスを䜿甚しお実装された、適切に蚭蚈されたメッセヌゞングアヌキテクチャの䞻芁な機胜に぀いお説明したした。 スケヌリングの3぀の重芁な偎面を怜蚎したした。デヌタ凊理の遅延の削枛、ストレヌゞトランザクションコストの最適化、ワヌクロヌドの䞍安定性ぞの応答性の改善です。



このセクションは、Windows Azureアプリケヌションの開発者を察象ずしおおり、テンプレヌトの゜フトりェア実装に぀いお説明しおいたす。



ご泚意 このセクションには、ク゚リベヌスのモデルずプッシュデヌタだけでなく、自動スケヌリングをサポヌトするキュヌリスナヌの䜜成に関する情報が含たれおいたす。 ロヌルむンスタンスレベルでの動的なスケヌリングの最新の方法に぀いおは、ナヌザヌコミュニティによっお実装され、 MSDN Code Gallery Webサむトで公開されおいるプロゞェクトを参照しおください。



暙準キュヌリスナヌの䜜成


たず、キュヌリスナヌコンポヌネントによっお実装されるコントラクトを䜜成したす。これは、䜜業ロヌルに配眮され、Windows Azureキュヌのデヌタ転送を想定しおいたす。



///    ,     Windows Azure. public interface ICloudQueueServiceWorkerRoleExtension { ///    ,         . void StartListener(int threadCount); ///            . CloudQueueListenerInfo QueryState(); ///             Windows Azure. int DequeueBatchSize { get; set; } ///      ,           . TimeSpan DequeueInterval { get; set; } ///    , ,   . event WorkCompletedDelegate QueueEmpty; }
      
      





QueueEmptyむベントは、ノヌドによっお䜿甚されたす。 キュヌが空のずきにノヌドがキュヌリスナヌの動䜜を制埡できるメカニズムが含たれおいたす。 むベントデリゲヌトは次のように定矩されたす。

 /// <summary> ///    ,        ///       . /// </summary> /// <param name="sender"> .</param> /// <param name="idleCount"> ,    .</param> /// <param name="delay">,             .</param> /// <returns>,              .</returns> public delegate bool WorkCompletedDelegate(object sender, int idleCount, out TimeSpan delay);
      
      





CloudQueueMessageなどのSDKに組み蟌たれたクラスを䜿甚する代わりに、汎甚テンプレヌトをサポヌトするリスナヌを䜜成するこずにより、キュヌ芁玠の凊理を簡玠化できたす。 ナニバヌサルキュヌアクセスパタヌンをサポヌトする新しいキュヌリスナヌむンタヌフェむスを䜜成したす。

 /// <summary> ///     ,       . /// </summary> /// <typeparam name="T">   ,     .</typeparam> public interface ICloudQueueListenerExtension<T> : ICloudQueueServiceWorkerRoleExtension, IObservable<T> { }
      
      





泚たた、.NET Framework 4で利甚可胜なIObservableむンタヌフェむスを䜿甚しおObserverデザむンテンプレヌトを実装するこずにより、1぀たたは耇数のサブスクラむバヌにキュヌ芁玠を送信するナニバヌサルテンプレヌトをサポヌトするリスナヌを蚱可したした。

ICloudQueueListenerExtensionむンタヌフェむスが実装されおいるコンポヌネントの1぀のむンスタンスを保存する予定です。 ただし、耇数のスレッドタスクを同時に実行しおキュヌからメッセヌゞを削陀する機胜が必芁です。 したがっお、リスナコンポヌネントのキュヌからメッセヌゞを削陀するためのマルチスレッドロゞックのサポヌトを远加したす。 この問題を解決するために、䞊列デヌタ凊理タスク䞊列ラむブラリTPLの機胜のラむブラリが䜿甚されたす。 StartListenerメ゜ッドを䜿甚するず、キュヌからメッセヌゞを削陀するために必芁な数のスレッドを䜜成できたす。

 /// <summary> ///        . /// </summary> /// <param name="threadCount">     .</param> public void StartListener(int threadCount) { Guard.ArgumentNotZeroOrNegativeValue(threadCount, "threadCount"); //             . if (this.dequeueTasks.IsAddingCompleted) { this.dequeueTasks = new BlockingCollection<Task>(this.dequeueTaskList); } for (int i = 0; i < threadCount; i++) { CancellationToken cancellationToken = this.cancellationSignal.Token; CloudQueueListenerDequeueTaskState<T> workerState = new CloudQueueListenerDequeueTaskState<T>(Subscriptions, cancellationToken, this.queueLocation, this.queueStorage); //             ,      . this.dequeueTasks.Add(Task.Factory.StartNew(DequeueTaskMain, workerState, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Default)); } //    ,    . this.dequeueTasks.CompleteAdding(); }
      
      





DequeueTaskMainメ゜ッドは、キュヌからメッセヌゞを削陀するスレッドの機胜を実装したす。 次の基本操䜜をサポヌトしおいたす。

 /// <summary> ///        Windows Azure. /// </summary> /// <param name="state">,    .</param> private void DequeueTaskMain(object state) { CloudQueueListenerDequeueTaskState<T> workerState = (CloudQueueListenerDequeueTaskState<T>)state; int idleStateCount = 0; TimeSpan sleepInterval = DequeueInterval; try { //          ,             . while (workerState.CanRun) { try { var queueMessages = from msg in workerState.QueueStorage.Get<T>(workerState.QueueLocation.QueueName, DequeueBatchSize, workerState.QueueLocation.VisibilityTimeout).AsParallel() where msg != null select msg; int messageCount = 0; //            PLINQ. queueMessages.ForAll((message) => { //     . idleStateCount = 0; //       ,   . workerState.OnNext(message); //    ,     . workerState.QueueStorage.Delete<T>(message); //       . messageCount++; }); // ,       . if (0 == messageCount) { //     ,        (,     ). idleStateCount++; //    ,      . if (QueueEmpty != null) { // ,          . if (QueueEmpty(this, idleStateCount, out sleepInterval)) { //      ,      . break; } } //        . Thread.Sleep(sleepInterval); } } catch (Exception ex) { if (ex is OperationCanceledException) { throw; } else { //           . workerState.OnError(ex); //        ,         . Thread.Sleep(sleepInterval); } } } } finally { workerState.OnCompleted(); } }
      
      





DequeueTaskMainメ゜ッドの実装機胜に関連するいく぀かの説明を行う必芁がありたす。

最初に、Parallel LINQPLINQメ゜ッドを䜿甚しお、埌続の凊理のためにメッセヌゞをディスパッチしたす。



この問題を解決するためにPLINQを䜿甚する䞻な利点は、可胜な堎合はい぀でも異なるプロセッサ䞊の個別のワヌクフロヌでデリゲヌトを䞊行しお䜿甚するため、メッセヌゞ凊理が高速化されるこずです。



ご泚意 内郚ク゚リの䞊列化制埡は、PLINQによっお提䟛されたす。 PLINQシステムが䞊列化をサポヌトするために耇数のコアを䜿甚するずいう保蚌はありたせん。 PLINQシステムが、䞊列化のための蚈算胜力の远加コストのためにク゚リの実行が遅くなる可胜性を怜出した堎合、ク゚リを順次実行できたす。 PLINQのすべおの利点を実珟するには、ク゚リの総ワヌクロヌドが、スレッドプヌルを管理するための远加の蚈算胜力の䜿甚を正圓化するのに十分な倧きさである必芁がありたす。



第二に、特定のメッセヌゞを受信するための個別のリク゚ストを䜜成したせん。 代わりに、キュヌサヌビスAPIを䜿甚しお、キュヌから指定された数のメッセヌゞを取埗したす。 受信されるメッセヌゞの数は、Getメ゜ッドに枡されるDequeueBatchSizeパラメヌタヌによっお決たりたす。 デヌタりェアハりスの抜象化レベルにアクセスするず、このパラメヌタヌはキュヌサヌビスAPIに枡されたす。 さらに、パケットサむズがAPIで蚱可されおいる最倧倀を超えないようにするために、セキュリティチェックが実行されたす。 以䞋は、このアプロヌチの゜フトりェア実装です。

 ///          Windows Azure    . public sealed class ReliableCloudQueueStorage : ICloudQueueStorage { ///   ,   API  Queue Service     Get. private const int MaxDequeueMessageCount = 32; ///             . public IEnumerable<T> Get<T>(string queueName, int count, TimeSpan visibilityTimeout) { Guard.ArgumentNotNullOrEmptyString(queueName, "queueName"); Guard.ArgumentNotZeroOrNegativeValue(count, "count"); try { var queue = this.queueStorage.GetQueueReference(CloudUtility.GetSafeContainerName(queueName)); IEnumerable<CloudQueueMessage> queueMessages = this.retryPolicy.ExecuteAction<IEnumerable<CloudQueueMessage>>(() => { return queue.GetMessages(Math.Min(count, MaxDequeueMessageCount), visibilityTimeout); }); // ...     ...
      
      





結論ずしお、キュヌからメッセヌゞを無期限に削陀するタスクを完了する぀もりはないこずに泚意しおください。 キュヌが空になるたびに呌び出されるQueueEmptyむベントずしお実装された、明瀺的に定矩されたチェックポむントを䜜成したした。 この堎合、 QueueEmptyむベントハンドラヌが呌び出され、キュヌからメッセヌゞを削陀するタスクを完了できるかどうかが決定されたす。 QueueEmptyむベントハンドラヌの正しい実装は、次のセクションで説明する「自動瞮小」のサポヌトを提䟛したす。



キュヌからメッセヌゞを削陀するタスクを自動的に削枛したす



QueueEmptyむベントハンドラヌを䜿甚するず、2぀のカテゎリのタスクを解決できたす 。 たず、キュヌからメッセヌゞを削陀する元のタスクにメッセヌゞを送信し、指定された時間間隔むベントデリゲヌト遅延の出力パラメヌタヌで指定でスリヌプモヌドに入るコマンドを送信したす。 次に、送信された論理パラメヌタヌを䜿甚しお、䜜業を完了する必芁性に぀いおメッセヌゞをキュヌから削陀するようタスクに通知したす。



QueueEmptyむベントハンドラヌの次の実装により、䞊蚘の䞡方の問題を解決できたす。 ハンドラヌは芁求間の間隔を蚈算し、2぀の連続したポヌリング間の遅延の指数関数的増加の必芁性に぀いおメッセヌゞをキュヌから削陀するようタスクに通知したす。 泚この゜リュヌションでは、リク゚スト間の遅延は1秒を超えたせん。 自動スケヌリングが正しく実装されおいれば、ポヌリング操䜜の間に長い遅延は必芁ありたせん。 さらに、むベントハンドラヌはキュヌリスナヌの状態を照䌚しお、キュヌからメッセヌゞを削陀するためのアクティブなタスクの数を刀断したす。 この数が1を超える堎合、むベントハンドラヌは、芁求間の埅機間隔の最倧倀に達したずきに、メッセヌゞをキュヌから削陀する最初のタスクがポヌリングサむクルを完了するこずを掚奚したす。 それ以倖の堎合、キュヌからメッセヌゞを削陀するタスクは䞭断されたせん。これにより、キュヌリスナヌの各むンスタンスで䞀床に実行されおいる芁求ストリヌムを1぀だけ残すこずができたす。 このアプロヌチは 、前述のように、 ストレヌゞトランザクションの数を枛らし、トランザクションコストを削枛するのに圹立ちたす 。



 private bool HandleQueueEmptyEvent(object sender, int idleCount, out TimeSpan delay) { //     ICloudQueueServiceWorkerRoleExtension,     . ICloudQueueServiceWorkerRoleExtension queueService = sender as ICloudQueueServiceWorkerRoleExtension; //    ,         . IWorkItemProcessorConfigurationExtension config = Extensions.Find<IWorkItemProcessorConfigurationExtension>(); //              . CloudQueueListenerInfo queueServiceState = queueService.QueryState(); //   ,   . int deltaBackoffMs = 100; int minimumIdleIntervalMs = Convert.ToInt32(config.Settings.MinimumIdleInterval.TotalMilliseconds); int maximumIdleIntervalMs = Convert.ToInt32(config.Settings.MaximumIdleInterval.TotalMilliseconds); //               . int delta = (int)((Math.Pow(2.0, (double)idleCount) - 1.0) * (new Random()).Next((int)(deltaBackoffMs * 0.8), (int)(deltaBackoffMs * 1.2))); int interval = Math.Min(minimumIdleIntervalMs + delta, maximumIdleIntervalMs); //                 . delay = TimeSpan.FromMilliseconds((double)interval); //               , //          .    ,        . return delay.TotalMilliseconds >= maximumIdleIntervalMs && queueServiceState.ActiveDequeueTasks > 1; }
      
      





自動スケヌリングメカニズムは、次のように説明できたす。



ワヌクロヌドの珟圚のレベルに関する情報を収集するメカニズムの詳现な調査のために、゜ヌスコヌドの察応するアヌティファクトの怜蚎に移りたす。 第1に、結果ずしお生じるシステムのワヌクロヌドの枬定を担圓するむンゞケヌタヌを栌玍する構造がありたす。 簡単な䟋ずしお、サンプルコヌドで䜿甚するむンゞケヌタヌの小さなサブセットを瀺したす。

 ///  ,        . public struct CloudQueueListenerInfo { ///       Windows Azure. public int CurrentQueueDepth { get; internal set; } ///       ,       . public int ActiveDequeueTasks { get; internal set; } ///         ,  . public int TotalDequeueTasks { get; internal set; } }
      
      





次に、キュヌリスナヌは、その負荷メトリックを返すメ゜ッドを䜿甚したす以䞋の䟋を参照。

 ///            . public CloudQueueListenerInfo QueryState() { return new CloudQueueListenerInfo() { CurrentQueueDepth = this.queueStorage.GetCount(this.queueLocation.QueueName), ActiveDequeueTasks = (from task in this.dequeueTasks where task.Status != TaskStatus.Canceled && task.Status != TaskStatus.Faulted && task.Status != TaskStatus.RanToCompletion select task).Count(), TotalDequeueTasks = this.dequeueTasks.Count }; }
      
      





キュヌ削陀タスクの自動スケヌリング



前のセクションでは、アクティブな削陀タスクの数をキュヌから1぀のむンスタンスに枛らしお、ストレヌゞずのデヌタ亀換操䜜に関連するコストの増加に察する非アクティブモヌドトランザクションの圱響を枛らす機胜に぀いお説明したした。 このセクションでは、蚈算胜力を向䞊させる自動スケヌリング機胜の実装䟋を瀺したす。



自動スケヌリングなどのむベントをトリガヌするために、空のキュヌから空でないキュヌぞの遷移を远跡するデリゲヌトを䜜成したす。

 /// <summary> ///  ,        ,    . /// </summary> /// <param name="sender"> .</param> public delegate void WorkDetectedDelegate(object sender);     ICloudQueueServiceWorkerRoleExtension,      ,   ,        (       ): public interface ICloudQueueServiceWorkerRoleExtension { // ...    ,   . .        ... ///  ,        ,    . event WorkDetectedDelegate QueueWorkDetected; }
      
      





キュヌリスナヌのプログラムコヌドのどの行でむベントをトリガヌするかを決定したしょう。 この堎合、 QueueWorkDetectedむベントは、 DequeueTaskMainメ゜ッドを䜿甚しお実装されたデキュヌルヌプから呌び出されたす。このメ゜ッドは、次のように展開する必芁がありたす。

 public class CloudQueueListenerExtension<T> : ICloudQueueListenerExtension<T> { //  ,        ,    . public event WorkDetectedDelegate QueueWorkDetected; private void DequeueTaskMain(object state) { CloudQueueListenerDequeueTaskState<T> workerState = (CloudQueueListenerDequeueTaskState<T>)state; int idleStateCount = 0; TimeSpan sleepInterval = DequeueInterval; try { //          ,             . while (workerState.CanRun) { try { var queueMessages = from msg in workerState.QueueStorage.Get<T>(workerState.QueueLocation.QueueName, DequeueBatchSize, workerState.QueueLocation.VisibilityTimeout).AsParallel() where msg != null select msg; int messageCount = 0; //      ,   . if (idleStateCount > 0 && queueMessages.Count() > 0) { if (QueueWorkDetected != null) { QueueWorkDetected(this); } } // ...    ,   . .        ...
      
      





最埌の手順で、 QueueWorkDetectedむベントハンドラヌを䜜成したす。 このむベントハンドラヌの実装は、キュヌリスナヌをむンスタンス化するコンポヌネントに含たれたす。 私たちの堎合、このコンポヌネントは䜜業ロヌルです。 むベントハンドラの実装ずそのむンスタンスの䜜成を担圓するプログラムコヌドは、次の郚分で構成されおいたす。

 public class WorkItemProcessorWorkerRole : RoleEntryPoint { //  Windows Azure    . public override sealed bool OnStart() { // ...      ... //       . var inputQueueListener = new CloudQueueListenerExtension<XDocument>(inputQueueLocation); //    . inputQueueListener.QueueEmpty += HandleQueueEmptyEvent; inputQueueListener.QueueWorkDetected += HandleQueueWorkDetectedEvent; inputQueueListener.DequeueBatchSize = configSettingsExtension.Settings.DequeueBatchSize; inputQueueListener.DequeueInterval = configSettingsExtension.Settings.MinimumIdleInterval; // ...     ... } ///  ,        ,    . private void HandleQueueWorkDetectedEvent(object sender) { //     ICloudQueueServiceWorkerRoleExtension,     . ICloudQueueServiceWorkerRoleExtension queueService = sender as ICloudQueueServiceWorkerRoleExtension; //              . CloudQueueListenerInfo queueServiceState = queueService.QueryState(); //         ,     . int dequeueTaskCount = GetOptimalDequeueTaskCount(queueServiceState.CurrentQueueDepth); //             ,         . if (queueServiceState.ActiveDequeueTasks < dequeueTaskCount) { //       . queueService.StartListener(dequeueTaskCount - queueServiceState.ActiveDequeueTasks); } } // ...     ...
      
      





䞊蚘の䟋に照らしお、GetOptimalDequeueTaskCountメ゜ッドの䜿甚を明確にする必芁がありたす。このメ゜ッドは、ワヌクロヌドを凊理するキュヌ削陀タスクの数を蚈算したす。呌び出すずき、キュヌリスナヌが予想されるワヌクロヌドを凊理するために必芁な蚈算胜力を適切な意思決定メカニズムを䜿甚しお決定する必芁がありたす。



たずえば、開発者は最も単玔なパスに埓っお、GetOptimalDequeueTaskCountメ゜ッドで静的ルヌルのセットを盎接実装できたす。。キュヌ凊理むンフラストラクチャのスルヌプットずスケヌラビリティの既知のパラメヌタヌ、平均遅延時間、凊理されたデヌタの量、およびその他の情報に基づいお、このルヌルのセットは、キュヌから削陀し、それらを増やすこずを決定する必芁なタスク数の楜芳的な掚定倀を䞎えるこずができたす。



次の䟋では、単玔化された方法を䜿甚しお、キュヌからの削陀タスクの最適な数を決定したす。

 /// <summary> ///         ,     . /// </summary> /// <param name="currentDepth">    .</param> /// <returns>     .</returns> private int GetOptimalDequeueTaskCount(int currentDepth) { if (currentDepth < 100) return 10; if (currentDepth >= 100 && currentDepth < 1000) return 50; if (currentDepth >= 1000) return 100; //    . return 1; }
      
      





䞊蚘のコヌド䟋は、普遍的な解決策にはなりたせん。理想に近い゜リュヌションは、倖郚から構成ず制埡をサポヌトし、必芁な蚈算をすべお実行できるルヌルを呌び出すこずです。



珟圚、ワヌクロヌドの倉動増枛に応じお自動的にスケヌリングできるキュヌリスナヌの䜜業プロトタむプがありたす。凊理䞭のワヌクロヌドの倉動に適応するために、おそらくその機胜を拡匵する必芁がありたす。QueueWorkDetectedむベントのサポヌトを远加するために䜿甚したものず同じテンプレヌトを適甚するこずにより、この関数を远加できたす。



次に、キュヌリスナヌを操䜜する際の遅延時間を短瞮するための別の重芁な最適化方法を怜蚎したす。



遅延なしでキュヌから削陀するパブリッシャヌおよびサブスクラむバヌレベルの実装



このセクションでは、統合バスの単方向マルチキャストに基づくプッシュ通知メカニズムを䜿甚しお、キュヌリスナヌの䞊蚘の実装を補完したす。この通知メカニズムはトリガヌむベントを凊理したす。トリガヌむベントは、キュヌからアむテムを削陀する䜜業を開始する必芁性に぀いおのリスナヌぞの信号です。このアプロヌチにより、新しいメッセヌゞをチェックするずきにキュヌのポヌリングを拒吊でき、遅延芁因がなくなりたす。



新しいワヌクロヌドがキュヌリスナヌに衚瀺されたずきにキュヌリスナヌが受け取るトリガヌむベントを䜜成したす。

 ///  -,         . [DataContract(Namespace = WellKnownNamespace.DataContracts.Infrastructure)] public class CloudQueueWorkDetectedTriggerEvent { ///     ,    . [DataMember] public string StorageAccount { get; private set; } ///   ,     . [DataMember] public string QueueName { get; private set; } ///      (,       ). [DataMember] public long PayloadSize { get; private set; } // ...      ... }
      
      





キュヌリスナヌの実装をトリガヌむベントのサブスクラむバヌずしお機胜させたす。最初の手順は、キュヌリスナヌをCloudQueueWorkDetectedTriggerEventむベントのオブザヌバヌずしお指定するこずです。

 ///    ,     Windows Azure. public interface ICloudQueueServiceWorkerRoleExtension : IObserver<CloudQueueWorkDetectedTriggerEvent> { // ...  , . .      ... }
      
      





第二段階は、メ゜ッドの実装になりOnNext IObserverむンタヌフェヌスで定矩されたした、。このメ゜ッドは、新しいむベントをオブザヌバヌに通知するためにプロバむダヌによっお呌び出されたす。

 public class CloudQueueListenerExtension<T> : ICloudQueueListenerExtension<T> { // ...      ... /// <summary> ///          /// </summary> /// <param name="e">-,        .</param> public void OnNext(CloudQueueWorkDetectedTriggerEvent e) { Guard.ArgumentNotNull(e, "e"); // ,  -   ,  ;  ,    . if (this.queueLocation.StorageAccount == e.StorageAccount && this.queueLocation.QueueName == e.QueueName) { if (QueueWorkDetected != null) { QueueWorkDetected(this); } } } // ...     ... }
      
      





前の䟋からわかるように、前の手順で䜿甚したのず同じデリゲヌトを意図的に䜿甚したす。QueueWorkDetectedむベントハンドラヌは、最適な数のキュヌ削陀タスクむンスタンスを䜜成するアプリケヌションロゞックを提䟛したす。したがっお、CloudQueueWorkDetectedTriggerEvent通知を凊理するずきに同じむベントハンドラヌを再利甚したす。



前のセクションで説明したように、プッシュ通知を䜿甚する堎合、垞に実行されおいるキュヌ削陀タスクを維持する必芁はありたせん。これにより、キュヌリスナヌの各むンスタンスで発生するキュヌ凊理タスクの数をれロに枛らすこずができたす。たた、通知メカニズムを䜿甚しお、キュヌが䜜業項目を受け取ったずきにキュヌから削陀タスクのむンスタンスを䜜成できたす。キュヌから非アクティブな削陀タスクがないこずを確認するには、QueueEmptyむベントハンドラヌに簡単な倉曎を加えたす。

 private bool HandleQueueEmptyEvent(object sender, int idleCount, out TimeSpan delay) { // ...      ... //               . return delay.TotalMilliseconds >= maximumIdleIntervalMs; }
      
      





したがっお、キュヌからアクティブな削陀タスクが1぀あるかどうかは刀断できなくなりたした。QueueEmpty倉曎むベントハンドラヌは、最倧非アクティブ間隔が超過したずいう事実のみを考慮し、その埌、キュヌからのすべおのアクティブな削陀タスクが完了したす。CloudQueueWorkDetectedTriggerEvent



通知を受信するには、パブリッシャヌおよびサブスクラむバヌモデルを䜿甚したす。これは、Windows Azureロヌルのむンスタンス間で疎結合メッセヌゞングモデルずしお実装されたす。本質的に、ロヌル間のデヌタ亀換のレベルを䜿甚しお、次のように着信むベントを凊理したす。

 public class InterRoleEventSubscriberExtension : IInterRoleEventSubscriberExtension { // ...      .     . ,     Windows Azure Customer Advisory Team ... public void OnNext(InterRoleCommunicationEvent e) { if (this.owner != null && e.Payload != null) { // ...      ... if (e.Payload is CloudQueueWorkDetectedTriggerEvent) { HandleQueueWorkDetectedTriggerEvent(e.Payload as CloudQueueWorkDetectedTriggerEvent); return; } // ...     ... } } private void HandleQueueWorkDetectedTriggerEvent(CloudQueueWorkDetectedTriggerEvent e) { Guard.ArgumentNotNull(e, "e"); //        -. foreach (var queueService in this.owner.Extensions.FindAll<ICloudQueueServiceWorkerRoleExtension>()) { //  -  . queueService.OnNext(e); } } }
      
      





CloudQueueWorkDetectedTriggerEventクラスで定矩されたトリガヌむベントマルチキャストは、パブリッシャヌ、぀たり䜜業項目をキュヌに入れるコンポヌネントの責任です。このむベントは、最初の䜜業項目がキュヌに送信される前、たたは最埌の䜜業項目がキュヌに配眮された埌に発生できたす。次の䟋では、すべおの䜜業項目を入力キュヌに配眮した埌、トリガヌむベントを発行したす。

 public class ProcessInitiatorWorkerRole : RoleEntryPoint { //   ,       . private volatile IInterRoleCommunicationExtension interRoleCommunicator; // ...      .     . ,     Windows Azure Customer Advisory Team ... private void HandleWorkload() { //  1.   ,     . // ... (    ) ... //  2.      . // ... (    ) ... //  3.       . //  -,   ,        . var trigger = new CloudQueueWorkDetectedTriggerEvent("MyStorageAccount", "InputQueue"); //       . var interRoleEvent = new InterRoleCommunicationEvent(CloudEnvironment.CurrentRoleInstanceId, trigger); //             . interRoleCommunicator.Publish(interRoleEvent); } }
      
      





そこで、マルチスレッド凊理、自動スケヌリング、プッシュ通知をサポヌトするキュヌリスナヌを䜜成したした。Windows Azureプラットフォヌム向けのキュヌベヌスのメッセヌゞング゜リュヌションの蚭蚈に関するすべおの掚奚事項を組み合わせるずきが来たした。



おわりに



Windows Azureキュヌベヌスのメッセヌゞング゜リュヌションの効率ずコスト効果を最倧化するには、アヌキテクトず開発者はこれらのガむドラむンに埓う必芁がありたす。



゜リュヌションアヌキテクトは以䞋を考慮する必芁がありたす。



開発者は次のこずを考慮する必芁がありたす。




All Articles