èªè ãžã®æšæ¶ã çŸåšãçŸåšæ¯é çãªMVCã¢ãã«ãšã¯å¯Ÿç §çã«ã ä¿¡å·ã¢ãŒããã¯ã㣠ïŒä¿¡å·/ã¹ãããïŒã«åºã¥ããŠç¬èªã®ãã¬ãŒã ã¯ãŒã¯ãéçºããŠããŸãã 圌ãç§ãã¡ã®ã¹ã¿ãŒãã¢ããã§æŠéã®æ £ãããåããŠããéã«ããã®éãã©ã€ãã©ãªãäžè¶³ããŠããããšã«æ°ä»ããŸãã-å®éã®ã¿ã¹ã¯ãšå°æ¥ã®ããžã§ã³ã¯ãç°ãªãæ©èœãå¿ èŠã§ãããã1ã€ã®ããŒãã§çµ±äžãããŠããããšã瀺ããŠããŸã-ãªã¢ã«ã¿ã€ã ã§å€ãã®ã¯ã©ã€ã¢ã³ããžã®æ å ±ã®åŠçãšé ä¿¡ïŒã¯ããã³ã¡ããã«äŒŒããã®ã§ã圌ãããã«ããŸãïŒã ãããã£ãŠã次ã®ãããžã§ã¯ãã®äž»èŠãªã³ã³ããŒãã³ããšãªããé«éã§æè»ãã€ã¹ã±ãŒã©ãã«ãªã¡ã€ã³ã³ã³ããŒãã³ãã§ããã¡ãã»ãŒãžãã¥ãŒã®å®è£ ãè©Šã¿ãããšã決å®ãããŸããã
ã©ãããã®ïŒ SignalsyMQ Alphaã¯ãPHP / Redis / Zend FrameworkããŒã¹ã®ã¡ãã»ãŒãžãã¥ãŒã§ãã
ã¡ãã»ãŒãžãã¥ãŒã«ã€ããŠã¯ãã§ã«æžããŸããïŒ ã¬ãã¥ãŒã®æåã®èšäº ã 2çªç® ïŒãããã¹ãŠã®ã·ã¹ãã ãæ¹å€çã«ã¬ãã¥ãŒãããããã®ããã€ããè©ŠããŠã¿ããšãã¡ã€ã³ã¢ããªã±ãŒã·ã§ã³ã®ãã©ãããã©ãŒã ã«ã§ããã ãè¿ãããã®ããããå°ãããæè»ã§æ§æå¯èœã§ããããšã«æ°ä»ããŸããïŒãã®å ŽåãPHPïŒããªãŒãã³ã§ç¡æã®ãŸãŸã§ãã æšæºã¡ãã»ãŒãžïŒJSON圢åŒã§ãã¢ããªã±ãŒã·ã§ã³å ã®åãªãé£æ³é åïŒãåŠçããã¡ãã»ãŒãžé ä¿¡ã®æè»ãªæ§æããã¥ãŒã®æ°žç¶çãªä¿åãããã³ããããšã®éåžžã«é«éãªåŠçãæäŸããã·ã³ãã«ãªãµãŒããŒããããŸããã åæã«ãã·ã³ãã«ãªãããã³ã«ãšãäžè¬çã«æ倧éã®ã·ã³ãã«ããå¿ èŠã§ãã
ããã«æãè¿ãã®ã¯ãRubyããŒã¹ã®è£œåã§ããStarling MQãšMemcacheQã§ãã ãšããã§ãäž¡æ¹ã®ã·ã¹ãã ã¯memcacheãããã³ã«ã§åäœããŸããããã¯ãç°çš®ç°å¢ã«åã蟌ãæ©èœã«ãã©ã¹ã®åœ±é¿ãäžããŸãã ããããmemcacheqã¯ãã®éçºããªã·ãŒã«æ¥ããããã£ãã®ã§ãããTwitterã®äœ¿çšçµéšã¯ãããŸãããããã¯ããªãå ·äœçãªè£œåã§ããã絶察ã«å¿ èŠã§ããå¥ã®ãã©ãããã©ãŒã ã ãããã£ãŠãæè¯ã®äŒçµ±ã§ã¯ãã¡ãã»ãŒãžãã¥ãŒã®ç¬èªã®å®è£ ãèšè¿°ããããšã決å®ãããŸããã
Redisãããžã§ã¯ãã¯ãæ§é åããŒã¿ãä¿åããã³åŠçããããã®éçºæ©èœãåããéåžžã«é«éãã€æè»ãªNoSQLã·ã¹ãã ã®åºçºç¹ãšããŠåãäžããããŸããïŒHabréã§ããã«ã€ããŠæžãæéã¯ãããŸããã§ããïŒã 2çªç®ã®ãã¯ãžã©ãã¯Rediskaã§ãã-䟿å©ãªæ§æãšå€ãã®èå³æ·±ãæ©èœïŒããšãã°ãè€æ°ã®ãµãŒããŒãçµã¿èŸŒã¿ã®ã·ãªã¢ã«åããµãŒããŒéã§ã®ããŒã®é åžãªã©ïŒããµããŒãããRedisãšé£æºããããã®PHPã©ã€ãã©ãªã§ãããã©ã€ãã©ãªã¯æŽ»çºã«éçºãããŠããŸãããããã£ãŠãæ©èœã¯åžžã«è¿œå ãããŸãïŒã 3çªç®ã®ãã¯ãžã©ãã¯Zend Framework㧠ãçŸåšã»ãšãã©ã®ãããžã§ã¯ãã§äœ¿çšããŠããŸãããããã§ã¯ãµããŒãã®åœ¹å²ããæãããŠããŸããïŒããã€ãã®ãŠãŒãã£ãªãã£ã¯ã©ã¹ã䜿çšãããŠããŸãïŒã
ZFã«ã¯ãã¡ãã»ãŒãžãã¥ãŒã®ç¬èªã®å®è£ -Zend_Queueãæ¢ã«ããããšãããã«ããããŸããããã¯ãéåžžã®PHPé åããå§ãŸããMemcacheQãããŒã¿ããŒã¹ãZend Platformã§çµãããã¡ãã»ãŒãžãä¿åããããã®ããŸããŸãªããã¯ãšã³ãããµããŒãããŸãã ãã ããå®éã«ã¯ãMemcacheQã§æãææãªã€ã³ã¿ãŒãã§ã€ã¹ãè©Šãããšãã§ããŸããã§ãããã¡ãã»ãŒãžãããŒãå¯éããŠããå Žåã«ããŒã¿ããŒã¹ãæäœããããšã¯ãåã«äžå¯èœã§ããã¹ã¯ãªããå šäœã倱æãããŸã§ãäœæ¥ã¯éåžžã«é ããªããŸãã Zend_Queueã€ã³ã¿ãŒãã§ãŒã¹èªäœã¯éåžžã«æœè±¡çã§ããç§ã®å Žåã¯ãããã€ãã®é«ã¬ãã«ã®é¢æ°ãå¿ èŠã ã£ããããæ¢åã®ã³ãŒããå€§å¹ ã«æ¡åŒµããå¿ èŠããããŸãã ã¡ãªã¿ã«ãRediskaã©ã€ãã©ãªã«ã¯Redisäžã§ãã¥ãŒãæäœããããã®ç¹å¥ãªã¢ããã¿ãŒããããŸããã1é±éèŠåŽãããã¹ãã±ãŒã¹ãåäœããªãã£ãåŸãç§ã¯æçµçã«æ±ºå®ããŸãã-ãããç§ã®ã·ã¹ãã ãæžããŠããŸãïŒ
ãŸããäžè¬çãªã¢ãŒããã¯ãã£ãšæ©èœã決å®ããŸãããã åºæ¬çãªæŠå¿µã¯ãã¡ãã»ãŒãžããã¥ãŒïŒãã£ãã«ïŒããµãŒããŒãããã³ã¹ãã¬ãŒãžã§ãã
- ã¡ãã»ãŒãžã¯ç¹å®ã®ããŒã¿æ§é ã§ããããã®äŸã§ã¯ãä¿åããæ å ±ãå«ãé£æ³é åã§ãã ã¡ãã»ãŒãžã¯ãããã€ãã®ãµãŒãã¹ãã£ãŒã«ããšæ¬æã§æ§æãããŸãã ã¡ãã»ãŒãžã®æ¬æã«ã¯ãåä¿¡è ã«éä¿¡ãããããŒã¿èªäœãä¿åãããŸããæãéèŠãªããšã¯ãå€æŽãããŠããªãããšã§ãã ãµãŒãã¹ãã£ãŒã«ãã¯åŠçäžã«å€æŽãããå ŽåããããŸãã ãããŸã§ã®ãšãããç§ã«å¿ èŠãªãã£ãŒã«ãã¯ãã¡ãã»ãŒãžã®ã¿ã€ãïŒä»»æã®è¡ïŒãã¡ãã»ãŒãžã®ãœãŒã¹ïŒãŸãè¡ïŒãã¡ãã»ãŒãžãé ä¿¡ãããã£ãã«ãããã³ã¡ãã»ãŒãžãäœæããããã®ã¿ã€ã ã¹ã¿ã³ãã§ãã ã¡ãã»ãŒãžæ¬æããã£ãŒã«ãã®1ã€ã§ããã空ã®å ŽåããããŸããç¹å®ã®åä¿¡è ã«å¯ŸããŠã®ã¿æå³ããããã·ã¹ãã å šäœã®è²¬ä»»ã¯åã«ä¿åããŠé ä¿¡ããããšã§ãã
- ãã¥ãŒ ïŒãã£ãã«ïŒã¯äžæã®ã¢ãã¬ã¹ã§ãããã¡ãã»ãŒãžãé ä¿¡ããããã¥ãŒã®ååã§ãã ç§ã¯æãã·ã³ãã«ã§æãç解ãããã圢åŒã®ã¢ãã¬ã¹æå®-URLã®ãããªãã®ãåããŸããã ããšãã°ã/ users / aleksã¯ããŠãŒã¶ãŒaleksã®ã¡ãã»ãŒãžãã¥ãŒã§ãã å éšã§ããã€ãã®è¿œå åŠçãçºçããŸãããããã¯ä»ã®ã¹ã¯ãªããããã¥ãŒã§åäœããæ¹æ³ã«ã¯åœ±é¿ããŸããã ãŸããäžåºŠã«è€æ°ã®ãã¥ãŒã«ã¡ãã»ãŒãžãéä¿¡ããããšãã§ããŸã-ãã®ããã«ã¯ãã¡ã¿æåã*ãïŒä»»æã®æ°ã®æåïŒããïŒã ïŒä»»æã®åäžæåïŒããã³ '[a..z]'-é ä¿¡ãããã¡ãã»ãŒãžã®ååã«å«ãŸããå¿ èŠãããä»»æã®æåã»ããã ããã¯ç§ã®éçºãåãZend_Queueãšæ¯èŒããŠå¥œæçã§ã-ããšãã°ãååãaleksã§ãããã¹ãŠã®ãŠãŒã¶ãŒã«ã¡ãã»ãŒãžãç°¡åã«éä¿¡ã§ããŸãïŒãŠãŒã¶ãŒåã§ãã¥ãŒãåŒã³åºãå ŽåïŒã ãã¥ãŒã¯ãé·ãïŒããã«æ ŒçŽã§ããã¡ãã»ãŒãžã®æ倧æ°ïŒã«ãã£ãŠãç¹åŸŽä»ããããŸãã ã¡ãã»ãŒãžãã¡ã¢ãªïŒããã«ã¯ã·ãªã¢ã«åããã圢åŒïŒã«ä¿åãããããšãèãããšãã¡ã¢ãªã®æ¶è²»ãèæ ®ããå¿ èŠãããããããããžã§ã¯ãã®è©³çŽ°ã«åºã¥ããŠãã¥ãŒã®é·ããéžæããŠãã ããã ãã¥ãŒããªãŒããŒãããŒããå Žåãæãå€ãã¡ãã»ãŒãžãåé€ãããŸãã
- å®éã ãã¥ãŒãµãŒããŒã¯ã©ã€ãã©ãªã¹ã¯ãªãããã®ãã®ã§ãã çŸåšã®å®è£ ã¯RedisãµãŒããŒã§çŽæ¥åäœããŸãã次ã®ã¹ãããã¯å°çšãµãŒããŒã®äœæã§ãã ã€ãŸããã¯ã©ã€ã¢ã³ãã¢ããªã±ãŒã·ã§ã³ã¯ãœã±ãããä»ããŠãµãŒããŒã«æ¥ç¶ããã¡ã¿æ å ±ä»ãã®ã¡ãã»ãŒãžãéä¿¡ããŸãïŒå°ãªããšããã¡ãã»ãŒãžãéä¿¡ãããã£ãã«ã瀺ããŸãïŒãæ®ãã¯ãµãŒããŒã®ããžãã¹ïŒãŸãã¯ããŒã¢ã³ïŒã§ãã æ©èœãæ¡åŒµããããã«ããœã±ãããXML / JSON-RPCãHTTP-RESTãSOAPãªã©ãä»ããŠãããŸããŸãªããŒã¿åœ¢åŒïŒã·ãªã¢ã«åïŒãšããã€ãã®äœæ¥ãããã³ã«ã®äž¡æ¹ããµããŒãããäºå®ã§ãã
- ã¹ãã¬ãŒãž -çŸåšã®ããŒãžã§ã³ã§ã¯1ã€ãŸãã¯è€æ°ã®RedisãµãŒããŒãå®è¡ããŠããŸãããå°æ¥çã«ã¯ãZend_Queueãšåæ§ã«ãã¡ãã»ãŒãžãä¿åããããã®ããã€ãã®ãªãã·ã§ã³ãå®è£ ããå¯èœæ§ããããŸãã
ãããã£ãŠãäžè¬çãªAPIã¯ãZend_Queueã€ã³ã¿ãŒãã§ãŒã¹ã«å¯èœãªéãè¿ãããã€ãã®ã¡ãœããã§æ§æãããŠããŸãããããã€ãã®æ¡åŒµæ©èœããããŸããããã«ã€ããŠã¯ä»¥äžã§èª¬æããŸãã
- getInstanceïŒ$ configïŒ -ã©ã€ãã©ãªãšã¢ããã¿ãŒã®1ã€ã®ã€ã³ã¹ã¿ã³ã¹ã䜿çšããŠRedisã«ã¢ã¯ã»ã¹ããããããã¹ãŠã®äœæ¥ã¯ãæ¢ã«åæåãããã€ã³ã¹ã¿ã³ã¹ã®äœæãŸãã¯äœ¿çšã決å®ããéçã¡ãœãããä»ããŠè¡ãããŸãã æ§æã§ã¯ããµãŒããŒãã©ã¡ãŒã¿ãŒïŒã¢ãã¬ã¹ãããŒãïŒãèšå®ãããè€æ°ã®ãµãŒããŒã®å Žåã¯ã·ãªã¢ã«åæ©èœãšããŒé
åžã¡ã«ããºã ãèšå®ãããŸãã
private $ _options = ArrayïŒ 'maxQueues' => 100000ã//ãã¥ãŒã®æå€§æ° 'maxMessagesPerQueues' => 1000ã// 1ã€ã®ãã¥ãŒå ã®ã¡ãã»ãŒãžã®æå€§æ° 'expireQueues' => 15552000ã//ãã¥ãŒã®æ倧æå¹æéã¯180æ¥é 'expireMessages' => 604800ã// 1ã€ã®ã¡ãã»ãŒãžã®æ倧æå¹æé 'maxMessageLength' => 32768ã//ã¡ãã»ãŒãžã®æ倧ãµã€ãºïŒã·ãªã¢ã«ååŸïŒ 'log' => falseã//æå®ãããŠããå Žåãã¡ãã»ãŒãžãèšé²ããZend_Logãªããžã§ã¯ãã 'redis' =>é åïŒ 'namespace' => 'smq_'ã//ããŒãæžããããã«éžæãããããŒã®åå空é 'ãµãŒããŒ' =>é åïŒ arrayïŒ 'host' => 'localhost'ã//ãã¹ã 'port' => 6379ã//ããŒã 'weight' => 1ã//ããŒé åžã®ããã®ãµãŒããŒã®éã¿ 'password' => '' //ãã¹ã¯ãŒã ïŒ ïŒã 'keyDistributor' => 'crc32'ã//ããŒé åžã¿ã€ã 'serializer' =>é åïŒ 'Signalsy_MQ'ã '_ serialize'ïŒã 'unserializer' =>é åïŒ 'Signalsy_MQ'ã '_ unserialize'ïŒïŒ ïŒ;
ãã¬ãŒïŒZend_Logã䜿çšïŒãèšå®ããŠããã¹ãŠã®éèŠãªã€ãã³ãããšã©ãŒãããã«ã¯ã¡ãã»ãŒãžèªäœãèšé²ããããšãã§ããŸãïŒãããã°ã§ã¯ãªãããããã¯ã·ã§ã³ã§Redisã«ããŒã¿æ倱ãŸãã¯è€è£œãé²ãããã«çµã¿èŸŒãŸããappendonly.logã¡ã«ããºã ãèšå®ããã ãã§ååã§ãïŒããã¯ã¢ãããµãŒããŒãžïŒã - _serialize / _unserialize-æ ŒçŽãããã¡ãã»ãŒãžããªããžããªã«è¿œå ããããããååŸãããšãã«äœ¿çšãããçµã¿èŸŒã¿ã®ã·ãªã¢ã«åé¢æ°ã Redisã¯å€ãšããŠæ°å€ãšæååã®ã¿ãä¿åã§ãããããä¿åããåã«ããŒã¿ãã·ãªã¢ã«åããå¿ èŠããããŸãã ããã¯ãµãŒããŒèªäœã«ãã£ãŠééçã«è¡ãããŸãããããã®ã¢ã¯ã·ã§ã³ã®ã¡ãœãããæå®ããã ãã§ãããããã§ãªãå Žåã¯ããã©ã«ãã§PHPã·ãªã¢ã«åã䜿çšãããŸãã å°æ¥çã«ã¯ã¯ã©ã€ã¢ã³ããšãªããžããªã®éã®äžéå±€ã®æ°ãæå°éã«æããããããAJAXã¢ããªã±ãŒã·ã§ã³ã«ã¯ãã䟿å©ã§ããã€ãã£ãããªJSONãéžæããŸããã 次ã®ããŒãžã§ã³ã§ã¯ãZendã€ã³ãã¥ããŒã¿ãŒã®æ°ããZend_Serializerã³ã³ããŒãã³ãã䜿çšãããä»ã®ã¢ã«ãŽãªãºã ã䜿çšã§ããããã«ãªããŸãã ããã«ãPHPã«ä¿åãããããŒã¿ã¯ãJSONããŒãµãŒãããä»»æã®èšèªã®ä»ã®ããã°ã©ã ã§èªã¿åãããšãã§ããŸããããã¯ãåæ£ã·ã¹ãã ã«ãšã£ãŠéåžžã«éèŠã§ãã
- createQueueã¯ãååãæž¡ããããã¥ãŒãäœæããã¡ã€ã³ã¡ãœããã§ãã æåã«ãååã®æ£ç¢ºãããã§ãã¯ããïŒããŸããŸãªç¹æ®æåãåé€ããããªã©ïŒãã·ã¹ãã å ã®ãã®ãããªãã¥ãŒã®ååšããã§ãã¯ãããŸãã äœæåŸãæåã®ãµãŒãã¹ã¡ãã»ãŒãžããã¥ãŒã«é 眮ãããã¿ã€ã ã¹ã¿ã³ãã瀺ãããŸãã ããã¯ãRedisãæåã®èŠçŽ ãè¿œå ãããšãã«ç©ºã®ãªã¹ãïŒãªã¹ãããŒã¿æ§é ïŒãèªåçã«äœæããããã空ã®æååãªã©ã®å ¬åŒãªãã®ãæå®ããªãããã«ãç¹å¥ãªãŠãŒãã£ãªãã£ã¡ãã»ãŒãžã¿ã€ãã§ãã¥ãŒãåæåããããšã決å®ãããããã§ãã
- isExists-æå®ããããã¥ãŒããµãŒããŒäžã«ååšãããã©ããã確èªããŸãã Zend_Queueçšã®Rediskaã¢ããã¿ãŒã®å®è£ ãšã¯å¯Ÿç §çã«ãããŒã¿ããŒã¹ã¡ã¢ãªå ã®ãã®ãããªãªããžã§ã¯ãã®ååšã®ç¢ºèªãããŒã¿åã®äžèŽãªã©ãããæ·±å»ãªãã§ãã¯ãå®è¡ããŸãã
- count-ãã¥ãŒå ã®ã¡ãã»ãŒãžã®æ°ãååŸã§ããŸãã
- deleteQueue-ãµãŒããŒã¹ãã¬ãŒãžãããã¥ãŒãåé€ããŸãããã¥ãŒå ã®ãã¹ãŠã®ã¡ãã»ãŒãžãåé€ãããŸãã ãããããã¯ã©ãã·ã¥ã®å Žåã«ããŒã¿ãé¢é£ããããã«ãããŒã¿ããŒã¹ã®ç¶æ ã®åŒ·å¶èšé²ããã®ãããªå€æŽã§åæåããå¿ èŠããããŸãã
- sendã¯ãæå®ããããã£ãã«ã«ã¡ãã»ãŒãžãéä¿¡ããã¡ã€ã³ã¡ãœããã§ãã å¿ é ãã©ã¡ãŒã¿ãŒ-ã¡ãã»ãŒãžã«å ããŠããã¥ãŒã·ã¹ãã ã®æ£ããåäœãä¿èšŒããè¿œå ã®ãã§ãã¯ãæå®ã§ããŸãããäœæ¥ãå€§å¹ ã«é ããªãå¯èœæ§ããããŸãã skipCheckQueueLengthã¯ãæ§æã§èšå®ãããå¶éãè¶ ããå Žåã«ãã¥ãŒã®é·ããšãã®åãæšãŠããã§ãã¯ãã圹å²ãæãããŸãã åãæšãŠããããšãæãå€ãã¡ãã»ãŒãžãåé€ãããŸãã ãã®ãã©ã¡ãŒã¿ãŒãæŽæ°ã®å Žåããã®èŠæ±ã§ãã®ãããªãã§ãã¯ãå®è¡ãããå¯èœæ§ãèšå®ããŸãããããã¯ãµãŒããŒãžã®1ã€ãŸãã¯2ã€ã®èŠæ±ãå¿ èŠãšãããããé床ãšä¿¡é Œæ§ã®éã®äžçš®ã®åŠ¥åã§ãã skipCheckQueueExistsãã©ã¡ãŒã¿ãŒã䜿çšãããšããã¥ãŒã®ååšã®ãã§ãã¯ãç¡å¹ã«ã§ããŸãã åè¿°ã®ããã«ãã¡ãã»ãŒãžã¯æšæºçãªé åã§ãããã·ãªã¢ã«ååŸã«ãã¥ãŒã«æ ŒçŽãããŸãã å¿ é ãã£ãã«ãã£ãŒã«ãã§ãã¡ãã»ãŒãžãé 眮ãããã¥ãŒïŒãŸãã¯ãã¹ã¯ã䜿çšããè€æ°ïŒãæå®ããŸãã ãã¹ã¯ãæå®ãããŠããå Žåãæå®ããããã©ã¡ãŒã¿ãŒã«äžèŽãããã¹ãŠã®ãã¥ãŒåããã®ãã¹ã¯ããæœåºããã¡ãã»ãŒãžå ã®ãã£ãã«ãã£ãŒã«ãã調æŽããåŸãã«ãŒãå ã®åãã¥ãŒåã«ã¡ãã»ãŒãžãè¿œå ããŸãã çŸæç¹ã§ã¯ããµãŒãã¹ããããŒã®å€æŽãåæã¯è¡ãããŸãããã¡ãã»ãŒãžã®æ¬æèªäœããæååãŸãã¯æ£ããã·ãªã¢ã«åãå¯èœã«ããPHPã®ä»»æã®ããŒã¿åã®ããããã§ãã ç¹°ãè¿ããŸãããä»ã®å®è£ ãšã®äž»ãªéãã¯ã1åã®åŒã³åºãã§è€æ°ã®ïŒãŸãã¯ãã¹ãŠã®ïŒãã¥ãŒã«ã¡ãã»ãŒãžãéä¿¡ã§ããããšã§ãã ãã®ã³ã°ãªãã·ã§ã³ãèšå®ãããŠããå Žåãã¡ãã»ãŒãžã¯Zend_Logã䜿çšããŠãã°ã«æžã蟌ãŸããŸã
- receive -2çªç®ã«éèŠãªæäœ-ãã¥ãŒãã1ã€ä»¥äžã®ã¡ãã»ãŒãžãåä¿¡ããŸãã ããã§ã¯ãã¹ã¯ã¯ãµããŒããããªããªããã¡ãã»ãŒãžã¯ç¹å®ã®æå®ããããã¥ãŒããã®ã¿åä¿¡ã§ããŸãã ãŸãããµãŒããŒäžã®ãã¥ãŒã®ååšã確èªããå¿ èŠããããŸãïŒç¹ã«æ倧ã®ããã©ãŒãã³ã¹ãåŸãã«ã¯ãç¹ã«RedisãµãŒããŒã§äœæ¥ãã人ãããªãå Žåããããã®ãã¹ãŠã®ç¢ºèªã¯äœæ¥ã®åæåæã«1åã®ã¿å®è¡ã§ããŸãïŒã åä¿¡ããããã«ãåä¿¡ã§ããã¡ãã»ãŒãžã®æ倧æ°ã瀺ããŸãããå®éã«ã¯ãããšãã°ãã¥ãŒã«åãæ°ã®ã¡ãã»ãŒãžãããå Žåãåä¿¡ã§ããã¡ãã»ãŒãžã®æ°ã¯å°ãªããªããŸãã å¥ã®èå³æ·±ããªãã·ã§ã³ïŒæé©åã«é¢ããŠæ©èœãå®å šã«ãªããŸã§é衚瀺ã«ããŸããïŒã¯ãæå®ããæ¥ä»ä»¥éã«éä¿¡ãããã¡ãã»ãŒãžã®ã¿ãåä¿¡ããããšã§ãã ããšãã°ãéå»1æéã«éä¿¡ãããã¡ãã»ãŒãžã100åãŸã§åä¿¡ããããšããŸãã æåã«ãæå®ãããæ°ã®ã¡ãã»ãŒãžããµã³ããªã³ã°ããã次ã«äœææéã®åºæºãæºãããªãã¡ãã»ãŒãžããã§ãã¯ããŠç Žæ£ããŸãã ãã¥ãŒããã®ã¡ãã»ãŒãžã¯èªã¿åãå°çšã§ãããèªã¿åãçŽåŸã«åé€ãããªãããšã«æ³šæããŠãã ãã-ãã®ããã«ã¯ãç¹å¥ãªã³ãã³ãã䜿çšããå¿ èŠããããŸãã ãã¥ãŒèªäœã¯æ°žç¶çã§ããããã®ã¹ããŒã¿ã¹ã¯ã¯ã©ã€ã¢ã³ãã«ãã£ãŠæåã§ïŒãŸãã¯ãã¥ãŒã®é·ãããã§ãã¯ããçµæãšããŠïŒå€æŽãããã ãã§ãã å°æ¥çã«ã¯ãæéåãã¡ã«ããºã ãå®è£ ãããŸããRedisã§æåã«ãµããŒããããŸãããã¯ã©ã€ã¢ã³ãããŒãã§ã¯ãŸã å®è£ ãããŠããŸããïŒåã ã®ãªã¹ãã¢ã€ãã çšïŒã
- deleteMessage-ãã¥ãŒããã¡ãã»ãŒãžãåé€ããŸãã
- getQueues-ãµãŒããŒã§äœ¿çšå¯èœãªãã¹ãŠã®ãã¥ãŒã®ãªã¹ãã衚瀺ã§ããŸãã
- getQueuesByPattern-æå®ããããã¿ãŒã³ã«äžèŽãããã¥ãŒã®ãªã¹ãã衚瀺ããŸãïŒã¡ã¿ãã£ã©ã¯ã¿ãŒã*ãããïŒããããã³æåã°ã«ãŒã[a..z]ã䜿çšããŸãïŒ
æ£çŽãªãšããã ãããžã§ã¯ãã®ãœãŒã¹ã³ãŒãã¯ãã¢ã¯ã»ã¹å¯èœã§ãããå®éã®äœæ¥ã®æºåãã§ããŠããŸãããããããåãªããããã¿ã€ããšæåã®ã¢ã«ãã¡ããŒãžã§ã³ã§ãã ãŸã æé©åãããŠããªãå ŽæãZend_Queueã®ããŒã¹ãªã©ãããŸããŸãªããã¥ã¡ã³ãããŸã ãããŸããããããã®ã€ã³ã¿ãŒãã§ã€ã¹ã«ã¯ãäžå®å šã«èãåºãããäœæ¥ãšããŒã¿æ§é ã®ã¢ã«ãŽãªãºã ããããŸãïŒããšãã°ãdeleteMessageã«ã¯ããã£ãã«ãµãŒãã¹ãã£ãŒã«ãã«ã¯2ã€ã®ãã©ã¡ãŒã¿ãŒããã¥ãŒåãšã¡ãã»ãŒãžãå¿ èŠã§ãïŒã¡ãã»ãŒãžã«ã¯æ¢ã«åœŒã®ãã¥ãŒã®ååãªã©ããããŸãïŒã ããã«ãããããããçŸåšã®ã³ãŒãã¯ãã§ã«çµæã瀺ããŠãããåäœããŠãããå®éšã«é©ããŠããŸãã
çŸåšããã©ãŒãã³ã¹ã«ã€ããŠè©±ãããšãæ¬åœã«äžå¯èœã§ãããAmazon EC2ã¹ã¢ãŒã«ã€ã³ã¹ã¿ã³ã¹ïŒ32ããããDebianãPHP 5.2.11ãRedis 1.1.9ïŒã䜿çšããŠããã€ãã®ãã¹ããå®æœããŸãããã©ã³ãã ãã¥ãŒïŒ1000ã®å€æ°ã®ã¡ãã»ãŒãžãéžæçã«èšé²ããã¢ãŒãã®ã·ã³ã°ã«ã¹ã¬ãããµãŒããŒã¡ãã»ãŒãžããã³åããã100ïŒã¯ã1ç§ããã1500-3000ã¡ãã»ãŒãžå ã®é床ã瀺ããŸãïŒèšé²ã®ãããä»ã®ã·ã¹ãã ã¯ãŸã ãµãŒããŒäžã§å転ããŠãããããå€åã¯è² è·ã«å€§ããäŸåããŸãããŸãããã®ã¢ãŒãã§ã¯Redisèªäœã®ä¿åééãèšå®ããããããéåžžã«ææã§ãïŒ
åã¯ã©ã€ã¢ã³ããå°æ°ã®ã¡ãã»ãŒãžãš1ã€ã®ãã¥ãŒã§åäœããããå€æ°ã®äžŠåã¯ã©ã€ã¢ã³ããããå ŽåãååãšããŠã ãã®æ§æã®ãã¹ãã«ãããš ãåŒãåºãå¯èœãªæ倧å€ïŒ1ç§ããã5ãã7åã¡ãã»ãŒãžããã¹ããšãµãŒããŒãåããã·ã³äžã«ããå ŽåïŒã ãã«ãã¹ã¬ããã䜿çšããŠãRedisãå¥ã®ãµãŒããŒã«ç§»åãããµãŒããŒãå¯èœãªéãä»ã®ã¿ã¹ã¯ããã¢ã³ããŒãããããšã§ããã倧ããªçµæãåŸãããšãã§ããŸããããã«ãããã©ãŒãã³ã¹ã¯ãµãŒããŒã®CPUãã©ã¡ãŒã¿ãŒã«äŸåããŸã-倧ããã€ã³ã¹ã¿ã³ã¹ïŒ2ã³ã¢ãš7 GB RAMïŒã¯ãã§ã«5-6ããéãé床ïŒãã¡ãããããã¯åãªãå¹³åçãªææšã§ãããçŸå®ãšã¯ããé¢ããŠããŸãïŒã
ãããã¯å®éšã§ãã ã¡ãã»ãŒãžãã¥ãŒã®ãããã¯ã¯èå³æ·±ããã®ã§ããããšãã°ãä»äºã§ZFãç©æ¥µçã«äœ¿çšããŠããéçºè ã§ãã£ãŠããZend_Queueã³ã³ããŒãã³ããšãã®ã¢ããªã±ãŒã·ã§ã³ã«ã€ããŠã»ãšãã©èª°ãç¥ããªããªã©ãããã«èšäºãæžãå¿ èŠããããŸãã ããŠããµãŒããŒã«ã¯å€ãã®æ¹åãšæ¹åããããããããããã¯ãŒã¯ããŒã¢ã³ã«å€ããããŸããŸãªãããã³ã«ïŒããããMQã®æšæºã§ããStompãAMQPïŒã§åäœããç¹å¥ãªãµãŒããŒãæ§ç¯ããããã¯ã°ã©ãŠã³ãä¿åäžã®èŒ»èŒ³ã®ã¬ããªã±ãŒã·ã§ã³ãšã¢ã«ãŠã³ãã£ã³ã°ãèšå®ããããã€ãã®äžŠåãµãŒããŒãªã© ããªãã¯ããã«ã€ããŠèªãã§ã¿ããã§ããïŒ