ãð¶é«è² è·ã«åŒ·ãGoãgoroutineã®ä»çµã¿ãšJavaScriptã®ã€ãã³ãã«ãŒãããŸãšããŠçè§£ããèšäº
ð€ ã¯ããã«
ãã©ã³ã¿ã€ã ã£ãŠäœïŒããã¹ã¬ããã£ãŠã©ãåããŠãã®ïŒã
JavaScriptð°ãšGoð»ã®åŠçã¢ãã«ãçè§£ãããšã ããã³ããšããã¯ãšã³ãã®å
šäœåãã¹ããšç¹ãããŸãã
ãã®èšäºã§ã¯ JavaScriptïŒãã©ãŠã¶ïŒNodeïŒ ãš Go ãäŸã«ã
ã©ã³ã¿ã€ã ã»ã¹ã¬ããã»ã€ãã³ãã«ãŒããå³è§£ã§èª¬æããŸãã
ð° ã©ã³ã¿ã€ã ãšã¯ïŒ
ã©ã³ã¿ã€ã ãšã¯ ããã°ã©ã ãåãããã®âç®±â ã®ããšã§ãã
äŸïŒ
- ãã©ãŠã¶ïŒChrome, SafariïŒ
- Node.js
- Deno / Bun
- JVMïŒJavaïŒ
- Goã©ã³ã¿ã€ã
ã©ã³ã¿ã€ã ã¯OSã®äžã§åããããã°ã©ã å®è¡ã«å¿ èŠãªAPIãæäŸããŸãã
ð» OSïŒWindows / macOS / LinuxïŒ
â
ð° ã©ã³ã¿ã€ã ïŒãã©ãŠã¶ / Node.js / Goã©ã³ã¿ã€ã ïŒ
â
ð€ ããã°ã©ã
ðž OS ãš ã©ã³ã¿ã€ã ã®éã
| OS ð» | ã©ã³ã¿ã€ã ð€ | |
|---|---|---|
| åœ¹å² | ããŒããŠã§ã¢ã管çããåå° | ããã°ã©ã ãå®è¡ããç°å¢ |
| äŸ | Windows / macOS / Linux | ãã©ãŠã¶ / Node / Deno / Goã©ã³ã¿ã€ã |
| äŸã | å®¶ | éšå± |
OSã¯âå®¶âãã©ã³ã¿ã€ã ã¯âéšå±â
ãããŠãã®éšå±ã®äžã§ JavaScript ã Go ãåããŠããŸãã
ð¶ ã¹ã¬ãããšã¯ïŒ
ã¹ã¬ãããšã¯ åŠçãåæå®è¡ããããã®äœæ¥åäœã
äŸãããšïŒ
- ð€ 1人ã®äœæ¥å¡ â 1ã¹ã¬ãã
- ð€ð€ð€ 10人ã®äœæ¥å¡ â 10ã¹ã¬ãã
CPU ã¯è€æ°ã¹ã¬ãããåæã«åãããŸãã
ð» Go ã¯ãã«ãã¹ã¬ããïŒgoroutineïŒ
Go ð¶ ã® goroutine ã¯è»œéã¹ã¬ããã§ãäœäžåã§ãåãããŸãã
go func() {
fmt.Println("Hello ð€")
}()
Goã©ã³ã¿ã€ã ã¯OSã®ã¹ã¬ãããäžæã䜿ãã
CPUããã«æŽ»çšãã髿§èœåŠçãå¯èœã§ãã
ð° JavaScript ã¯ã·ã³ã°ã«ã¹ã¬ãã
JavaScript ð€ ã¯åºæ¬çã« 1ã€ã®ã¹ã¬ããã§ããåããŸããã
console.log("A ð€")
console.log("B ð°")
A â B ã®ããã«é çªã§åããŸãã
ã§ãâŠâŠ
fetch ã setTimeout ãåæã«åãããŠãããã«èŠããŸãããïŒðž
ðž ãªã JavaScript ã¯åæã«åãããã«èŠããã®ãïŒ
çç±ã¯ã
JavaScriptïŒã¡ã€ã³ã¹ã¬ããïŒã¯1ã€ã ããã©ã³ã¿ã€ã åŽã«ã¯è€æ°ã¹ã¬ããããã
ããã§ãã
ãã©ãŠã¶ãNode.jså éšã«ã¯âŠ
- Web API (éåæåŠç)
- HTTPåŠçã¹ã¬ãã
- ã¿ã€ããŒã¹ã¬ãã
- I/Oã¹ã¬ããïŒNode.jsïŒ
ãªã©ã䞊è¡ããŠåããŠããŸãã
JavaScript ã¯èªåãã·ã³ã°ã«ãªã®ã«ã
ã©ã³ã¿ã€ã ã®ã¹ã¬ããã«ä»äºããé¡ãããŠãã ã ããªã®ã§ãã
ð€ ã€ãã³ãã«ãŒããšã¯ïŒ
ã€ãã³ãã«ãŒãã¯
ãã©ã³ã¿ã€ã ã®è£åŽã§çµãã£ãåŠçããJavaScriptã«æ»ãä¿ã
ã§ãã
â JavaScriptïŒã·ã³ã°ã«ã¹ã¬ããïŒ
â¡ fetch ãåŒã¶ â ã©ã³ã¿ã€ã ãž
⢠ã©ã³ã¿ã€ã ãå¥ã¹ã¬ããã§åŠç
⣠çµãã£ããã¿ã¹ã¯ãã¥ãŒãž
†ã€ãã³ãã«ãŒãã確èª
⥠JavaScriptã®ã¡ã€ã³ã¹ã¬ãããžæ»ã
ã€ãŸãïŒ
- JS â ã·ã³ã°ã«ã¹ã¬ãã
- ã©ã³ã¿ã€ã â ãã«ãã¹ã¬ãã
- ã€ãã³ãã«ãŒã â 調æŽåœ¹ïŒåžä»€å¡ïŒ
ãšããæ§é ã«ãªã£ãŠããŸãã
ð¶ Go ãš JavaScript ã®æ¯èŒãŸãšã
| Go ð¶ | JavaScript ð° | |
|---|---|---|
| ã¹ã¬ããã¢ãã« | goroutineïŒå€ãïŒ | ã·ã³ã°ã«ã¹ã¬ãã |
| 䞊è¡åŠç | OSã¹ã¬ããäœ¿çš | ã©ã³ã¿ã€ã ã®ã¹ã¬ããäœ¿çš |
| é©ããåŠç | CPUéãåŠç | I/Oäžå¿ã®åŠç |
| å®è¡ç°å¢ | Goã©ã³ã¿ã€ã | ãã©ãŠã¶ / Node.js |
ð» ãŸãšã
- ð€ OSã¯åå°ãã©ã³ã¿ã€ã ã¯å®è¡ç°å¢
- ð° ã¹ã¬ããã¯åŠçã®æµãã®åäœ
- ðž JavaScriptã¯ã·ã³ã°ã«ã¹ã¬ãã
- ð¶ éåæåŠçã¯ã©ã³ã¿ã€ã ã®ã¹ã¬ãããæ åœ
- ð» ã€ãã³ãã«ãŒãã¯JSãžåŠçãæž¡ãåžä»€å¡
ãããçè§£ãããšãJavaScript ãš Go ã®åäœã¢ãã«ãäžæ°ã«ç¹ãããŸãã
ð¯ Go ã«å€§éã¢ã¯ã»ã¹ãæ¥ããã©ããªãïŒïŒ9000ãªã¯ãšã¹ãåæã®å ŽåïŒ
ããšãã°ã以äžã®3ã€ã®ãšã³ããã€ã³ãããããšããŸãã
- GET
/users - POST
/users - DELETE
/users/:id
9000人ãåæã¢ã¯ã»ã¹ãã
åãšã³ããã€ã³ããž 3000ãªã¯ãšã¹ãã〠æ¥ããã©ããªãã§ããããïŒ
çµè«ã¯ããã§ãð
Go ã¯ã9000ãªã¯ãšã¹ã â 9000åã® goroutineããèªåçæãã
Go ã® net/http 㯠1ãªã¯ãšã¹ãã«ã€ã 1 goroutine ãèªåã§äœããŸãã
ãã®ãããéçºè ã goroutine ãæžããªããŠãã
- 3000 GET
- 3000 POST
- 3000 DELETE
- åèš 9000 goroutine
ãèªåçæãããŸãã
ð» ã§ã CPU ã 4 ã³ã¢ãªããåæã«åãã goroutine 㯠4ã€ã ã
CPU ã³ã¢ã¯åæã«åããåŠçæ°ã衚ããŸãã
äŸïŒ
AWS EC2 ã® vCPU 4 ã€ã³ã¹ã¿ã³ã¹ãªãâŠ
- åæã«âå®è¡äžâãªã®ã¯æå€§ 4 goroutine
- ä»ã® 8996 goroutine ã¯ãåŸ ã¡ããI/OåŸ ã¡ããã¹ã±ãžã¥ãŒã«åŸ ã¡ã
CPUã³ã¢ïŒ4åïŒ
ââ å®è¡äžã®goroutineâŠâŠ4å
ââ åŸ
æ©äžã®goroutineâŠâŠæ°åå
ããã§ãé«éãªã®ã¯âgoroutine ãè¶ è»œéâã ãã
goroutine 㯠OSã¹ã¬ãããã軜ãã®ã§ã
- æ°äž goroutine
- æ°äžåææ¥ç¶
- 倧é I/O
ãªã©ãå¹çãããã°ããŸãã
ðž Go ãé«è² è·ã«åŒ·ãçç±
Go ã®äžŠè¡åŠçã¯
ãM:N ã¹ã±ãžã¥ãŒãªã³ã°ã ãšããæ¹åŒã§åããŸãã
- M = OS ã¹ã¬ããïŒäŸïŒ4ïŒ
- N = goroutineïŒäŸïŒ9000ïŒ
Go ã©ã³ã¿ã€ã ã OSã¹ã¬ãããš goroutine ã
é«éã«åãæ¿ãã空ããŠããCPUã³ã¢ã«æ¬¡ã
å²ãåœãŠã
ãããCPUãå°ãªããŠã倧éã¢ã¯ã»ã¹ãåŠçã§ããŸãã
ð€ ããã«ããã¯ã¯ Go ã§ã¯ãªãå€éšïŒDB, APIïŒ
å€ãã®å Žåãè©°ãŸãã®ã¯ Go ã§ã¯ãªãâŠ
- DBæ¥ç¶æ°ïŒRDS, DynamoDBïŒ
- å€éšAPIã®ã¬ã¹ãã³ã¹
- ãã¡ã€ã«I/O
- ããã¯
ã§ãã
ð¶ å šäœãŸãšã
ãã®èšäºã§ã¯ãJavaScriptãšGoãšããæ§è³ªã®ç°ãªã2ã€ã®èšèªãäŸã«ã
- OSãšã©ã³ã¿ã€ã ã®éã
- ã¹ã¬ãããšã¯äœã
- JavaScriptãã·ã³ã°ã«ã¹ã¬ããã§ãéåæã«åŒ·ãçç±ïŒã€ãã³ãã«ãŒãïŒ
- Goã倧éã¢ã¯ã»ã¹ã«åŒ·ãçç±ïŒgoroutine ãš M:N ã¹ã±ãžã¥ãŒãªã³ã°ïŒ
- 9000ã¢ã¯ã»ã¹æã«Goãã©ã®ããã«åãã
ãšãã£ã â䞊è¡åŠçã®æ ¹æ¬â ãæŽçããŠçè§£ããŸããã
ð€ èŠç¹ããã ã£ãšãŸãšãããšïŒ
- OS ã¯åå°ãã©ã³ã¿ã€ã ã¯ãã®äžã®âå®è¡ç°å¢â
- JavaScript ã¯ã·ã³ã°ã«ã¹ã¬ããã ããã©ã³ã¿ã€ã ïŒãã©ãŠã¶/NodeïŒãè£åŽã§è€æ°ã¹ã¬ãããæã¡ãã€ãã³ãã«ãŒããéåæåŠçã調æŽããŠãã
- Go 㯠goroutine ã䜿ã£ãŠå€§éã®åŠçã䞊è¡ã«å®è¡ã§ãã
- CPU ã³ã¢æ°ã«éãããã£ãŠããgoroutine ã¯è¶ 軜éã§å€§éã¢ã¯ã»ã¹ãå¹çãããã°ãã
- å®éã«è©°ãŸããããã®ã¯ Go æ¬äœãããå€éšãªãœãŒã¹(DB, API)
ð» æåŸã«
JavaScript ãš Go ã®åŠçã¢ãã«ãæ¯èŒãããšã
âã·ã³ã°ã«ã¹ã¬ããã§ã䞊è¡ãã§ããJavaScriptâ
âãã«ãã¹ã¬ããã§èšå€§ãªåŠçãããªãGoâ
ãšãããããããã®åŒ·ã¿ãããããçè§£ã§ããããã«ãªããŸãã
ã©ã³ã¿ã€ã ã»ã¹ã¬ããã»ã€ãã³ãã«ãŒãã®æŠå¿µã¯ã
ããã³ããšã³ããšããã¯ãšã³ãã®äž¡æ¹ãåŠã¶äžã§ã®åºç€ã«ãªãã®ã§ã
ãã®èšäºããã®çè§£ã®å©ãã«ãªãã°å¬ããã§ãð€âš
Discussion