æ°ãæåãç§ã¯ãªãŒãã³ãœãŒã¹ã®Centrifugeãããžã§ã¯ãã«ã€ããŠèšè¿°ããHabréã®èšäºãå ¬éããŸããã ããã¯ãæ¥ç¶ãããŠããã¯ã©ã€ã¢ã³ãã«ïŒäž»ã«Webãã©ãŠã¶ãŒããïŒã¡ãã»ãŒãžããªã¢ã«ã¿ã€ã ã§éä¿¡ãããµãŒããŒã§ããããšãæãåºãããŠãã ããã Pythonã§æžãããŠããŸãã
ãã以æ¥ãç§ã¯èªç±ãªæéã«ãããžã§ã¯ãã«åãçµã¿ç¶ããèç©ããç§ã®èããå€æŽãå ±æããæºåãã§ããŸããã
åœåãé å¿åé¢æ©ã¯ãªãªãžãã«ã®ãããžã§ã¯ãã§ããã æ¢åã®ã¢ããã°ã®æ©èœãåçŸããããšã«ã€ããŠããŸãå¿é ããããšãªããç§ã¯èªåã«ãšã£ãŠæ£ãããšæãããã³ãŒããæžããŸããã ãã®çµæãã¡ãã»ãŒãžã顧客ã«é ä¿¡ããããã¹ãŠãæ©èœããŸããããïŒ ããããã¹ãŠäœ¿çšããã®ã¯äŸ¿å©ã§ãããïŒ ããïŒ
6æäžæ¬ã Serge Kovalã«ãããã°ãããèšäºïŒ Pythonããã³ãªã¢ã«ã¿ã€ã Web ïŒã«åºäŒããŸããã é©ããããšã«ããã®æç¹ã§ç§ã¯ãã§ã€ã®ååšã«ã€ããŠç¥ããŸããã§ããã ãã®èšäºã¯ããã®çŽ æŽããããããžã§ã¯ããšãçŸåšã®ç¶æ ã®Centrifugeããªã¢ã«ã¿ã€ã ã®Webã¢ããªã±ãŒã·ã§ã³ãéçºããéã®ç掻ãå€§å¹ ã«ç°¡çŽ åããªããšããäºå®ã®ç解ããããããŸããã
ãã以æ¥ãç§ã¯ãŠãŒã¶ããªãã£ãŒã«ç®ãåã ã pusher.com ã pubnub.comããã³Fayeã«ç®ãåããŠé å¿åé¢æ©ãèµ·èããŠããŸããã
ããæçããé«åºŠãªã¢ããã°ããã§ã«ååšããå ŽåããªããŒãããã³ãŒããèšè¿°ããå¿ èŠãããã®ãââãšããçåã¯é¿ããããŸããã ããã€ãã®çç±ããããŸãã
- ããã¯é¢çœãã§ãã ãã®ãããžã§ã¯ãã§ã¯çŸåšãTornadoãZeroMQãRedisãSockJSãBootstrap 3ã䜿çšããŠããŸãã
- Pusher.comãšPubnub.comã¯ã¯ã©ãŠããµãŒãã¹ã§ããåžžã«å¯èœã§ãããšã¯éããŸãã/ is_sense /ãµãŒãããŒãã£ã«äŸåãããã§ãã ãµãŒããŒåŽã«å€æŽãå ããããšãã§ããŸããã
- Pythonã«é¡äŒŒç©ã¯èŠã€ãããŸããã§ããïŒããããç¥ã£ãŠããŸããïŒïŒãFayeããã¯ãšã³ãã¯RubyãŸãã¯NodeJSã§ãã ãã£ã³ãã«ã®ãµãã¹ã¯ãªãã·ã§ã³ãæ¿èªããã«ã¯ããããã®èšèªã§æ¡åŒµæ©èœãäœæããå¿ èŠããããŸãã Webã¢ããªã±ãŒã·ã§ã³ã®ããã¯ãšã³ãèšèªããããç¬ç«ãããœãªã¥ãŒã·ã§ã³ãäœæããŠãå¿ èŠãªæ©èœãããã«äœ¿çšã§ããããã«ãããã£ãã®ã§ãã
- ã¢ããã°ã«ã¯ãªãæ©èœã ããã¯ããã£ãã«ã®åäœã決å®ããåå空éã®ååšã§ãã ãããžã§ã¯ãããã®èšå®ãããã³ãã£ãã«å ã®ã¡ãã»ãŒãžããªã¢ã«ã¿ã€ã ã§ç£èŠããæ©èœã管çããããã®Webã€ã³ã¿ãŒãã§ã€ã¹ã
次ã«ãé å¿åé¢æ©ã«é¢ããåã®èšäºã®å·ç以éã«çºçããå€æŽã«ã€ããŠèª¬æããŸãã
ãããžã§ã¯ããåå空éãããã³ãã®èšå®ã®æ§é ã¯ãæšæºã®Pythonã©ã€ãã©ãªã®äžéšã§ããããŒã¿ããŒã¹ã§ããSQLiteã«ããã©ã«ãã§ä¿åãããããã«ãªããŸããã ãããã£ãŠã1å°ã®ãã·ã³ã§Centrifugeããã»ã¹ãéå§ãããšãã以åã®ããã«PostgreSQLãŸãã¯MongoDBãã€ã³ã¹ããŒã«ããå¿ èŠã¯ãªããªããŸããã é å¿åé¢æ©ã¯äžå°èŠæš¡ã®ãããžã§ã¯ãã§äœ¿çšããããã«èšèšãããŠããããã1å°ã®ãã·ã³ã§ååãªã¯ããªã®ã§ãããã¯éèŠãã€å¿ èŠãªå€æŽã ãšæããŸãã
å°ãå ã«é²ãã§ãæ§æãã¡ã€ã«ã«èšè¿°ãããŠããæ§é ã§é å¿åé¢æ©ãèµ·åããŸãã åæã«ãWebã€ã³ã¿ãŒãã§ã€ã¹ããåçã«å€æŽãè¡ã£ãŠä¿åããæ©èœã¯å€±ãããŸãããå€éšã¹ãã¬ãŒãžãžã®äŸåé¢ä¿ã¯ãããŸããã ãã®æ©èœã¯ãéçºã«ãéåžžã«åœ¹ç«ã¡ãŸãã
ãã¬ãŒã³ã¹ãšå±¥æŽã®ãµããŒããç»å ŽããŸãã-çŸåšããã£ã³ãã«ã«çŸåšæ¥ç¶ããŠãããŠãŒã¶ãŒãèŠã€ãããããã£ã³ãã«ã«éä¿¡ãããææ°ã®ã¡ãã»ãŒãžãåä¿¡ãããã§ããŸãã Redisã¯ãã®ããŒã¿ãä¿åããããã«äœ¿çšãããŸãã Redisãæ§æãããŠããªãå Žåãã¯ã©ã€ã¢ã³ãã¯ããŒã¿ã䜿çšã§ããªããªããäœãå£ããŸããã
質åã§ãã çŸåšãCentrifugeã¯ããã»ã¹ã®ããã€ãã®éã®éä¿¡ã«ZeroMQ PUB / SUBãœã±ããã䜿çšããŠããŸãã ãããããRedisã¯æ¥ç¶ãããã¯ã©ã€ã¢ã³ããšã¡ãã»ãŒãžå±¥æŽã«é¢ããæ å ±ã®ãªããžããªãšããŠã²ãŒã ã«åå ¥ãããããZeroMQã®ä»£ããã«Centrifugeããã»ã¹éã®éä¿¡ã«PUB / SUBæ©èœã䜿çšãã䟡å€ããããŸããïŒ ç§ãèŠãå¯äžã®ãã³ãããŒã¯ã§ã¯ãZeroMQã¯Redisãããããã©ãŒãã³ã¹ãåªããŠããŸãã
ãããã£ãŠãçŸæç¹ã§ã¯ãã¹ãŠããã®ãŸãŸã«ããŠãããŸããã ãã ããããã¯ç©è°ãéžãéèŠãªãã€ã³ãã§ãã
ä»ã§ããã¯ã©ã€ã¢ã³ãããã£ãã«ã«æ¥ç¶ïŒåæïŒããïŒãã£ãã«ããïŒã¡ãã»ãŒãžãåä¿¡ã§ããŸãã ããŠããªããšã
æåŸã«ãããããæãéèŠãªããš-javascriptã¯ã©ã€ã¢ã³ããç»å ŽããŸãã-Centrifugeãããã³ã«ã®ã©ãããŒã§ãã Oliver Caldwellã«ãã£ãŠæžãããEvent Emitterã«åºã¥ããŠããŸãã çŸåšããã©ãŠã¶ããã®é å¿åé¢æ©ãšã®å¯Ÿè©±ã¯éåžžã«ç°¡åã§ãã ãã®ãããªãã®ïŒ
var centrifuge = new Centrifuge ïŒ {
//èªèšŒèšå®
} ïŒ ;
é å¿åé¢æ©ã on ïŒ 'connect' ã é¢æ° ïŒ ïŒ {
//確ç«ãããé å¿åé¢æ©ãžã®æ¥ç¶
varãµãã¹ã¯ãªãã·ã§ã³=é å¿åé¢æ©ã subscribe ïŒ 'pythonïŒdjango' ã function ïŒ message ïŒ {
//ãã£ãã«ããæ°ããã¡ãã»ãŒãžãåä¿¡ãããšãã«åŒã³åºãããé¢æ°
} ïŒ ;
ãµãã¹ã¯ãªãã·ã§ã³ã on ïŒ 'ready' ã é¢æ° ïŒ ïŒ {
ãµãã¹ã¯ãªãã·ã§ã³ã ååš ïŒ é¢æ° ïŒã¡ãã»ãŒãžïŒ {
//ãã£ãã«ã«æ¥ç¶ããŠããã¯ã©ã€ã¢ã³ãã«é¢ããæ å ±ãåãåããŸãã
} ïŒ ;
ãµãã¹ã¯ãªãã·ã§ã³ã å±¥æŽ ïŒ é¢æ° ïŒã¡ãã»ãŒãžïŒ {
//ææ°ã®ãã£ã³ãã«æçš¿ã®å±¥æŽ
} ïŒ ;
ãµãã¹ã¯ãªãã·ã§ã³ã on ïŒ 'join' ã function ïŒã¡ãã»ãŒãžïŒ {
//æ°ããã¯ã©ã€ã¢ã³ãããã£ãã«ã«æ¥ç¶ãããšãã«åŒã³åºãããŸã
} ïŒ ;
ãµãã¹ã¯ãªãã·ã§ã³ã on ïŒ 'leave' ã function ïŒã¡ãã»ãŒãžïŒ {
//ã¯ã©ã€ã¢ã³ãããã£ãã«ããåæãããšåŒã³åºãããŸã
} ïŒ ;
} ïŒ ;
} ïŒ ;
é å¿åé¢æ©ã on ïŒ 'disconnect' ã é¢æ° ïŒ ïŒ {
//é å¿åé¢æ©ãžã®æ¥ç¶ã倱ãããŸã
} ïŒ ;
é å¿åé¢æ©ã æ¥ç¶ ïŒ ïŒ ;
ãã®äŸã§ã¯ãèªèšŒèšå®ã¯è¹å€ã«æ®ãããŠããŸãïŒãããã«ã€ããŠã¯ããã¥ã¡ã³ãã§ç¢ºèªã§ããŸã ïŒã ãŸãããã£ãã«ã®ååã«ã泚æããŠãã ãããããã¯ãæ¥ç¶ããåã«ç®¡çã€ã³ã¿ãŒãã§ãŒã¹ã§äœæããå¿ èŠãããããŒã ã¹ããŒã¹åã§æ§æãããŸãããã®å Žåã¯
python
ã§ãã ãã£ã³ãã«åèªäœã¯åŸã«ç€ºãããŸã-ãã®å Žåãããã¯
django
ã§ãã åå空éã¯ãããã«å±ãããã¹ãŠã®ãã£ãã«ã®èšå®ã決å®ããŸãã ãããžã§ã¯ãã®èšå®ã§ã¯ãããã©ã«ãã®ããŒã ã¹ããŒã¹ãéžæã§ããŸããJavaScriptã³ãŒãã§ã¯ãããŒã ã¹ããŒã¹ã®ååãæ瀺çã«æå®ã§ããŸããã ã€ãŸããpythonåå空éããããžã§ã¯ãã®ããã©ã«ãã§ããå Žåã次ã®ããã«èšè¿°ã§ããŸãã
é å¿åé¢æ©ã on ïŒ 'connect' ã é¢æ° ïŒ ïŒ {
varãµãã¹ã¯ãªãã·ã§ã³=é å¿åé¢æ©ã subscribe ïŒ 'django' ã function ïŒ message ïŒ {
ã³ã³ãœãŒã«ã ãã° ïŒã¡ãã»ãŒãžïŒ ;
} ïŒ ;
} ïŒ ;
ãã®çš®ã®ã¢ããªã±ãŒã·ã§ã³ã§ã®èªå¯ã¯ãããããæãé£ããéšåã§ãã åè¿°ããããã«ãFayeã¯ç¹å®ã®ãã£ãã«ãžã®ã¢ã¯ã»ã¹ãä¿è·ããããã«NodeJSãŸãã¯Rubyã§æ¡åŒµæ©èœãèšè¿°ããå¿ èŠããããŸãã ãã©ã€ããŒããã£ã³ãã«ã®Pusher.comã¯ã次ã®ã¹ããŒã ãæäŸããŸãã
ãã©ã€ããŒããã£ãã«ã«ãµãã¹ã¯ã©ã€ãããããšãããšãAJAXèŠæ±ããã£ãã«åãšãšãã«ã¢ããªã±ãŒã·ã§ã³ã®ããã¯ãšã³ãã«éä¿¡ãããŸãã ã¢ã¯ã»ã¹ãèš±å¯ãããŠããå Žåã¯ã眲åä»ãã®å¿çãè¿ãå¿ èŠããããŸããå¿çã¯ããã£ã³ãã«åãšãšãã«ããã·ã£ãŒã«çŽæ¥éä¿¡ãããŸãã ããã§ã®å©ç¹ã¯ãã»ãšãã©ã®å ŽåãAJAXãªã¯ãšã¹ããåä¿¡ããæç¹ã®ã¢ããªã±ãŒã·ã§ã³ã«çŸåšã®ãŠãŒã¶ãŒã®ãªããžã§ã¯ããæ¢ã«å«ãŸããŠããããšã§ãïŒããšãã°ãDjangoã§ã¯
request.user
ïŒã
é å¿åé¢æ©ã®ã¢ãããŒãã¯å°ãç°ãªããŸãã çŸåšã®ãŠãŒã¶ãŒã®èå¥åã¯ãæ¥ç¶æã«1åéä¿¡ãããŸãããããžã§ã¯ãIDãšããŒã¯ã³ãšãšãã«javascriptã¯ã©ã€ã¢ã³ããæ§æãããšãã«æå®ããŸãã ããŒã¯ã³ã¯ããããžã§ã¯ãã®ç§å¯éµïŒã¢ããªã±ãŒã·ã§ã³ã®ããã¯ãšã³ãã®ã¿ãç¥ãå¿ èŠãããïŒããããžã§ã¯ãIDãããã³ãŠãŒã¶ãŒIDã«åºã¥ããŠçæãããHMACã§ãã ããŒã¯ã³ã¯ãéä¿¡ããããããžã§ã¯ãIDãšãŠãŒã¶ãŒIDã®æ£åœæ§ãæ€èšŒããããã«å¿ èŠã§ãã å°æ¥çã«ã¯ããã©ã€ããŒããã£ãã«ã«ãµãã¹ã¯ã©ã€ããããšãã«ãCentrifugeã¯æååã®ãŠãŒã¶ãŒIDãåå空éåãããã³ãã£ãã«åã䜿çšããŠã¢ããªã±ãŒã·ã§ã³ã«POSTãªã¯ãšã¹ããéä¿¡ããŸãã ãããã£ãŠãæ¿èªãã³ãã©ãŒé¢æ°ã§æåã«è¡ãããšã¯ãIDã«ãã£ãŠãŠãŒã¶ãŒãªããžã§ã¯ããååŸããå¿ èŠãããããšã§ãã
æ¿èªã«é¢ãããã1ã€ã®éèŠãªç¹ã¯ãè€æ°ã®ãã£ãã«ã«ãµãã¹ã¯ã©ã€ãããããã«ãã¯ã©ã€ã¢ã³ãåŽã§
subscribe
æ©èœãæ°ååŒã³åºãå¿ èŠãããããšã§ãã ãã£ãã«ããã©ã€ããŒãã§ããå Žåããã®ãããªåãµãã¹ã¯ãªãã·ã§ã³ã¯ã¢ããªã±ãŒã·ã§ã³ãžã®POSTãªã¯ãšã¹ãã«ã€ãªãããŸãã æ¹åãããåäœãæé©åãããŠããŸããã ããããåãpusher.comã¯ããã®ãããªã±ãŒã¹ã¯ãŸãã§ã¯ããã顧客ã®èŠä»¶ã®1ã€ã§ãããšèªèããŠããããŸã ãã®åé¡ãå®å šã«ã¯è§£æ±ºããŠããŸããã ããã§ç§ã¯ãŸã æ£ãã解決çãæ¢ããŠããŸãã
誰ããã£ã³ã»ã«ããŠããªããã©ã€ããŒãããŒã¿ãä¿è·ããå¥ã®æ¹æ³ã«æ³šç®ããããšæããŸãã ããšãã°ãã¢ããªã±ãŒã·ã§ã³ãŠãŒã¶ãŒããšã«åå¥ã®ãã©ã€ããŒããã£ãã«ãäœæããã«ã¯ãç§å¯ããŒãšãŠãŒã¶ãŒIDã«åºã¥ããŠæšæž¬ãã«ãããã£ãã«åãçæã§ããŸãã ãã®å Žåãå°ãªããšãããªãã®é¡§å®¢ããã©ã€ããŒããã£ã³ãã«ã®ååãå ±æããå©çããããããªãéããè¿œå ã®èš±å¯ãªãã§è¡ãããšã¯ããªãå¯èœã§ã:)
ãã£ã³ãã«ã«æçš¿ããåã«ãã«ã¹ã¿ã ã®éåæé¢æ°ïŒãã«ããŒããã³ã¬ãŒã¿
@coroutine
ãã¬ãŒã åïŒãè¿œå ããããšãã§ããŸãã ãã®é¢æ°å ã§ã¯ãNoneãè¿ããªã©ãã¡ãã»ãŒãžã«å¯ŸããŠäœã§ãã§ããŸããããã«ãããã¡ãã»ãŒãžã®çºè¡ããã£ã³ã»ã«ããŸãã ãã ããå ¬éåŸã«åŒã³åºããããã³ãã©ãŒãè¿œå ããåæ§ã®æ©äŒããããããããããããã¯èª°ã«ãšã£ãŠãã»ãšãã©åœ¹ã«ç«ã¡ãŸããã ããã¯ããªãäœã¬ãã«ã®ä»å ¥ã§ãããPythonãšTornadoã®ç¥èãå¿ èŠã§ãã
æãåçŽãªå Žåã®é å¿åé¢æ©ã®ã€ã³ã¹ããŒã«ã¯ãvirtualenvå ã®1ã€ã®
pip install centrifuge
ã³ãã³ãã«ãªããŸãã ãã ããZeroMQïŒlibzmq3ïŒãšPostgreSQLã®devããã±ãŒãžããã·ã³ã«ã€ã³ã¹ããŒã«ããå¿ èŠããããŸãïŒPostgreSQLãµãŒããŒèªäœã¯ãªãã·ã§ã³ã§ãïŒã PYPIããã®ã€ã³ã¹ããŒã«äžã«çºçããå¯èœæ§ã®ããåé¡ãšãã®è§£æ±ºæ¹æ³ã«ã€ããŠã¯ãããã¥ã¡ã³ãã«èšèŒãããŠããŸã ã 1ã€ã®ããã»ã¹ã¯ã
centrifuge
ã³ãã³ãã«ãã£ãŠ
centrifuge
ãããŸãã ãã ããæŠéç°å¢ãå®è¡ããã«ã¯ãéèŠãªã»ãã¥ãªãã£èšå®ãå«ãŸããŠãããããæ§æãã¡ã€ã«ãå¿ èŠã§ãã ãŸããè€æ°ã®ããã»ã¹ãéå§ããå Žåã¯ãè¿œå ã®ã³ãã³ãã©ã€ã³ãªãã·ã§ã³ã䜿çšããã«å®è¡ããããšã¯ã§ããŸããã
ããã¥ã¡ã³ãã®ãã®ã»ã¯ã·ã§ã³ã§ã¯ ãCentrifugeã®ä»çµã¿ãèµ·åãªãã·ã§ã³ããã©ãŠã¶ããæ¥ç¶ãããšãã«æå®ããã¢ãã¬ã¹ãªã©ãå¯èœãªéã詳现ã«èª¬æããããšããŸããã è±èªã§ãæ¬åœã«ã
ãŸã è² è·ãã¹ããå®è¡ããŠããŸããã ç§ã¯ããã«ãã³ãããŒã¯ã«å ¥ãããšãæã¿ãŸãã ãã§ã€ãšæ¯èŒããã®ã¯é¢çœãã§ããPYPYã§ããŒã³ãããã®ã¯é¢çœãã§ãã ãã¡ãããããããçš®é¡ã®ãšã©ãŒèæ§ã«åãçµã¿ç¶ããPythonã³ãŒããšjavascriptã¯ã©ã€ã¢ã³ããæ¹åããå¿ èŠããããŸãã ä»ããåå ãããïŒ
ãæž èŽããããšãããããŸããïŒ