ã¯ããã«
åŸæ¥ã®ãã¥ãŒããŒã¹ã®ã¡ãã»ãŒãžã³ã°ãœãªã¥ãŒã·ã§ã³ã¯ã ã¡ãã»ãŒãžãã¥ãŒãšåŒã°ãããªããžããªã䜿çšããŸãã ããã¯ãéåæ亀æã¡ã«ããºã ã䜿çšããŠåå è ãåä¿¡ãŸãã¯éä¿¡ããããŒã¿ã®ãªããžããªã§ãã
ãã¥ãŒããŒã¹ã®ããŒã¿äº€æã¯ãåæ£ã³ã³ãã¥ãŒãã£ã³ã°ç°å¢ã§å¹ åºããŠãããŒãµã«ã·ããªãªããµããŒãããããã©ãŒã«ããã¬ã©ã³ãã§ã¹ã±ãŒã©ãã«ãªã¡ãã»ãŒãžã³ã°ã¢ãŒããã¯ãã£ãäœæããããã®åŒ·åºãªåºç€ã§ãã ç®ã®åã®ã¿ã¹ã¯ïŒå€§éã®ä»äºã®ã¹ã±ãžã¥ãŒãªã³ã°ãä¿¡é Œæ§ã®é«ãã¡ãã»ãŒãžã³ã°ïŒã«é¢ä¿ãªããã¡ãã»ãŒãžãã¥ãŒãã¯ãããžã¯ãéåæããŒã¿è»¢éã®èŠä»¶ã«å¿ããæé«ã®æ å ±äº€ææ©èœãæäŸããŸãã
ãã®ããã¥ã¡ã³ãã§ã¯ã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ã«çµã¿èŸŒãŸããã¯ã©ã¹ã䜿çšãã代ããã«ãæ±çšãã³ãã¬ãŒãããµããŒããããªã¹ããŒãäœæããããšã«ããããã¥ãŒèŠçŽ ã®åŠçãç°¡çŽ åã§ããŸãã ãŠãããŒãµã«ãã¥ãŒã¢ã¯ã»ã¹ãã¿ãŒã³ããµããŒãããæ°ãããã¥ãŒãªã¹ããŒã€ã³ã¿ãŒãã§ã€ã¹ãäœæããŸãã
/// <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; }
èªåã¹ã±ãŒãªã³ã°ã¡ã«ããºã ã¯ã次ã®ããã«èª¬æã§ããŸãã
- ãã¥ãŒã«ã¡ãã»ãŒãžã衚瀺ããããšããã«ããã¥ãŒããã¡ãã»ãŒãžãåé€ããã¿ã¹ã¯ãã¯ãŒã¯ããŒããããã«åŠçããŸãã ãã¥ãŒããã¡ãã»ãŒãžãã±ãããåé€ããèŠæ±ã¯ãé 延ãªãéä¿¡ãããŸãã
- å ã®ãã¥ãŒã空ã«ãªã£ãåŸããã¥ãŒããã¡ãã»ãŒãžãåé€ããåã¿ã¹ã¯ã¯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() { // ... ... // . 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ãã¥ãŒããŒã¹ã®ã¡ãã»ãŒãžã³ã°ãœãªã¥ãŒã·ã§ã³ã®å¹çãšã³ã¹ãå¹æãæ倧åããã«ã¯ãã¢ãŒããã¯ããšéçºè ã¯ãããã®ã¬ã€ãã©ã€ã³ã«åŸãå¿ èŠããããŸãã
ãœãªã¥ãŒã·ã§ã³ã¢ãŒããã¯ãã¯ä»¥äžãèæ ®ããå¿ èŠããããŸãã
- ãã¥ãŒããŒã¹ã®ã¡ãã»ãŒãžã³ã°ã¢ãŒããã¯ãã£ãäœæãããšãã¯ãã¯ã©ãŠããœãªã¥ãŒã·ã§ã³ãšãã€ããªãããœãªã¥ãŒã·ã§ã³ã®ã¬ã€ã€ãŒãšãµãŒãã¹éã®éåæã§ã¹ã±ãŒã©ãã«ãªã¡ãã»ãŒãžã³ã°ã«Windows Azureãã¥ãŒã¹ãã¬ãŒãžãµãŒãã¹ã䜿çšããå¿ èŠããããŸãã
- 1ç§ããã500ãè¶ ãããã©ã³ã¶ã¯ã·ã§ã³ããµããŒãããããã«æ¡åŒµã§ããã»ã°ã¡ã³ãåãããã¡ãã»ãŒãžã³ã°ã¢ãŒããã¯ãã£ã䜿çšããããšããå§ãããŸãã
- Windows Azure ; .
- , .
- .
- çµ±åãã¹ã䜿çšããŠãªã¢ã«ã¿ã€ã éç¥ã®æºåãããåã«ãã¡ãªãããšã³ã¹ããè©äŸ¡ããå¿ èŠããããŸãã
éçºè ã¯æ¬¡ã®ããšãèæ ®ããå¿ èŠããããŸãã
- ã¡ãã»ãŒãžã³ã°ãœãªã¥ãŒã·ã§ã³ã®èšèšã§ã¯ãWindows Azureãã¥ãŒããããŒã¿ãä¿åããã³ååŸããããã®æé ãäœæãããšãã«ããããåŠçãå®è£ ããå¿ èŠããããŸãã
- å¹æçãªãã¥ãŒãªã¹ãã³ã°ãµãŒãã¹ãå®è£ ããã«ã¯ãåäžã®ã¹ã¬ããã§ç©ºã®ãã¥ãŒãããŒãªã³ã°ããŠããã¥ãŒããã¢ã€ãã ãåé€ããã¡ã«ããºã ãäœæããå¿ èŠããããŸãã
- ãã¥ãŒãé·æé空ã®ãŸãŸã®å Žåãåçã¹ã±ãŒãªã³ã°ã䜿çšããŠã¯ãŒã«ãŒããŒã«ã€ã³ã¹ã¿ã³ã¹ã®æ°ãæžãããŸãã
- , .
- , , .
- Windows Azure , .
- Windows Azure Integration Busåæ¹åæ©èœã䜿çšããŠããã·ã¥éç¥ããµããŒãããåŸ æ©æéãççž®ãããã¥ãŒããŒã¹ã®ã¡ãã»ãŒãžã³ã°ãœãªã¥ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãåäžãããŸãã
- TPLãPLINQãObserverãã¶ã€ã³ãã¿ãŒã³ãªã©ã.NET Framework 4ã®æ°æ©èœã掻çšããŠãåŠçã®åæå®è¡æ§ãé«ããåæå®è¡æ§ãåäžããããã«ãã¹ã¬ãããµãŒãã¹ã®èšèšãåçåããŸãã