å€ãã®å Žåã次ã®ãããªè³ªåã«åºããããŸããããããŠã倧èŠæš¡/æå/èåãªITäŒæ¥ã®èª°ãäžè¬ã«å®çšŒåã§Node.jsã䜿çšããŠããŸããïŒã 2012幎1æ19æ¥ã«ãæªåé«ã
Joel Spolskyã«ãã£ãŠèšç«ãããFog Creekã®ããã°ã«
ãThe Trello Tech Stackããšããèšäºãæ²èŒãããŸããã Habrã§ã¯ãã©ããããããç¡èŠãããŠããã®ã¯å¥åŠã§ãã ãããã£ãŠããã®æ¬ ç¹ãä¿®æ£ãããšåæã«ã倧èŠæš¡ãããžã§ã¯ãã§Node.jsã䜿çšããäŸã瀺ãããã«ããã®èšäºã翻蚳ããŸããã
èšäºèªäœã¯éåžžã«èšå€§ã§ããããã2ã€ã®éšåã«åãããŠããŸãã
ããŒã1
- CoffeeScript
- ã客æ§
* Backbone.js
* HTML5 History API
*å£ã²ã - ããã·ã¥ãšããŒãªã³ã°
* Socket.ioããã³WebSockets
* AJAXãªã¯ãšã¹ã
ããŒã2- ãµãŒããŒ
* node.js
* HAProxy
* Redis
* MongoDB - 奜ãã§ããïŒ
trello techã¹ã¿ãã¯
Trelloã®éçºã¯ãTrelloããŒã ã®ãã¶ã€ããŒã§ãã
Justinãš
Bobbyã1é±éã§ãŸãšããHTMLã¬ã€ã¢ãŠãããå§ãŸããŸããã 圌ã®èŠãç®ãšæãã®è¯ãã«é©ããŸããã
ãããšã«ãš
ç§ãTrelloã®ãããã¿ã€ããšå®çšããŒãžã§ã³ãéçºãããããžã§ã¯ã
ã«åå ããåŸããµãŒããŒãšã¯ã©ã€ã¢ã³ããäœæããªããå
ã®ã¬ã€ã¢ãŠãã®çŽ æŽãããå°è±¡ãç¶æããããšãæ¬åœã®èª²é¡ã§ããã
Trelloã®åæã¬ã€ã¢ãŠãããã®ã¬ã€ã¢ãŠãã«ãããã¯ã©ã€ã¢ã³ãåŽã®ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ãäœæããåäžã§ããŒã¿ã®æŽæ°ãåä¿¡ãã1ããŒãžã®Webã¢ããªã±ãŒã·ã§ã³ã«è³ããŸããã ããã¯ã以åãã©ã°ã¯ãªãŒã¯ã§è¡ã£ãäœæ¥ãšã¯å€§ããç°ãªããŸããã ãããã£ãŠãæè¡çãªèŠ³ç¹ãããTrelloã®éçºã¯åéºã§ããã
æåã¯ã[ãããžã§ã¯ã]ãããžã¡ã³ããå¿é
ããåã«ã[ã¢ããªã±ãŒã·ã§ã³]ã®æ§é ãã©ãã»ã©èå³æ·±ãå€æ§ã§ããããé©ãããŸããã
ãžã§ãšã«ãšã®æåã®äŒè°ã§åé¡ã解決ãããŸããã ãã
ã§ããã ç§ãã¡ã¯ãããæçãã代æ¿åãšæ¯èŒããŠé©ãã¹ãäœéšãæäŸããææãªïŒãããŠãã°ãã°åé¡ã®å€ãïŒæè¡ãäžè²«ããŠéžæããŸããã ç§ãã¡ã¯çŽ1幎éãããè¡ã£ãŠããŸããããæ°ã«å
¥ã£ãŠããŸãã
CoffeeScript
Trelloã®éçºã¯ãã¯ã©ã€ã¢ã³ããµã€ããšãµãŒããŒãµã€ãã®äž¡æ¹ã§çŽç²ãªJavaScriptã§å§ãŸãã5æã«ã³ãŒããŒãã¹äžã®ããã€ãã®ãã¡ã€ã«ãå®éšçã«æžãæããŠæ°ã«å
¥ã£ããã©ããã確èªãããŸã§ããã®éãå®ããŸããã ç§ãã¡ã¯æ¬åœã«æ°ã«å
¥ã£ãŠãããããã«æ®ãã®ã³ãŒããæžãçŽããCoffeeScriptã§å®å
šã«éçºãç¶ããŸããã
CoffeeScriptã¯ã
èªã¿ããã JavaScriptã«ã³ã³ãã€ã«ãããèšèªã§ãã Trelloã®éçºãéå§ããæç¹ã§ãã§ã«ååšããŠããŸãããããœãŒã¹ãã¡ã€ã«ãçŽæ¥ãããã°ããã®ã§ã¯ãªããã³ã³ãã€ã«ãããã³ãŒãããããã°ããããšã«ãã£ãŠçããè€éããããã«å¿é
ã§ããã ãã ãããããè©ŠããŠã¿ããšãå€æã¯éåžžã«é«å質ã§ããããšãå€æãããããChromeã§ã®ãããã°äžã«æçµã³ãŒãããœãŒã¹ãã¡ã€ã«ã«ã¬ã³ããªã³ã°ããã®ã«å°ã粟ç¥çãªåŽåãããããŸããã ãŸããCoffeeScriptã䜿çšãããšãã®ã³ãŒãã®ç°¡æœããšèªã¿ãããã«ããã¡ãªããã¯æããã§ã説åŸåããããŸããã
JavaScriptã¯ã¯ãŒã«ãªèšèªã§ãã ããæžãããCoffeeScriptã¯ãåãã»ãã³ãã£ã¯ã¹ãç¶æããªãããJavaScriptãã¹ã ãŒãºã«ããŠççž®ãããããã°ã«é倧ãªåé¡ãæã¡èŸŒã¿ãŸããã
ã客æ§
æ¬è³ªçã«ãTrelloãµãŒããŒã¯HTMLã§ã¯æ©èœããŸããã å®éã圌ãã¯å€ãã®ã¯ã©ã€ã¢ã³ãã³ãŒããå®è¡ããŸããã TrelloããŒãžã¯ããµãŒããŒããã¯ã©ã€ã¢ã³ãã¢ããªã±ãŒã·ã§ã³ã1ã€ã®æå°åããã³å§çž®ãããJSãã¡ã€ã«ïŒãµãŒãããŒãã£ã©ã€ãã©ãªãšã³ã³ãã€ã«æžã¿ã®CoffeeScriptãã¡ã€ã«ãšMustacheãã³ãã¬ãŒããå«ãïŒãšããŠããŠã³ããŒããã軜éïŒ2KiBïŒã·ã³ã·ã§ã«ãš1ã€ã®CSSãã¡ã€ã«ïŒ
LESSãã¡ã€ã«ãšåã蟌ã¿ïŒã€ã³ã©ã€ã³ïŒç»åãå«ãïŒã å¿
èŠãªã®ã¯250KiBæªæºã§ãAmazonã®
CloudFront CDNãšå
±æããŠããŸãã ãã®ããã«ããŠãã»ãšãã©ã®ãŠãŒã¶ãŒã«äœé
延ã®ããŠã³ããŒããæäŸããŸãã ããªãé«éãªæ¥ç¶ïŒé«åž¯åå¹
ïŒã®å Žåããã©ãŠã¶ãŠã£ã³ããŠã§çŽ0.5ç§ã§ã¢ããªã±ãŒã·ã§ã³ã®ããŠã³ããŒããšèµ·åãè¡ãããŸãã ãã£ãã·ã¥ã®æ©æµãåãããããTrelloãžã®ä»¥éã®ã¢ã¯ã»ã¹ã§ã¯ããã®éšå[ããŠã³ããŒã]ã¯ã¹ããããããŸãã
åæã«ãéå§ããŒãžããAJAXãä»ããããŒã¿ã®ããŒããåé€ãããµãŒããŒãžã®
WebSocketæ¥ç¶ã確ç«ããããšããŠããŸãã
Backbone.js
ããŒã¿ãå«ãå¿çãå°çãããšãBackbone.jsãåäœãéå§ããŸãã Backboneã®ã¢ã€ãã¢ã¯ãïŒViewïŒã䜿çšããŠãµãŒããŒããåä¿¡ããåã¢ãã«ã衚瀺ããããšã§ãããBackboneã¯æ¬¡ã®ç°¡åãªæ¹æ³ãæäŸããŸãã
- ãã¥ãŒã«ãã£ãŠäœæãããHTMLã®DOMã€ãã³ãã远跡ãããããããµãŒããŒãšåæããã¢ãã«ã®ãã³ãã©ãŒã«ãã€ã³ãããŸãã
- ã¢ãã«ã®å€æŽã远跡ããå€æŽãããHTMLãããã¯ã衚瀺ããŸãã
åªé
ã«ïŒ ãã®ã¢ãããŒãã䜿çšããŠãéåžžã®ãç解å¯èœã§ãµããŒããããŠããã¯ã©ã€ã¢ã³ãã¢ããªã±ãŒã·ã§ã³ãååŸããŸãã ç¹ã«ãã¯ã©ã€ã¢ã³ãåŽã®ã¢ãã«ãã£ãã·ã¥ãæ§ç¯ããŠãæŽæ°ãåŠçããã¢ãã«ã®ã¯ã©ã€ã¢ã³ãåŽã®åå©çšãç°¡çŽ åããŸãã
History.pushState
ã¯ã©ã€ã¢ã³ãã¢ããªã±ãŒã·ã§ã³å
šäœããã©ãŠã¶ãŠã£ã³ããŠã«èªã¿èŸŒãŸããã®ã§ãããŒãžéã移åããæéãç¡é§ã«ããããããŸããã HTML 5 History.pushStateã€ã³ã¿ãŒãã§ã€ã¹ã¡ãœããã䜿çšããŠãããŒãžéã移åããŸãã ãã®ããã«ããŠããã±ãŒã·ã§ã³ããŒ[ãã©ãŠã¶èŠçŽ ]ã«æ£ç¢ºã§äžè²«æ§ã®ãããªã³ã¯ãæäŸãã移è¡æã«ãåã«ããŒã¿ãããŒãããBackboneã«åºã¥ããŠé©åãªã³ã³ãããŒã©ã«è»¢éããŸãã
å£ã²ã
ã¢ãã«ãHTMLã§è¡šç€ºããã«ã¯ãMustacheïŒè«çæ§é ãæå°éã«äœ¿çšãããã³ãã¬ãŒãèšèªïŒã䜿çšããŸãã ã[substitute_here_your_name]ãã³ãã¬ãŒãã®å
šæ©èœã䜿çšãããããšã¯è¯ãããšã®ããã«èãããŸãããå®éã«ã¯ãæ確ãªã³ãŒããç¶æããããã«éçºè
ããã®å³ããèšç·Žãå¿
èŠã§ããããšãããããŸãã Moustacheã®ãç°¡æœãã¯æèœã®å§åŠ¹ãã¢ãããŒãã«éåžžã«æºè¶³ããŠããŸããããã«ããããã³ãã¬ãŒãã³ãŒããã¯ã©ã€ã¢ã³ãããžãã¯ãšæ··åããŠæ··ä¹±ãæãããšãªãåå©çšã§ããŸãã
ããã·ã¥ãšããŒãªã³ã°
ãªã¢ã«ã¿ã€ã æŽæ°ã¯æ°ãããã®ã§ã¯ãããŸããããã³ã©ãã¬ãŒã·ã§ã³ããŒã«ãäœæããéã«éèŠãªéšåã§ãããããTrelloã®ãã®éšåã«æéãè²»ãããŸããã
Socket.ioãšWebSockets
ããããµããŒããããã©ãŠã¶ãŒã§ã¯ãWebSocketæ¥ç¶ã䜿çšããŠããµãŒããŒãä»ã®ãŠãŒã¶ãŒãè¡ã£ãå€æŽã察å¿ãããã£ã³ãã«ããªãã¹ã³ããŠãããã©ãŠã¶ãŒã«ããã·ã¥ããããã«ããŸããã ä¿®æ£ããã
ïŒ*ïŒ Socket.ioã¯ã©ã€ã¢ã³ãããã³ãµãŒããŒã©ã€ãã©ãªã䜿çšããŸããããã«ãããCPUãšã¡ã¢ãªã®äœ¿çšéãæå°éã«æããªãããåãµãŒããŒã§äœåãã®WebSocketæ¥ç¶ãéãããŸãŸã«ããããšãã§ããŸãã ãããã£ãŠã芳å¯ããŠããããŒã[TrelloèŠçŽ ]ã§äœããã®ã¢ã¯ã·ã§ã³ãçºçãããšããã®ã¢ã¯ã·ã§ã³ã¯ãµãŒããŒäžã®ããã»ã¹ã«è»¢éãããéåžž1ç§æªæºã®æå°é
延ã§ãã©ãŠã¶ãŒã«é
ä¿¡ãããŸãã
ïŒ*ïŒçŸåšãSocket.ioãµãŒããŒã«ã¯ãè€æ°ã®ããã»ã¹ãšRedisã¹ãã¬ãŒãžã䜿çšããå Žåã«ãã¯ã©ã€ã¢ã³ããšã®åææ¥ç¶ã10K以äžã«æ¡å€§ããåé¡ããããŸãã ãŸããã¯ã©ã€ã¢ã³ãã«ã¯ãåããµãŒããŒãžã®è€æ°ã®æ¥ç¶ãéãããããæ¥ç¶ãæäŸãããŠããããšãã¯ã©ã€ã¢ã³ããå€æã§ããªããšããåé¡ãçºçããå¯èœæ§ããããšããåé¡ããããŸãã ãããžã§ã¯ãã«æ»ã£ãŠãå€æŽãå ããéã«ããã€ãã®åé¡ããããŸãïŒããã¯ïŒïŒãå€ãã®å ŽåãWebSocketsïŒäœ¿çšããå¯äžã®Socket.ioãã©ã³ã¹ããŒãïŒã§ã®ã¿åäœããŸãã ãããžã§ã¯ãã«æ»ãããã«ãäžè¬çãªäœ¿çšã«é©ããå€æŽã«åãçµãã§ããŸããAJAXãªã¯ãšã¹ã
è€éã§ã¯ãããŸããããæ©èœããŸãã
建ç¯ã®åæã¹ã±ããããã©ãŠã¶ãŒãWebSocketsïŒhiãIEïŒããµããŒãããŠããªãå ŽåããŠãŒã¶ãŒãã¢ã¯ãã£ããªéã¯æ°ç§ããšã«å°ããªAJAXå€æŽèŠæ±ãè¡ãããŠãŒã¶ãŒãã¢ã€ãã«ç¶æ
ã«ãªããšãã®ééã10ç§ã«æžãããŸãã ãµãŒããŒã®èšå®ã«ãããHTTPSãªã¯ãšã¹ããæå°éã®ãªãŒããŒãããã§åŠçããTCPæ¥ç¶ãéãããŸãŸã«ããããšãã§ãããããå¿
èŠã«å¿ããŠç°¡åãªãªã¯ãšã¹ãã䜿çšããçµéšãå
±æã§ããŸãã
Socket.ioã®äœã¬ãã«ã®ãã©ã³ã¹ããŒãã䜿çšããŠCometãè©ŠããŸãããããããã«ããŠããããã¯ãã¹ãŠäžå®å®ã§ããã ããã«ãCometãšWebSocketãã¢ãââãªã±ãŒã·ã§ã³ã®äž»ãªæ©èœã®åºç€ãšããŠäœ¿çšããã®ã¯å±éºãªããã§ãã åé¡ã«åºããããå ŽåãæãåçŽã§æã確ç«ãããæè¡ã«æ»ããããã«ãããã£ãã®ã§ãã
ç«ã¡äžãçŽåŸã«åé¡ã«ééããŸããã WebSocketãµãŒããŒã®å®è£
ã¯ã
TechCranchå¹æã«ããçªç¶ã®å€§ããªè² è·ã®äžã§å¥åŠã«åäœãå§ããŸãããã¢ã¯ãã£ããã£äžããã³éã¢ã¯ãã£ããã£äžã«ãªã¯ãšã¹ãééãèšå®ããããšã§ãåçŽãªãªã¯ãšã¹ãã«æ»ãããµãŒããŒã®ããã©ãŒãã³ã¹ã調æŽã§ããããšãå¬ããæããŸããã ããã«ããã1é±éã§ãŠãŒã¶ãŒæ°ã300ãã50,000ã«å¢ãããšãã«ããã©ãŒãã³ã¹ãã¹ã ãŒãºã«äœäžãããããšãã§ããŸãããä»ã§ã¯WebSocketã䜿çšããããã«ãªããŸããããçããªã¯ãšã¹ãã®äœæ¥ã·ã¹ãã ããããŸãã
ç¶è¡ããã«ã¯...