ื ืืชืื ืืืืื ืื ืืืฆืืขืื ืืื ืืื ืจื ืขืืฆืื ืืืืืืช ืชืืืืืช ืืืืฆืืขืื ืขืืืจ ืืงืืืืช.
ื ืืชื ืืืฉืชืืฉ ืื ืืชืื ืืืฆืืขืื ืืื ืืืืืง ืฆืืืืจื ืืงืืืง ืืชืืื ืืช ืขื ืืื ืืืฉืื ืืืฉื ืืืขืืช ืืืืืงืช ื ืืกืืื ืืืื ืื. ืืืืจ ืื ืืืืืจ ืืืฉื ืืืืืช ืื ืืชืื ืืืืืื ืื ืืืฆืืขืื, ืชืื ืฉืืืืฉ ืืฉืจืช ืืื ืืจื ื Go ืืืืืื.
Go ืืื ืืืืืื ืืื ืื ืืฉ ืื ืืื ืคืจืืคืื pprof
ืืกืคืจืืื ืืจืืืื.
ืืกืืจืืืื
ืืืื ื ืืฆืืจ ืจืฉืืื ืืกืืืช ืื ืืชืื ืืืื ื ืฉืื ื. ื ื ืกื ืืืฉืชืืฉ ืืืื ื ืชืื ืื ืืื ืืงืื ืืืืืืช ืืืงืื ืืืฆืข ืฉืื ืืืื ืขื ืกืื ืืื ืืืืืฆืื ืื ื ืืืืฉืื. ืืฉื ืื ื ืขืฉื ืืืช:
- ืื ื ืงืืืขืื ืืช ืืืืืืช ืืืืคืืืืืืฆืื (ืืจืืฉืืช);
- ืื ื ืืืฉืืื ืืช ืขืืืก ืืขืกืงืืืช ืขืืืจ ืืืขืจืืช;
- ืื ื ืืืฆืขืื ืืช ืืืืืงื (ืืืฆืจืื ื ืชืื ืื);
- ืื ื ืืชืืื ื ืื;
- ืื ื ืื ืชืืื - ืืื ืื ืืืจืืฉืืช ืืชืงืืืืืช?
- ืงืืขื ื ืืช ืื ืืืืคื ืืืขื, ืืขืืื ืืฉืขืจื;
- ืื ื ืืืฆืขืื ื ืืกืื ืืื ืืืืืง ืืฉืขืจื ืื.
ืืจืืืืงืืืจืช ืฉืจืช HTTP ืคืฉืืื
ืขืืืจ ืืืืจ ืื ื ืฉืชืืฉ ืืฉืจืช HTTP ืงืื ืืืืืื ื. ื ืืชื ืืืฆืื ืืช ืื ืืงืื ืืืืืืจ ืืื
ืืืืฉืื ืืื ืืชื ืืื ืฉืจืช HTTP ืฉืืกืงืจ ืืช Postgresql ืขืืืจ ืื ืืงืฉื. ืื ืืกืฃ, ืืฉ Prometheus, node_exporter ื-Grafana ืืืืกืืฃ ืืืฆืืช ืืืื ืืืฉืืืื ืืืขืจืืช.
ืืื ืืคืฉื, ืื ื ืจืืืื ืื ืขืืืจ ืงื ื ืืืื ืืืคืงื (ืืคืืฉืื ืืืฉืืืื) ืื ืฉืืจืืช ืืืกื ื ืชืื ืื ื ืคืจืกืื ืืื:
ืืืืจืช ืืืจืืช
ืืฉืื ืื, ืื ื ืืืืืืื ืขื ืืืืจื. ืื ืื ืื ื ืื ืกืื ืื ืชื? ืืื ื ืืข ืืชื ืืืืข ืืืื ืืกืืื? ืืืืืจ ืื ื ืืืืื ืฉืืฉ ืื ื ืืงืืืืช ืืฉืืฉืืจืืช ืฉืื ื ืืขืื 10 ืืงืฉืืช ืืฉื ืืื.
ะ
- ืืืืืจ: 99% ืืืืงืฉืืช ืืืืจืืช ืืืกืชืืื ืชืื ืคืืืช ื-60 ืืืคืืืช ืืฉื ืืื;
- ืขืืืช: ืืฉืืจืืช ืฆืจืื ืืฆืจืื ืืช ืืืืช ืืืกืฃ ืืืื ืืืืืช ืฉืืืขืชื ื ืืคืฉืจืืช ืืืืคื ืกืืืจ. ืืฉื ืื, ืื ื ืืืงืกืืื ืืช ืืชืคืืงื;
- ืชืื ืื ืงืืืืืช: ืืืจืฉ ืืื ื ืืชืืขืื ืฉื ืืื ืืืคืขืื ืฉื ืืืืฉืื ืืืื ืฆืืจื ืืืคืขืื, ืืืื ืคืื ืงืฆืืื ืืืืช ืงื ื ืืืื ืืืื, ืืืื ืืืคืขืื ืืืืจืฉื ืืื ืืขืืื ืืืจืืฉืืช ืืืขืื ื ืืืืงืฆืื ืืจืืฉืื ืืช
ืืชืืจืืช n+1 .
ืืืืื ืขืฉืื ืืืจืืฉ ืืืคืืืืืืฆืื ืื ืืกืฃ ืื ืืชืื, ืื ืืจืืจ ืฉืฆืจืื ืื ืชื ืืช ืืชืคืืงื. ืืขืช ืฉืืืืฉ ืืชืืืื SRE SLO, ืืงืฉืช ืืขืืืื ืืืืขื ืืืืงืื ืื ืืขืกืง, ืืืืืฆืืื ืขื ืืื ืืขื ืืืืฆืจ. ืืืฉืืจืืช ืฉืื ื ืืืื ืืืื ืื ืืืจ ืืืืชืืื ืืื ืื ืืืืจืืช!
ืืงืืช ืกืืืืช ืืืืงื
ืืขืืจืช ืกืืืืช ืืืืงื ื ืืื ืืืคืขืื ืขืืืก ืืืื ืขื ืืืขืจืืช ืฉืื ื. ืืฆืืจื ื ืืชืื, ืืืคืงื ื ืชืื ืื ืขื ืืืฆืืขื ืฉืืจืืช ืืืื ืืจื ื.
ืขืืืก ืขืกืงื
ืกืืืื ืื ืืฉืชืืฉืช
$ make load-test LOAD_TEST_RATE=50
echo "POST http://localhost:8080" | vegeta attack -body tests/fixtures/age_no_match.json -rate=50 -duration=0 | tee results.bin | vegeta report
ืชืฆืคืืช
ืขืืืก ืขืกืงื ืืืคืขื ืืืื ืืจืืฆื. ืื ืืกืฃ ืืืืื ืืืฉืืืื (ืืกืคืจ ืืงืฉืืช, ืืื ืืฉืืืืช ืชืืืื) ืืืขืจืืช ืืืคืขืื (ืืืืจืื, ืืขืื, IOPS), ืืืคืขื ืคืจืืคืื ืืืฉืืืื ืืื ืืืืื ืืืื ืืฉ ืื ืืขืืืช ืืืื ืืื ื-CPU ื ืฆืจื.
ืืฆืืจืช ืคืจืืคืืืื
ืคืจืืคืื ืืื ืกืื ืฉื ืืืืื ืืืืคืฉืจืช ืื ืืจืืืช ืืื ืขืืืจ ืืื ืืืขืื ืืืฉืจ ืืคืืืงืฆืื ืคืืขืืช. ืื ืืืคืฉืจ ืื ืืงืืืข ืืืืืง ืืืื ืืืื ืืื ืืืขืื ืืืฉืงืข:
ื ืืชื ืืืฉืชืืฉ ืื ืชืื ืื ืืื ืืืืื ืื ืืชืื ืืื ืืงืื ืชืืื ืืช ืืืื ืืื ืืขืื ืืืืืื ืืขืืืื ืืืืชืจืช ืฉืืชืืฆืขืช. Go (pprof) ืืืื ืืืฆืืจ ืคืจืืคืืืื ืืืืืืืฉ ืืืชื ืืืจืคื ืืืื ืืืืฆืขืืช ืกื ืืืื ืกืื ืืจืื. ืื ื ืืืืจ ืขื ืืฉืืืืฉ ืืืืจืื ืืืืืจื ืฉืืื ืืืืฉื ืืืืืจ.
ืืืฆืืข, ืชืฆืคืืช, ื ืืชืื.
ืืืื ื ืขืฉื ื ืืกืื. ื ืืฆืข, ื ืฆืคื ืื ื ืชื ืขื ืฉื ืืื ืืจืืฆืื ืืืืืฆืืข. ืืื ื ืืืจ ืขืจื ืขืืืก ื ืืื ืืืืคื ืฉืจืืจืืชื ืืื ืืืืฉื ืืืชื ืืื ืืงืื ืืช ืชืืฆืืืช ืืชืฆืคืืืช ืืจืืฉืื ืืช. ืืื ืฉืื ืขืืงื ื ืืืื ืืช ืืขืืืก ืขื ืืืจื ืงื ื ืืืื ืืกืืื, ืฉื ืืืจ ืขื ืืจืืืฆืื ืืกืืืืช. ืื ืจืืฆืช ืืืืงืช ืขืืืก ืืชืืฆืขืช ืขื ืืชืืื ืฉื ืืกืคืจ ืืืงืฉืืช: make load-test LOAD_TEST_RATE=X
.
50 ืืงืฉืืช ืืฉื ืืื
ืฉืืื ืื ืืฉื ื ืืืจืคืื ืืขืืืื ืื. ืืคืื ื ืืฉืืืืืช ืืขืืืื ื ื ืืชื ืืจืืืช ืฉืืืคืืืงืฆืื ืฉืื ื ืืขืืืช 50 ืืงืฉืืช ืืฉื ืืื (ื ืจืื ืื) ืืืคืื ื ืืฉืืืืืช ืืขืืืื ื ืืืฆืืช ืืฉื ืืืื ืฉื ืื ืืงืฉื. ืฉื ื ืืคืจืืืจืื ืขืืืจืื ืื ื ืืืกืชืื ืืื ืชื ืื ืื ืื ื ืืืืืืืช ืืืืฆืืขืื ืฉืื ื ืื ืื. ืงื ืืืื ืขื ืืืจืฃ ืืืืื ืืงืฉืช HTTP ืืฆืื SLO ื-60ms. ืืฉืืจื ืืจืื ืฉืื ืื ื ืืจืื ืืชืืช ืืืื ืืชืืืื ืืืงืกืืืื ืฉืื ื.
ืืืื ื ืกืชืื ืขื ืฆื ืืขืืืช:
10000 ืืงืฉืืช ืืฉื ืืื / 50 ืืงืฉืืช ืืฉืจืช = 200 ืฉืจืชืื + 1
ืื ืื ื ืขืืืื ืืืืืื ืืฉืคืจ ืืช ืื ืชืื ืืื.
500 ืืงืฉืืช ืืฉื ืืื
ืืืจืื ืืขื ืืื ืื ืืืชืจ ืืชืืืืื ืืงืจืืช ืืฉืืขืืืก ืืืืข ื-500 ืืงืฉืืช ืืฉื ืืื:
ืฉืื, ืืืจืฃ ืืฉืืืื ืืขืืืื ื ืืชื ืืจืืืช ืฉืืืคืืืงืฆืื ืจืืฉืืช ืขืืืก ืจืืื. ืื ืื ืื ืืืงืจื, ืืฉ ืืขืื ืืฉืจืช ืฉืื ืืืคืืืงืฆืื ืคืืขืืช. ืืจืฃ ืืื ืืฉืืืืช ืืชืืืื ืืืืงื ืืคืื ื ืืฉืืืืืช ืืขืืืื ื, ืืืจืื ืฉ-500 ืืงืฉืืช ืืฉื ืืื ืืืืื ืืขืืืื ืชืืืื ืฉื 25-40ms. ืืืืืืื ื-99 ืขืืืื ืืชืืื ืืืื ื-60ms SLO ืฉื ืืืจ ืืขืื.
ืืืืื ืช ืขืืืช:
10000 ืืงืฉืืช ืืฉื ืืื / 500 ืืงืฉืืช ืืฉืจืช = 20 ืฉืจืชืื + 1
ืืื ืขืืืื ื ืืชื ืืฉืืคืืจ.
1000 ืืงืฉืืช ืืฉื ืืื
ืืฉืงื ืืขืืื! ืืืคืืืงืฆืื ืืจืื ืฉืืื ืขืืืื 1000 ืืงืฉืืช ืืฉื ืืื, ืื ืืืืืช ืืืฉืืื ืืืคืจื ืขื ืืื ื-SLO. ื ืืชื ืืจืืืช ืืืช ืืฉืืจื p99 ืืืจืฃ ืืืื ื ืืขืืืื. ืืืจืืช ืืขืืืื ืฉืงื p100 ืืืื ืืืจืื, ืืขืืืืืื ืืคืืขื ืืืืืื ืืืืงืกืืืื ืฉื 60ms. ืืืื ื ืฆืืื ืืชืื ืคืจืืคืืืื ืืื ืืืืืช ืื ืืืคืืืงืฆืื ืขืืฉื ืืคืืขื.
ืืฆืืจืช ืคืจืืคืืืื
ืืืฆืืจืช ืคืจืืคืืืื, ืื ื ืืืืืจืื ืืช ืืขืืืก ื-1000 ืืงืฉืืช ืืฉื ืืื, ืืืืืจ ืืื ืืฉืชืืฉืื pprof
ืืื ืืืืื ื ืชืื ืื ืืื ืืืืืช ืืืื ืืืคืืืงืฆืื ืืืื ืืื CPU. ื ืืชื ืืขืฉืืช ืืืช ืขื ืืื ืืคืขืืช ื ืงืืืช ืืงืฆื ืฉื HTTP pprof
, ืืืืืจ ืืื, ืชืืช ืขืืืก, ืฉืืืจ ืืช ืืชืืฆืืืช ืืืืฆืขืืช curl:
$ curl http://localhost:8080/debug/pprof/profile?seconds=29 > cpu.1000_reqs_sec_no_optimizations.prof
ื ืืชื ืืืฆืื ืืช ืืชืืฆืืืช ืื:
$ go tool pprof -http=:12345 cpu.1000_reqs_sec_no_optimizations.prof
ืืืจืฃ ืืจืื ืืืื ืืืื ืืืคืืืงืฆืื ืืืื ืืื ืืขืื. ืืืชืืืืจ ื
ืฆืืจ ื-X ืืื ืืืืืืกืืืช ืคืจืืคืื ืืืืกื ืืช, ืืืืื ืช ืืคื ืืืคืืืชื (ืื ืื ืืืื), ืฆืืจ ื-Y ืืฆืื ืืช ืขืืืง ืืขืจืืื, ืกืืคืจ ืืืคืก ื [ืืืขืื]. ืื ืืืื ืืื ืืกืืจืช ืืืกื ืืช. ืืื ืฉืืืกืืจืช ืจืืื ืืืชืจ, ืื ืืื ื ืืืืช ืืขืจืืืืช ืืขืชืื ืงืจืืืืช ืืืชืจ. ืื ืฉืืืคืืข ืืืขืื ืคืืขื ืขื ื-CPU, ืืื ืฉืืืื ืื ืจืืืื ืืฆืืฆื. ืืฆืืขืื ืืืจื ืืื ืื ืืืืจืื ืืืื, ืืื ืคืฉืื ื ืืืจืื ืืืงืจืื ืืื ืืืืืื ืืื ืืกืืจืืช.
ื ืืชืื โ ืืฉืขืจื
ืืฆืืจื ืืืื ืื, ื ืชืืงื ืื ืืกืืื ืืืฆืื ืืื ืืขืื ืืืืืื. ื ืืคืฉ ืืช ืืืงืืจืืช ืืืืืืื ืืืืชืจ ืืืืฆืืืช ืืกืจืืช ืชืืขืืช ืื ืกืืจ ืืืชื. ืืืื, ืืืชืืฉื ืืื ืฉืคืจืืคืื ืืืื ืืฆืืจื ืืืืืงืช ืืืื ืืืื ืืืืืง ืืืคืืืงืฆืื ืืืื ืืช ืืื ืืืขืื ืฉืื, ืืืชืื ืฉืชืฆืืจืื ืืขืฉืืช ืืืช ืืกืคืจ ืคืขืืื, ืืชืฆืืจืื ืื ืืฉื ืืช ืืช ืงืื ืืืงืืจ ืฉื ืืืคืืืงืฆืื, ืืืจืืฅ ืืืืฉ ืืช ืืืืืงืืช ืืืจืืืช ืฉืืืืฆืืขืื ืืชืงืจืืื ืืืขื.
ืืขืงืืืช ืืืืืฆืืช ืฉื ืืจื ืื ืืจื, ื ืงืจื ืืช ืืชืจืฉืื ืืืืขืื ืืืื. ืื ืฉืืจื ืืฆืืื ืืกืืจืช ืืืกื ืืช (ืงืจืืืช ืคืื ืงืฆืื). ืืฉืืจื ืืจืืฉืื ื ืืื ื ืงืืืช ืืื ืืกื ืืชืืื ืืช, ืืื ืฉื ืื ืืฉืืืืช ืืืืจืืช (ืืืืืื ืืืจืืช, ืื ืฉืืจ ืืฉืืืืช ืืงืืื ืืืชื ืืขืจืืื). ืืฉืืจื ืืืื ืืืจ ืฉืื ื:
ืื ืชืจืืฃ ืขื ืืกืื ืืขื ืฉื ืคืื ืงืฆืื ืืืจืฃ, ืืืื ืืืืื ืฉืืื ืืืืชื ืขื ืืขืจืืื ืืืืื ืืืชืืจ ืืืืื ืืืฆื. ืืคืื ืงืฆืื HTTPServe ืืืืชื ืฉื 65% ืืืืื, ืคืื ืงืฆืืืช ืืืจืืช ืืืื ืจืืฆื runtime.mcall
, mstart
ะธ gc
, ืืงื ืืช ืฉืืจ ืืืื. ืขืืืื ืืื ื: 5% ืืืืื ืืืืื ืืืฉืงืข ืืฉืืืืชืืช DNS:
ืืืชืืืืช ืฉืืชืืื ืืช ืืืคืฉืช ืฉืืืืืช ื-Postgresql. ืืืฅ ืขื FindByAge
:
ืืขื ืืื ืฉืืชืืื ืืช ืืจืื ืฉืืืืคื ืขืงืจืื ื ืืฉื ื ืฉืืืฉื ืืงืืจืืช ืขืืงืจืืื ืืืืกืืคืื ืขืืืืืื: ืคืชืืื ืืกืืืจื ืฉื ืงืฉืจืื, ืืงืฉืช ื ืชืื ืื ืืืืืืจ ืืืกื ืื ืชืื ืื. ืืืจืฃ ืืจืื ืฉืืงืฉืืช DNS, ืคืชืืื ืืกืืืจื ืฉื ืืืืืจืื ืชืืคืกืื ื-13% ืืืื ืืืืฆืืข ืืืืื.
ืึทืฉืืขึธืจึธื: ืฉืืืืฉ ืืืืจ ืืืืืืจืื ืืืืฆืขืืช ืืืืื ืืืืจ ืืืคืืืช ืืช ืืืื ืฉื ืืงืฉืช HTTP ืืืืืช, ืืืืคืฉืจ ืชืคืืงื ืืืืื ืืืชืจ ืืืฉืืืื ื ืืืื ืืืชืจ.
ืืืืจืช ืืืคืืืงืฆืื - ื ืืกืื
ืื ื ืืขืืื ืื ืืช ืงืื ืืืงืืจ, ื ืกื ืืืกืืจ ืืช ืืืืืืจ ื-Postgresql ืขืืืจ ืื ืืงืฉื. ืืืคืฉืจืืช ืืจืืฉืื ื ืืื ืืืฉืชืืฉ
db, err := sql.Open("postgres", dbConnectionString)
db.SetMaxOpenConns(8)
if err != nil {
return nil, err
}
ืืืฆืืข, ืชืฆืคืืช, ื ืืชืื
ืืืืจ ืืคืขืื ืืืืฉ ืฉื ืืืืืงื ืขื 1000 ืืงืฉืืช ืืฉื ืืื, ืืจืืจ ืฉืจืืืช ืืืฉืืื ืฉื p99 ืืืจื ืื ืืจืืืืืช ืขื SLO ืฉื 60ms!
ืื ืืขืืืช?
10000 ืืงืฉืืช ืืฉื ืืื / 1000 ืืงืฉืืช ืืฉืจืช = 10 ืฉืจืชืื + 1
ืืืื ื ืขืฉื ืืช ืื ืืคืืื ืืืชืจ ืืื!
2000 ืืงืฉืืช ืืฉื ืืื
ืืืคืืช ืืขืืืก ืืจืื ืืช ืืืชื ืืืืจ, ืืืจืฃ ืืฉืืืื ืืขืืืื ืืจืื ืฉืืืคืืืงืฆืื ืืฆืืืื ืืขืื 2000 ืืงืฉืืช ืืฉื ืืื, p100 ื ืืื ื-60ms, p99 ืขืืื ื-SLO.
ืืืืื ืช ืขืืืช:
10000 ืืงืฉืืช ืืฉื ืืื / 2000 ืืงืฉืืช ืืฉืจืช = 5 ืฉืจืชืื + 1
3000 ืืงืฉืืช ืืฉื ืืื
ืืื ืืืคืืืงืฆืื ืืืืื ืืขืื 3000 ืืงืฉืืช ืขื ืืืืื p99 ืฉื ืคืืืช ื-60ms. ื-SLO ืืื ื ืืืคืจ, ืืืขืืืช ืืชืงืืืช ืืืืงืื:
10000 ืืงืฉืืช ืืฉื ืืื / ืืื 3000 ืืงืฉืืช ืืฉืจืช = 4 ืฉืจืชืื + 1 (ืืกืืคืจ ืจืืื ืืืขืื, ืืฉืืขืจ. ืึฐืชืึผืจืึฐืึธื)
ืืืื ื ื ืกื ืกืื ื ืืชืื ื ืืกืฃ.
ื ืืชืื โ ืืฉืขืจื
ืื ื ืืืกืคืื ืืืฆืืืื ืืช ืืชืืฆืืืช ืฉื ืืืชืืจ ืืืืื ืืืคืืืงืฆืื ื-3000 ืืงืฉืืช ืืฉื ืืื:
ืขืืืื 6% ืืืืื ืืืฉืงืข ืืืฆืืจืช ืงืฉืจืื. ืืืืจืช ืืืจืืื ืฉืืคืจื ืืช ืืืืฆืืขืื, ืื ืขืืืื ื ืืชื ืืจืืืช ืฉืืืคืืืงืฆืื ืืืฉืืื ืืขืืื ืขื ืืฆืืจืช ืืืืืจืื ืืืฉืื ืืืกื ืื ืชืื ืื.
ืึทืฉืืขึธืจึธื: ืืืืืจืื, ืืืจืืช ื ืืืืืชื ืฉื ืืจืืื, ืขืืืื ื ืืคืืื ืืื ืงืื, ืื ืฉืืืคืืืงืฆืื ืฆืจืืื ืืืคืก ืืืชื. ืืืืจืช ืืกืคืจ ืืืืืืจืื ืืืืชืื ืื ืืืืื ืืืืืจ ืืืืจื ืืกืืืข ืืืฉืืืื ืขื ืืื ืฆืืฆืื ืืืื ืฉืืืคืืืงืฆืื ืืฉืงืืขื ืืืฆืืจืช ืืืืืจ.
ืืืืจืช ืืืคืืืงืฆืื - ื ืืกืื
ืื ืกื ืืืชืงืื
db, err := sql.Open("postgres", dbConnectionString)
db.SetMaxOpenConns(8)
db.SetMaxIdleConns(8)
if err != nil {
return nil, err
}
ืืืฆืืข, ืชืฆืคืืช, ื ืืชืื
3000 ืืงืฉืืช ืืฉื ืืื
p99 ืืื ืคืืืช ื-60ms ืขื ืคืืืช p100 ืืฉืืขืืชืืช!
ืืืืงืช ืืจืฃ ืืืืื ืืจืื ืฉืืืืืืจ ืืืจ ืื ืืืจืืฉ! ืืืื ื ืืืืง ืืืชืจ ืคืืจืื pg(*conn).query
- ืื ืื ื ืื ืื ืฉืืื ืื ืืืืืืจ ืฉื ืืฆืจ ืืื.
ืืกืงื ื
ื ืืชืื ืืืฆืืขืื ืืื ืงืจืืื ืืืื ื ืฉืฆืืคืืืช ืืืงืื ืืืจืืฉืืช ืื ืคืื ืงืฆืืื ืืืืช ืืชืงืืืืืช. ื ืืชืื ืขื ืืื ืืฉืืืืช ืชืฆืคืืืช ืขื ืฆืืคืืืช ืืืงืืืืช ืืืื ืืขืืืจ ืืงืืืข ืื ืืงืืื ืืื ืื. Go ืืกืคืงืช ืืืื ืจืื ืขืืฆืื ืืืืื ืื ืืกืคืจืืื ืืกืื ืืจืืืช ืฉืืืคืืื ืืช ืื ืืชืื ืืคืฉืื ืื ืืืฉ.
ืืงืืจ: www.habr.com