- ããŒã1
- ããŒã2
- ããŒã3
- ããŒã4
æ°é±éåãç§ã¯ããGoã§ã®ã¿å¥ã®Webã¢ããªã±ãŒã·ã§ã³ã®éçºãå§ããŸããã äž»ã«ããã¯ãšã³ãéçºè ã§ãããããWebã¢ããªã±ãŒã·ã§ã³å šäœãäœæããããšã¯ããŸããªãã£ãã®ã§ããã®ãããªã±ãŒã¹ã¯ããããææŠã®ããã§ããã ãã®ãããªç¬éã«ãåªãããã¶ã€ã³ã®è€éããäžæ¥äžæãäžããæ©äŒã¯ãªããã倧éšãããã«æ©èœããæ©èœçãªãŠã§ããµã€ããäœæããã ãã®äººã®ããã«ããŠã§ãéçºã¬ã€ããæžããŠã»ããã
ç§ã¯ãã®æ©äŒãå©çšããŠã2017幎ã«è¡ãããã¹ãæ¹æ³ã§Webã¢ããªã±ãŒã·ã§ã³ããŒãããå§ããããã®ã¬ã€ããäœæããããšã«ããŸããïŒç§ã®ç解ã§ã¯ïŒã 以åã¯é¿ããŠãããã®ãæãäžããã®ã«äœæéãè²»ãããŸããããããã¯é·å¹Žã«å°ãªããšãäžåºŠã¯ããã®åé¡ã«ã€ããŠèªåã®æèŠãšçµéšãæã£ãŠãããšèªä¿¡ãæã£ãŠèšããããã«ãªããèªåã®ããã®å®çšçãªã¬ã·ããæã«å ¥ããããšãã§ããããã§ããããã¯ç§ã ãã§ãªã圹ã«ç«ã€ãããããŸããã
ãã®èšäºã¯ãç§ããã®éçšã§åŠãã ããšãã«ããŒããçãã·ãªãŒãºããå§ãŸããŸãã ãã®æåã®æçš¿ã¯ãçŸç¶ãåé¡ãããã³Goãé©åãªéžæè¢ã§ãããšèããçç±ã説æããäžè¬çãªçŽ¹ä»ã§ãã åŸç¶ã®èšäºã¯ãã詳现ã«ãªããããå€ãã®ã³ãŒããå«ãŸããŸãã ç§ã®çµéšãããªãã®çµéšãšã©ã®çšåºŠçžé¢ããŠãããèå³ããããŸãã å€åç§ã¯äœãã«ã€ããŠééã£ãŠããã®ã§ãã³ã¡ã³ãããŠãã ããã
ã³ãŒãã«ã®ã¿èå³ãããå Žåã¯ã ãã¡ãã«ãããŸã ã
ã¯ããã«
以åã¯ãHTMLãCSSãããã³JavaScriptã«ã€ããŠã®åºæ¬çãªç¥èã§ãWebãµã€ãã®äœæã«å¿ èŠãªæäœéã®èŠä»¶ãæºãããŠããŸããã ç§ããããŸã§ã«äœæããã»ãšãã©ã®ã¢ããªã±ãŒã·ã§ã³ã¯ããã³ãã©ãŒå ¬éã¡ã«ããºã ãçŽæ¥äœ¿çšããŠmod_pythonã䜿çšããŠäœæãããŸããïŒäŸïŒäŸã¯ãã¡ããåç §ããŠãã ãã ïŒã Pythonã®åæã®ãã©ãã¯ãŒãšããŠãç§ãRailsã§å€ãã®ä»äºãããããšã¯é¢çœãã§ãã ããæ°å¹Žãç§ã¯ïŒå€§ããªïŒããŒã¿ã€ã³ãã©ã¹ãã©ã¯ãã£ã«çŠç¹ãåœãŠãŠããŸããããããã¯Webéçºã§ã¯ãããŸããããããã§Webã€ã³ã¿ãŒãã§ã€ã¹ãå¿ èŠã«ãªãããšã¯çãããããŸããã å®éãç§ãçŸåšåãçµãã§ããã¢ããªã±ãŒã·ã§ã³ã¯ããŒã¿ã¢ããªã±ãŒã·ã§ã³ã§ãããããã¯ãªãŒãã³ãœãŒã¹ã§ã¯ãªãããã®èšäºãšã¯ç¡é¢ä¿ã§ãã äžè¬ã«ãããã¯ç§ãããããã¹ãŠèŠãŠããåŽãæ確ã«ããå¿ èŠããããŸãã
PythonãšRuby
1幎åã¯ãWebã¢ããªã±ãŒã·ã§ã³ç°å¢ãšããŠPythonãŸãã¯Rubyããå§ãããŸãã ä»ã®åæ§ã®èšèªããããããããŸããããç§ã®èŠ³ç¹ããã¯ãPythonãšRubyãäžçãæ¯é ããŠããŸãã
ã»ãšãã©ã®å ŽåãWebã¢ããªã±ãŒã·ã§ã³ã®äž»ãªã¿ã¹ã¯ã¯ããµãŒããŒåŽã®HTMLã¬ã€ã¢ãŠãã䜿çšããŠWebããŒãžãæ§ç¯ããããšã§ããã PythonãšRubyã¯ã©ã¡ãããããŒã¿ããŒã¹ããããŒã¿ãååŸãããã³ãã¬ãŒãã䜿çšããŠHTMLã³ãŒãã®æã«å€æããã®ã«éåžžã«é©ããŠããŸãã RailsãDjangoãSinatraãFlaskãªã©ãå€ãã®ãã¬ãŒã ã¯ãŒã¯/ããŒã«ããéžæã§ããŸãã ãªã©
ãããã®èšèªã«ã¯GILãªã©ã®ç¹å®ã®éèŠãªå¶éããããŸãããHTMLçæã®åé¡ãç°¡åã«è§£æ±ºã§ããããšã¯ã劥åãããããã¯ããã«äŸ¡å€ããããŸãã
ã®ã«
GILïŒGlobal Interpreter LockïŒã¯å¥ã®èšåãäŒããŸãã ãã¡ãããããã¯PythonãŸãã¯Rubyã®ãœãªã¥ãŒã·ã§ã³ã®æ倧ã®å¶éã§ãããããã¯éåžžã«æ»ãããããããã¯ã§ãããå€ãã®å Žåã人ã ã¯åé¡ããªããµããããããšã奜ã¿ãŸãã ãããŠãããã«ã€ããŠè©±ããŠããå Žåãææ ã¯éåžžãšããžãæã£ãŠããŸããŸããRubyãšPythonã®ã³ãã¥ããã£ã§ã¯ãGILã®ãããã¯ã«é¢ããŠç¡éã®è°è«ããããŸãã
ãã®åé¡ã«æ £ããŠããªã人ã®ããã«-GILã§ã¯ãäžåºŠã«1ã€ã®ããšããã§ããŸããã ã¹ã¬ãããäœæãããããã䞊åå®è¡ãšããŠãèŠãããå Žåãå®éã«ã¯ãã€ã³ã¿ãŒããªã¿ãŒã¯ãŸã åœä»€ãé£ç¶ããŠå®è¡ããŸãã ã€ãŸãã1ã€ã®ããã»ã¹ã䜿çšã§ããCPUã¯1ã€ã ãã§ãã
JVMã«åºã¥ãå®è£ ãªã©ã代æ¿ã®å®è£ ãååšããŸããããããã¯ããŸã䜿çšãããŸããã ãªãå®å šã«äºææ§ããªãããCæ¡åŒµæ©èœãæ£ãããµããŒãããŠããªãå¯èœæ§ããããGILã䜿çšããŠããå¯èœæ§ããããŸãã ç§ã«ã¯ããããŸããããç§ãç¥ãéããCã®å®è£ ã¯éåžžãçµå±äœ¿çšãããŸããGILãªãã§ã€ã³ã¿ãŒããªã¿ãŒãäœæããã«ã¯ãå®å šã«æžãæããå¿ èŠããããããã«ããèšèªã®åäœãïŒç§ã®çŽ æŽãªç解ã§ïŒæ¢ã«å€æŽãããŠããå¯èœæ§ããããããGILæ»åšããŸãã
ããããèŠæš¡ã®Webã¢ããªã±ãŒã·ã§ã³ã«ã¯ããã·ã³ã§äœ¿çšå¯èœãªåCPUã®æ©èœã䜿çšããŠãèŠæ±ã䞊è¡ããŠåŠçããæ©èœãå¿ ãå¿ èŠã§ãã ãããŸã§ã®ãšãããå¯äžå¯èœãªè§£æ±ºçã¯ãã¢ããªã±ãŒã·ã§ã³ã®è€æ°ã®ã€ã³ã¹ã¿ã³ã¹ãåå¥ã®ããã»ã¹ãšããŠå®è¡ããããšã§ãã
ããã¯éåžžãUnicorn / Gunicornãªã©ã®è¿œå ãœãããŠã§ã¢ã䜿çšããŠè¡ãããåããã»ã¹ã¯ç¬èªã®ããŒãã§ãªãã¹ã³ããNginxãHaproxyãªã©ã®æ¥ç¶ãã©ã³ãµãŒã®èåŸã§éå§ããŸãã ãããã¯ãããã¯Apacheãšãã®ã¢ãžã¥ãŒã«ïŒmod_pythonãmod_wsgiãªã©ïŒãä»ããŠè¡ãããšãã§ããŸããããããã«ããŠãå°é£ã§ãã ãã®ãããªã¢ããªã±ãŒã·ã§ã³ã¯éåžžã競åããã¿ã¹ã¯ã®èª¿åè ãšããŠããŒã¿ããŒã¹ãµãŒããŒã«äŸåããŠããŸãã ãã£ãã·ã¥ãå®è£ ããå ŽåãåããµãŒããŒã«åãã³ããŒã®è€æ°ã®ã³ããŒãä¿åããªãããã«ããã«ã¯ãMemcachedãRedisãªã©ã®å ±æã¡ã¢ãªã¹ãã¢ãå¿ èŠã§ããéåžžã¯äž¡æ¹ã§ãã ãŸãããã®ãããªã¢ããªã±ãŒã·ã§ã³ã¯ããã¯ã°ã©ãŠã³ãåŠçãå®è¡ã§ããŸãããããã«ã¯ãResqueãªã©ã®å¥ã®ããŒã«ã»ããããããŸãã ãããŠãããããã¹ãŠã®ã³ã³ããŒãã³ãã¯ãããããã¹ãŠæ©èœããããšã確èªããããã«ç£èŠãå¿ èŠãšããŸãã ãã°ã¯çµ±åããå¿ èŠããããç¬èªã®è¿œå ããŒã«ããããŸãã ãã®ã»ããã¢ããã®è€éãã¯é¿ããããªããããChefãPuppetãªã©ã®æ§æãããŒãžã£ãŒãå¿ èŠã§ãã ããã§ãããããã®ãããã¯äžè¬ã«ãå€æ°ã®é·ææ¥ç¶ããµããŒãããããšãã§ããŸãã-C10KãšããŠç¥ãããåé¡ã§ã ã
ãã®çµæãããŒã¿ããŒã¹ãåããåçŽãªWebã¢ããªã±ãŒã·ã§ã³ã¯ãHello WorldïŒããŒãžãæäŸããåã«ã倧éã®ã³ã³ããŒãã³ããå¿ èŠãšããŸãã ãããŠãããã®ã»ãšãã©ãã¹ãŠã¯GILã«ãããã®ã§ãã
åäžããŒãžã®ã¢ããªã±ãŒã·ã§ã³ã®åºçŸ
ãµãŒããŒäžã§ã®HTMLã®çæã¯ããŸããŸãéå»ã«ãªããŸãã æåŸã®ïŒãããŠæ£ããïŒåŸåã¯ããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ãæ§ç¯ããJavaScriptã䜿çšããŠã¯ã©ã€ã¢ã³ãåŽã§å®å šã«ã¬ã³ããªã³ã°ããããšã§ãã ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ãJSã«ãã£ãŠå®å šã«å¶åŸ¡ãããã¢ããªã±ãŒã·ã§ã³ã¯ã ã·ã³ã°ã«ããŒãžã¢ããªã±ãŒã·ã§ã³ãšåŒã°ããããšããããŸãã ãã®ãããªã¢ããªã±ãŒã·ã§ã³ã§ã¯ããµãŒããŒã¯HTMLã³ãŒããçæããã«ãéåžžã¯JSON圢åŒã®ããŒã¿ã®ã¿ãæäŸããŸãã ãã®å Žåãäž»ã«äººæ°ã®ããã¹ã¯ãªããèšèªã䜿çšããŠ[Webã¢ããªã±ãŒã·ã§ã³ãäœæãã]å¯èœæ§ã®ããã«å°å ¥ããããã®ãããªéåžžã«è€éãªäœæ¥ã¯äžèŠã§ãã ç¹ã«ããã¹ãŠã®åºåãJSONã§ããå ŽåãPythonãŸãã¯Rubyã«ã¯ã»ãšãã©ã¡ãªããããªãããšãèæ ®ããŠãã ããã
GolangãèŠãŠ
Goã¯ãWebã¢ããªã±ãŒã·ã§ã³ã®ç¢ºç«ãããäžçãåŸã ã«äŸµé£ããŠããŸãã 䞊åå®è¡ããã€ãã£ãã§ãµããŒãããŠãããããGILå¶çŽã®åŠçã«äžè¬çã«äœ¿çšãããã»ãšãã©ãã¹ãŠã®ã³ã³ããŒãã³ããäžèŠã«ãªããŸãã
Goã®ããã°ã©ã ã¯ãã€ãã£ãã«èµ·åããããã€ããªã§ããããããµãŒããŒã«èšèªåºæã®ãã®ãã€ã³ã¹ããŒã«ããå¿ èŠã¯ãããŸããã ã¢ããªã±ãŒã·ã§ã³ãå¿ èŠãšããæ£ããããŒãžã§ã³ã®ã©ã³ã¿ã€ã ã確ä¿ããåé¡ã¯ãªããªããŸãã åå¥ã®ã©ã³ã¿ã€ã ç°å¢ã¯ãããŸãã-ãã€ããªã«çµã¿èŸŒãŸããŠããŸãã Goããã°ã©ã ã¯ããã¯ã°ã©ãŠã³ãã§ç°¡åãã€ãšã¬ã¬ã³ãã«ã¿ã¹ã¯ãå®è¡ã§ãããããResqueã®ãããªããŒã«ã¯å¿ èŠãããŸããã ãããã®ããã°ã©ã ã¯åäžã®ããã»ã¹ãšããŠå®è¡ãããããããã£ãã·ã¥ã¯ç°¡åã«ãªããŸããã€ãŸããMemcachedãRedisã¯å¿ èŠãããŸããã Goã¯ãç¡å¶éã®æ°ã®åææ¥ç¶ã管çã§ããNginxãªã©ã®ããã³ããšã³ãä¿è·ã®å¿ èŠæ§ãæé€ããŸãã
GoãPythonãRubyãBundlerãVirtualenvãUnicornãWSGIãResqueãMemcachedãRedisãªã©ã®èã®é«ãå€å±€ã¿ã¯ãŒ ãã€ããªã1ã€ã«æžãããŸããã éåžžå¿ èŠãšãããå¯äžã®ãµãŒãããŒãã£ã³ã³ããŒãã³ãã¯ããŒã¿ããŒã¹ã§ãïŒPostgreSQLããå§ãããŸãïŒã ãããã®ããŒã«ã¯ãã¹ãŠäœ¿çšã§ããŸãããGoããªããŠã䜿çšã§ããŸãã
ãã®ãããªGoããã°ã©ã ã®èµ·åæéã¯ãã»ãšãã©ã®Python / Rubyã¢ããªã±ãŒã·ã§ã³ãããæ¡éãã«é·ããªããå¿ èŠãªã¡ã¢ãªãšã³ãŒãè¡ãå°ãªããªããŸãã
ããŠã人æ°ã®ãããã¬ãŒã ã¯ãŒã¯ã¯ãããŸããïŒ
ç°¡åãªçãã¯ããã§ãããã¬ãŒã ã¯ãŒã¯ã¯ãªãã·ã§ã³ã§ãããæšå¥šãããŸããã ãã°ããããã¬ãŒã ã¯ãŒã¯ã§ãããšäž»åŒµããå€ãã®ãããžã§ã¯ãããããŸãããããããªãã§è¡ãæ¹ãè¯ããšæããŸãã ããã¯ç§ã®å人çãªæèŠã§ããã ãã§ãªããGoã³ãã¥ããã£ã§ã¯ãã®æèŠãéåžžã«äžè¬çã ãšæããŠããŸãã
ãã¬ãŒã ã¯ãŒã¯ãäœæãããçç±ãç解ããå¿ èŠããããŸãã Python / Rubyã®äžçã§ã¯ããããã®èšèªã¯ããšããšWebããŒãžãæäŸããããã«èšèšãããŠãããããã®åé¡ã解決ããããã«å€ãã®å€éšã³ã³ããŒãã³ããå¿ èŠã ã£ãããããããèµ·ãããŸããã Javaã«ã€ããŠãåãããšãèšããŸããJavaã¯ãPythonãRubyã®ããã«ããŠã§ããšåããããå€ããããŸãã¯ããããå°ãå€ãã§ãã
ç§ãèŠããŠããéãã§ã¯ãåæã®ããŒãžã§ã³ã®Pythonã¯ããŒã¿ããŒã¹ãæäœããããã®äœãæäŸããŠããŸããã§ããããã³ãã¬ãŒãããªããHTTPãµããŒããæ··ä¹±ããŠããŸããããããã¯ãŒã¯ã§ã®äœæ¥ã¯ç°¡åã§ã¯ãªããæå·åããéæ³ã§ãããäžè¬ã«ããŸã ããããšããããããããŸãã ãã¬ãŒã ã¯ãŒã¯ã¯ããããã¹ãŠã®å¿ èŠãªéšåãæäŸãããã¹ãŠã®äžè¬çãªWebã¢ããªã±ãŒã·ã§ã³ã®ããªãšãŒã·ã§ã³ã«å¯ŸããŠèšèªåºæã®éçºã«ãŒã«ãèšå®ããŸããã
äžæ¹ãGoã¯ããã§ã«çµéšããããWebéçºã«ç²ŸéããŠãã人ã ã«ãã£ãŠäœæãããŸããã å¿ èŠãªãã®ã¯ã»ãŒãã¹ãŠå«ãŸããŠããŸãã OAuthãªã©ã®ç¹å®ã®åé¡ã解決ããã«ã¯ã1ã€ãŸãã¯2ã€ã®å€éšããã±ãŒãžãå¿ èŠã«ãªãå ŽåããããŸããããã®ãã¢ã®ããã±ãŒãžã¯ããã¬ãŒã ã¯ãŒã¯ãã§ã¯ãããŸããã
ãã¬ãŒã ã¯ãŒã¯ã«é¢ããäžèšã®ãã¹ãŠãååã«èª¬åŸåããªããšæãããå Žåã¯ããã¬ãŒã ã¯ãŒã¯ãšãªã¹ã¯ã®åŠç¿æ²ç·ãèæ ®ããããšãæçšã§ãã Railsãšã®é¢ä¿ãç¯ãã®ã«çŽ2幎ããããŸããã ãã¬ãŒã ã¯ãŒã¯ã¯æŸæ£ãããæ代é ãã«ãªãå¯èœæ§ããããæ°ãããã¬ãŒã ã¯ãŒã¯ãžã®ã¢ããªã±ãŒã·ã§ã³ã®ç§»æ€ã¯é£ãããæã«ã¯äžå¯èœã§ãã æ å ±æè¡ã®å€åã®éããèãããšããã¬ãŒã ã¯ãŒã¯ã¯ç¢ºãã«è»œãéžæãã¹ãã§ã¯ãããŸããã
PythonãRubyããŸãã¯JavaScriptç°å¢ã«å ±éã®ã€ãã£ãªã ãã·ãã¥ã¬ãŒãããããšããããŒã«ãšãã¬ãŒã ã¯ãŒã¯ã匷調ããããšæããŸãã ãªãã¬ã¯ã·ã§ã³ã«å€§ããäŸåããã€ã³ãžã§ã¯ã·ã§ã³ãã¡ãœããã®åçå ¬éãªã©ã®ãã¯ããã¯ãå«ãããRails for Goãã®åœ¹å²ã«èŠãããæããããŸãã¯ãµãããããã¹ãŠã®ãã®ã¯ãGoã®ã€ããªãã®ãŒã«é©åããªããããé¢ããŠã
ãã¬ãŒã ã¯ãŒã¯ã¯ãç¹ã«ããžãã¹çšã®CRUDã¢ããªã±ãŒã·ã§ã³ã®å žåçãªäžçã§ãã¢ããªã±ãŒã·ã§ã³ãå€ãã®ãã£ãŒã«ããæã€å€ãã®ããŒãžãæã¡ãè€éã§çµ¶ããå€åããããŒã¿ããŒã¹ã¹ããŒã ã§ããŒã¿ãæäœããããšã§ãããã€ãã®ããšã容æã«ããŸãã ãã®ãããªç°å¢ã§Goãé©åãªéžæè¢ã§ãããã©ãããç¹ã«ããã©ãŒãã³ã¹ãšã¹ã±ãŒã©ããªãã£ãåªå äºé ã§ãªãå Žåã¯ããããŸããã
ãã¬ãŒã ã¯ãŒã¯ã«å ±éããå¥ã®åé¡ã¯ãéçºè ããäœã¬ãã«ã®ã¡ã«ããºã ãæœè±¡åãããããæéãçµã€ã«ã€ããŠéåžžã«ç¥ç§çã«ãªããå®éã«ããã§äœãèµ·ãã£ãŠããã®ããç解ããããšãäžå¯èœã«ãªãããšã§ãã JavaScriptã®1è¡ã®åå¥ãšã€ãªã¢ã¹ã§å§ãŸããã®ã¯ããµãäŸåé¢ä¿ã®ã©ããã«é ããããã«ããŒã®äžã«ãããã©ã³ã¹ãã€ã©ãŒããããã€ã¶ãŒã®ã¬ã€ã€ãŒã®ã¬ã€ã€ãŒã«ãªããŸãã äœããå£ãããšãã©ãã§åé¡ãæ¢ãã¹ãããèŠã€ããããšãã§ããªããªããŸãã äœãèµ·ãã£ãŠããã®ããæ£ç¢ºã«ç¥ã£ãŠããã°ããã®ã§ãããGoã¯ãããåŸæã§ãã
ããŒã¿ããŒã¹ãšORMã¯ã©ãã§ããïŒ
ãã¬ãŒã ã¯ãŒã¯ã®ããã«ãGoã®ORMã¯ããŸãäžè¬çã§ã¯ãããŸããã ãŸããGoã¯ãªããžã§ã¯ãããµããŒãããŠããŸãã-ç¥èªORMã®Oã§ç€ºãããŠããŸãã
ActiveRecordã®ãããªãã®ã«ãã£ãŠæäŸããã䟿å©ãªUser.find(:all).filter...
ã䜿çšãã代ããã«ãSQLãæåã§èšè¿°ããããšã¯ãäžéšã®ã³ãã¥ããã£ã§ã¯å代æªèã®ããšã§ããããã®æ
床ã¯å€ããã¯ãã§ãã SQLã¯çŽ æŽãããèšèªã§ãã SQLãçŽæ¥æ±ãããšã¯ããã»ã©é£ãããªãããã®èŠè¿ãã«ãããå€ãã®èªç±ãšæ©äŒãåŸãããŸãã ããããããã®çŽæ¥çãªäœæ¥ã®æãéå±ãªéšåã¯ãããŒã¿ããŒã¹ã«ãŒãœã«ããæ§é äœã«ããŒã¿ãã³ããŒããããšã§ããã sqlxãããžã§ã¯ãã¯ããã§éåžžã«åœ¹ç«ã¡ãŸã ã
ãããã«
ç§ã®æèŠã§ã¯ããã®èšäºã§ã¯ãµãŒããŒåŽã®çŸåšã®ç¶æ³ã«ã€ããŠååã«è©³ãã説æããŠããŸãã ã¯ã©ã€ã¢ã³ãéšåãå¥ã®æçš¿ã«åããæ¹ãè¯ããšæãã®ã§ãä»æ¥ã¯ããã ãã§ãã èŠçŽãããšããããã次ã®èŠä»¶ã§ã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããŸãã
- ãµãŒãããŒãã£ã®ããã±ãŒãžãžã®æå°éã®äŸåã
- Webãã¬ãŒã ã¯ãŒã¯ãªãã
- ããŒã¿ããŒã¹ãšããŠã®PostgreSQLã
- åäžããŒãžã®ã¢ããªã±ãŒã·ã§ã³ã