ãã®èšäºã§ã¯ãã¹ã±ãŒã©ãã«ã§é«æ§èœã§è²»çšå¯Ÿå¹æã®é«ã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ãã¥ãŒãªã¹ããŒã®ãœãããŠã§ã¢å®è£
ã«å¯Ÿããæ¬¡ã®æãäžè¬çãªã¢ãããŒãã¯åºå¥ã§ããŸãã
- ãªã¹ããŒã¯ã¢ããªã±ãŒã·ã§ã³ã³ã³ããŒãã³ããšããŠå®è£
ããããã®ã€ã³ã¹ã¿ã³ã¹ã¯äœæ¥ããŒã«ã€ã³ã¹ã¿ã³ã¹ã®äžéšãšããŠäœæããã³å®è¡ãããŸãã
- ããŒã«ãªã¹ãã³ã³ããŒãã³ãã®ã©ã€ããµã€ã¯ã«ã¯ãå€ãã®å Žåããã¹ããããããŒã«ã®ã€ã³ã¹ã¿ã³ã¹ã®å®è¡æéã«é¢é£ä»ããããŠããŸãã
- äž»ãªåŠçããžãã¯ã¯ãã¡ãã»ãŒãžããã¥ãŒããåé€ãããŠåŠçã®ããã«éä¿¡ãããã«ãŒãã§ãã
- åä¿¡ããã¡ãã»ãŒãžã®ãã¥ãŒã空ã®å Žåããªã¹ããŒã¯ã¹ãªãŒãã¢ãŒãã«å
¥ããŸããã¹ãªãŒãã¢ãŒãã®æç¶æéã¯ãã·ã¹ãã ã忢ããã¢ã«ãŽãªãºã ã«ãã£ãŠæ±ºå®ãããã¢ããªã±ãŒã·ã§ã³ã«ãã£ãŠç°ãªããŸãã
- ã¡ãã»ãŒãžãåä¿¡ããããã®ããã°ã©ã ãµã€ã¯ã«ãå®è¡ãããŸãã ãªã¹ããŒãã«ãŒããçµäºããŠäœæ¥ãå®äºããããã®éç¥ãåãåããŸã§ããã¥ãŒã«åãåãããè¡ãããŸãã
次ã®ãããŒãã£ãŒãã¯ãWindows Azureç°å¢ã§çµã¿èŸŒã¿ã®ããŒãªã³ã°ã¡ã«ããºã ã䜿çšããŠãã¥ãŒãªã¹ããŒãå®è£
ããããã®æšæºããžãã¯ã瀺ããŠããŸãã
ãæ³šæ ããšãã°ãäžå€®ã®ãã¥ãŒãããŒãžã£ãŒïŒãããŒã«ãŒïŒãå¿
èŠãšãããããè€éãªæ±ºå®ãã¿ãŒã³ã®èª¬æã¯ããã®ããã¥ã¡ã³ãã®ç¯å²å€ã§ãã
ããŒãªã³ã°ã¡ã«ããºã ãšçµã¿åãããŠã¯ã©ã·ãã¯ãã¥ãŒãªã¹ããŒã䜿çšããããšã¯ãæè¯ã®éžæã§ã¯ãããŸããã Windows Azureã®äŸ¡æ Œã¢ãã«ã¯ããã¥ãŒããã£ã±ãã§ãããã©ããã«é¢ä¿ãªãããã¥ãŒå
ã®ã¢ããªã±ãŒã·ã§ã³ãªã¯ãšã¹ãã®æ°ãèæ
®ããŠããªããžããªå
ã®ãã©ã³ã¶ã¯ã·ã§ã³æ°ãã«ãŠã³ãããããšã«åºã¥ããŠããŸãã æ¬¡ã®ã»ã¯ã·ã§ã³ã§ã¯ãWindows Azureãã¥ãŒã€ã³ã°ã¡ãã»ãŒãžã³ã°ã·ã¹ãã ã®å®è£
ã®çç£æ§ãæå€§åããã³ã¹ããæå°åããæ¹æ³ã«ã€ããŠèª¬æããŸãã
ãœãªã¥ãŒã·ã§ã³ã®ã³ã¹ããåæžããããã©ãŒãã³ã¹ãšã¹ã±ãŒã©ããªãã£ã確ä¿ããããã®æšå¥šäºé
ãã®ã»ã¯ã·ã§ã³ã§ã¯ãã¿ãŒã³ããŒãœãªã¥ãŒã·ã§ã³ã®ã³ã¹ããåæžããã ãã§ãªããçç£æ§ãšã¹ã±ãŒã©ããªãã£ãåäžãããèšè𿹿³ã«ã€ããŠèª¬æããŸãã
ã·ã¹ãã å®è£
ãã³ãã¬ãŒãã¯ã次ã®ç®æšã確å®ã«éæã§ããå Žåã«ã®ã¿ããã广çãªãœãªã¥ãŒã·ã§ã³ãšåŒã¶ããšãã§ããŸãã
- æçšãªäœæ¥ãå®è¡ããªãã¹ãã¬ãŒãžãšã®ããŒã¿äº€æã®ããã®ãã©ã³ã¶ã¯ã·ã§ã³ã®æåŠã«ããéçšã³ã¹ãã®åæž ã
- ãã¥ãŒå
ã®æ°ããã¡ãã»ãŒãžããã§ãã¯ããéã®ããŒãªã³ã°ééã®äœ¿çšã«é¢é£ããäžèŠãªé
å»¶ã®é€å» ã
- å€åããã¯ãŒã¯ããŒãã«ã³ã³ãã¥ãŒãã£ã³ã°ãã¯ãŒãé©åãããããšã«ããåçãªã¹ã±ãŒãªã³ã° ïŒæ¡åŒµããã³çž®å°ïŒã
å®è£
ãã³ãã¬ãŒãã¯ãã·ã¹ãã ãè€éã«ããããšãªããããã®ã¿ã¹ã¯ãå®è¡ããå¿
èŠããããŸããããããªããšãå®è£
ã®å©ç¹ãç¡å¹ã«ãªããŸãã
ããŒã¿ãã¹ãã¬ãŒãžãšäº€æããéã®ãã©ã³ã¶ã¯ã·ã§ã³ã³ã¹ããæé©åããããã®æšå¥šäºé
Windows Azureãã©ãããã©ãŒã ã«å±éããããœãªã¥ãŒã·ã§ã³ã®ç·ææã³ã¹ãïŒTCOïŒãšæè³åççïŒROIïŒã®ææšãè©äŸ¡ããå ŽåãTCOåŒã®æãéèŠãªå€æ°ã®1ã€ã¯ãã¹ãã¬ãŒãžãšã®ããŒã¿äº€æäžã®ãã©ã³ã¶ã¯ã·ã§ã³ã®éã§ãã Windows Azureãã¥ãŒãšããŒã¿ã亀æããããã®ãã©ã³ã¶ã¯ã·ã§ã³ã®æ°ãæžãããšãWindows Azureãœãªã¥ãŒã·ã§ã³ã®äœ¿çšã«é¢é£ããéçšã³ã¹ããåæžã§ããŸãã
ãã¥ãŒããŒã¹ã®ã¡ãã»ãŒãžã³ã°ãœãªã¥ãŒã·ã§ã³ãå®è£
ããå Žåãéçºè
ã¯ã¹ãã¬ãŒãžãšã®ããŒã¿äº€æãã©ã³ã¶ã¯ã·ã§ã³ã®æ°ãæžããããšãã§ããŸãã
- ã¡ãã»ãŒãžããã¥ãŒã«éä¿¡ããå Žåãçžäºã«é¢é£ããã¡ãã»ãŒãžã1ã€ã®å€§ããªããã±ãŒãžã«ã°ã«ãŒãåããå§çž®ã€ã¡ãŒãžãå§çž®ããŠBLOBã¹ãã¬ãŒãžã«ä¿åãããã¥ãŒã䜿çšããŠãã®ããŒã¿ãå«ãBLOBãžã®ãªã³ã¯ãä¿åã§ããŸãã
- ãã¥ãŒããã¡ãã»ãŒãžãåä¿¡ããå Žåãè€æ°ã®ã¡ãã»ãŒãžã1ã€ã®ããã±ãŒãžã«çµåããŠããªããžããªãšã®ããŒã¿äº€æã§ãã©ã³ã¶ã¯ã·ã§ã³ãå®è¡ã§ããŸãã ãã¥ãŒãµãŒãã¹APIã«å®è£
ãããŠããGetMessagesã¡ãœããã¯ãæå®ãããæ°ã®ã¡ãã»ãŒãžãåäžã®ãã©ã³ã¶ã¯ã·ã§ã³å
ã®ãã¥ãŒããåé€ãããããã«ããŸãïŒä»¥äžã®æ³šãåç
§ïŒã
- ãã¥ãŒå
ã®äœæ¥é
ç®ã®ååšã確èªãããšãã¯ã ç©æ¥µçãªããŒãªã³ã°ééã®äœ¿çšãé¿ã ããã¥ãŒãžã®èŠæ±ãããŒã¿ãè¿ããªãå Žåããã¥ãŒã®ããŒãªã³ã°ééãå¢ããæéé
å»¶ãèšå®ããŸãã
- ãã¥ãŒãªã¹ããŒã®æ°ãæžãã -ã¯ãšãªããŒã¹ã®ã¢ãã«ã䜿çšããå Žåããã¥ãŒã空ã®å ŽåãåããŒã«ã€ã³ã¹ã¿ã³ã¹ã«å¯ŸããŠ1ã€ã®ãªã¹ããŒã®ã¿ã䜿çšããŸãã åããŒã«ã€ã³ã¹ã¿ã³ã¹ã®ãªã¹ããŒã®æ°ãç¡å¹ã«ããã«ã¯ããã¥ãŒãäœæ¥é
ç®ãåãåã£ããšãã«éç¥ã¡ã«ããºã ã䜿çšããŠãªã¹ããŒã€ã³ã¹ã¿ã³ã¹ãäœæããŸãã
- ã»ãšãã©ã®å Žåãã¯ãŒã¯ãã¥ãŒã空ã®ãŸãŸã®å Žå ãã·ã¹ãã ã¡ããªãã¯ãç£èŠããããŒã«ã€ã³ã¹ã¿ã³ã¹ã®æ°ãèªåçã«åæžããã¡ã«ããºã ãäœæã㊠ãå¢å ããã¯ãŒã¯ããŒããåŠçããããã«ã¢ããªã±ãŒã·ã§ã³ãããŒã«ã€ã³ã¹ã¿ã³ã¹ã®æ°ãå¢ããå¿
èŠãããææã倿ããŸãã
äžèšã®æšå¥šäºé
ã¯ãã¡ãã»ãŒãžãã±ãããåŠçãããã¥ãŒã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çš®é¡ã®åçã¹ã±ãŒãªã³ã°ãåºå¥ããããšãéèŠã§ãã
- ããŒã«ã€ã³ã¹ã¿ã³ã¹ã®ã¹ã±ãŒãªã³ã°ãšã¯ãçŸåšã®ã¯ãŒã¯ããŒããåŠçããããã®äœæ¥ããŒã«ãŸãã¯WebããŒã«ã®è¿œå ã€ã³ã¹ã¿ã³ã¹ã®è¿œå ãšåé€ã§ãã ããã«ã¯ãå€ãã®å ŽåããµãŒãã¹æ§æå
ã®ã€ã³ã¹ã¿ã³ã¹ã®æ°ã倿Žããå¿
èŠããããŸãã Windows Azureã©ã³ã¿ã€ã ã¯ãã€ã³ã¹ã¿ã³ã¹ã®æ°ã®å¢å ã«å¯Ÿå¿ããŠæ°ããã€ã³ã¹ã¿ã³ã¹ãäœæããã€ã³ã¹ã¿ã³ã¹ã®æ°ãæžãããšãæ¢åã®ã€ã³ã¹ã¿ã³ã¹ã®äžéšãã·ã£ããããŠã³ããŸãã
- ããã»ã¹ ïŒã¹ã¬ããïŒã®ã¹ã±ãŒãªã³ã°ãšã¯ ãçŸåšã®ã¯ãŒã¯ããŒãã«å¿ããŠã¹ã¬ããã®æ°ã墿žããããšã«ãããããŒã«ã®ç¹å®ã®ã€ã³ã¹ã¿ã³ã¹ã«å¯ŸããŠååãªã¬ãã«ã®å®¹éïŒåŠçã¹ã¬ããã®æ°ïŒãç¶æããããšã§ãã
圹å²ããŒã¹ã®ã¡ãã»ãŒãžã³ã°ãœãªã¥ãŒã·ã§ã³ã«åçã¹ã±ãŒãªã³ã°ãå®è£
ããã«ã¯ãæ¬¡ã®æšå¥šäºé
ãå¿
èŠã§ãã
- CPU䜿çšçããã¥ãŒã®æ·±ããå¿çæéãã¡ãã»ãŒãžåŠçé
å»¶ãªã©ã äž»èŠãªããã©ãŒãã³ã¹ã¡ããªãã¯ã远跡ããŸã ã
- äœæ¥ããŒã«ã€ã³ã¹ã¿ã³ã¹ã®æ°ãåçã«å¢æžããŠãäºæ³ããããã®ãšäºæž¬ã§ããªããã®ã®äž¡æ¹ã®ããŒã¯ã¯ãŒã¯ããŒããåŠçããŸã ã
- ããã°ã©ã ã§åŠçã¹ã¬ããã®æ°ã墿žã㊠ãã¯ãŒã¯ããŒãã®ããŸããŸãªã€ã³ãžã±ãŒã¿ãŒã«ã·ã¹ãã ãé©åãããŸãã
- .NET Framework 4ã®Task Parallel Libraryã䜿çšããã ã¯ãŒã¯ããŒãã®ããŒãã£ã·ã§ã³åå²ãšå°ããªãã©ã°ã¡ã³ãã®äžŠååŠç ã
- ããŸããŸãªã¬ãã«ã®ã¯ãŒã¯ããŒãã§ãœãªã¥ãŒã·ã§ã³ã管çããéã«ãã³ã³ãã¥ãŒãã£ã³ã°ãã¯ãŒã®å¯çšæ§ã確ä¿ããŸã ã ããã«ããã远å ã®ã³ããŒãäœæããããã®è¿œå ã®åªåãããããšãªããè² è·ã®çªç¶ã®å¢å ã«å¯ŸåŠããããšãã§ããŸãã
ãµãŒãã¹ç®¡ç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ã«çµã¿èŸŒãŸããã¯ã©ã¹ã䜿çšãã代ããã«ãæ±çšãã³ãã¬ãŒãããµããŒããããªã¹ããŒãäœæããããšã«ããããã¥ãŒèŠçŽ ã®åŠçãç°¡çŽ åã§ããŸãã ãŠãããŒãµã«ãã¥ãŒã¢ã¯ã»ã¹ãã¿ãŒã³ããµããŒãããæ°ãããã¥ãŒãªã¹ããŒã€ã³ã¿ãŒãã§ã€ã¹ãäœæããŸãã
泚ïŒãŸãã.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ã§èš±å¯ãããŠããæå€§å€ãè¶
ããªãããã«ããããã«ãã»ãã¥ãªãã£ãã§ãã¯ãå®è¡ãããŸãã 以äžã¯ããã®ã¢ãããŒãã®ãœãããŠã§ã¢å®è£
ã§ãã
çµè«ãšããŠããã¥ãŒããã¡ãã»ãŒãžãç¡æéã«åé€ããã¿ã¹ã¯ãå®äºããã€ããã¯ãªãããšã«æ³šæããŠãã ããã ãã¥ãŒã空ã«ãªããã³ã«åŒã³åºããã
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; }
èªåã¹ã±ãŒãªã³ã°ã¡ã«ããºã ã¯ã次ã®ããã«èª¬æã§ããŸãã
- ãã¥ãŒã«ã¡ãã»ãŒãžã衚瀺ããããšããã«ããã¥ãŒããã¡ãã»ãŒãžãåé€ããã¿ã¹ã¯ãã¯ãŒã¯ããŒããããã«åŠçããŸãã ãã¥ãŒããã¡ãã»ãŒãžãã±ãããåé€ããèŠæ±ã¯ãé
å»¶ãªãéä¿¡ãããŸãã
- å
ã®ãã¥ãŒã空ã«ãªã£ãåŸããã¥ãŒããã¡ãã»ãŒãžãåé€ããåã¿ã¹ã¯ã¯QueueEmptyã€ãã³ããçºçãããŸãã
- QueueEmptyã€ãã³ããã³ãã©ãŒã¯ãèŠæ±ã®éä¿¡éã®ã©ã³ãã ãªææ°é¢æ°çãªé
å»¶ãèšç®ãããã¥ãŒããã¡ãã»ãŒãžãåé€ããŠæå®ãããééã§æäœãäžæåæ¢ããããã¿ã¹ã¯ã«æç€ºããŸãã
- ãã¥ãŒããã¡ãã»ãŒãžãåé€ããã¿ã¹ã¯ã¯ã环ç©éã¢ã¯ãã£ãæéã蚱容æå€§å€ãè¶
ãããŸã§ãæå®ãããã©ã³ãã ãªééã§åæãã¥ãŒãããŒãªã³ã°ãç¶ããŸãã
- éã¢ã¯ãã£ãééã®æå€§é·ã«éããå
ã®ãã¥ãŒããŸã 空ã®å Žåããã¥ãŒããã¡ãã»ãŒãžãåé€ããããã®ãã¹ãŠã®ã¢ã¯ãã£ããªã¿ã¹ã¯ãçµäºããŸãã ã¡ãã»ãŒãžã®éä¿¡ééãèšç®ããã¢ã«ãŽãªãºã ã¯ç°ãªãæéã«æ©èœãããããããã¯åæã«ã¯çºçããŸããã
- ãã¥ãŒããã¡ãã»ãŒãžãåé€ããã¿ã¹ã¯ã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() {
äžèšã®äŸã«ç
§ãããŠã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ã€ãã³ãã®ãªãã¶ãŒããŒãšããŠæå®ããããšã§ãã
ç¬¬äºæ®µéã¯ãã¡ãœããã®å®è£
ã«ãªã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) {
ãããã£ãŠããã¥ãŒããã¢ã¯ãã£ããªåé€ã¿ã¹ã¯ã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) {
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ãã¥ãŒããŒã¹ã®ã¡ãã»ãŒãžã³ã°ãœãªã¥ãŒã·ã§ã³ã®å¹çãšã³ã¹ã广ãæå€§åããã«ã¯ãã¢ãŒããã¯ããšéçºè
ã¯ãããã®ã¬ã€ãã©ã€ã³ã«åŸãå¿
èŠããããŸãããœãªã¥ãŒã·ã§ã³ã¢ãŒããã¯ãã¯ä»¥äžãèæ
®ããå¿
èŠããããŸãã- ãã¥ãŒããŒã¹ã®ã¡ãã»ãŒãžã³ã°ã¢ãŒããã¯ãã£ãäœæãããšãã¯ãã¯ã©ãŠããœãªã¥ãŒã·ã§ã³ãšãã€ããªãããœãªã¥ãŒã·ã§ã³ã®ã¬ã€ã€ãŒãšãµãŒãã¹éã®éåæã§ã¹ã±ãŒã©ãã«ãªã¡ãã»ãŒãžã³ã°ã«Windows Azureãã¥ãŒã¹ãã¬ãŒãžãµãŒãã¹ã䜿çšããå¿
èŠããããŸãã
- 1ç§ããã500ãè¶
ãããã©ã³ã¶ã¯ã·ã§ã³ããµããŒãããããã«æ¡åŒµã§ããã»ã°ã¡ã³ãåãããã¡ãã»ãŒãžã³ã°ã¢ãŒããã¯ãã£ã䜿çšããããšããå§ãããŸãã
- Windows Azure ; .
- , .
- .
- çµ±åãã¹ã䜿çšããŠãªã¢ã«ã¿ã€ã éç¥ã®æºåãããåã«ãã¡ãªãããšã³ã¹ããè©äŸ¡ããå¿
èŠããããŸãã
éçºè
ã¯æ¬¡ã®ããšãèæ
®ããå¿
èŠããããŸãã- ã¡ãã»ãŒãžã³ã°ãœãªã¥ãŒã·ã§ã³ã®èšèšã§ã¯ãWindows Azureãã¥ãŒããããŒã¿ãä¿åããã³ååŸããããã®æé ãäœæãããšãã«ããããåŠçãå®è£
ããå¿
èŠããããŸãã
- 广çãªãã¥ãŒãªã¹ãã³ã°ãµãŒãã¹ãå®è£
ããã«ã¯ãåäžã®ã¹ã¬ããã§ç©ºã®ãã¥ãŒãããŒãªã³ã°ããŠããã¥ãŒããã¢ã€ãã ãåé€ããã¡ã«ããºã ãäœæããå¿
èŠããããŸãã
- ãã¥ãŒãé·æé空ã®ãŸãŸã®å Žåãåçã¹ã±ãŒãªã³ã°ã䜿çšããŠã¯ãŒã«ãŒããŒã«ã€ã³ã¹ã¿ã³ã¹ã®æ°ãæžãããŸãã
- , .
- , , .
- Windows Azure , .
- Windows Azure Integration Bus忹忩èœã䜿çšããŠããã·ã¥éç¥ããµããŒãããåŸ
æ©æéãççž®ãããã¥ãŒããŒã¹ã®ã¡ãã»ãŒãžã³ã°ãœãªã¥ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãåäžãããŸãã
- TPLãPLINQãObserverãã¶ã€ã³ãã¿ãŒã³ãªã©ã.NET Framework 4ã®æ°æ©èœã掻çšããŠãåŠçã®åæå®è¡æ§ãé«ããåæå®è¡æ§ãåäžããããã«ãã¹ã¬ãããµãŒãã¹ã®èšèšãåçåããŸãã