èšäºèªäœã¯éåžžã«èšå€§ã§ããããã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ãã¹ã ãŒãºã«ããŠççž®ãããããã°ã«é倧ãªåé¡ãæã¡èŸŒã¿ãŸããã
ã客æ§
- Backbone.js ïŒMVCãã¬ãŒã ã¯ãŒã¯ïŒ
- HTML 5 ïŒå±¥æŽAPIïŒpushStateïŒ
- å£ã²ã ïŒãã³ãã¬ãŒãïŒ
æ¬è³ªçã«ã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ã䜿çšããããã«ãªããŸããããçããªã¯ãšã¹ãã®äœæ¥ã·ã¹ãã ããããŸãã
ç¶è¡ããã«ã¯...