Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Golangで支えるハイパフォーマンスAPI

 Golangで支えるハイパフォーマンスAPI

アプリ・サーバー間通信からスケーラブルなマイクロサービス間の連携まで、さまざまな状況で必要とされてきているRESTfulAPI。これをGo言語で構築し、高いパフォーマンスと高可用性を兼ね備えたサーバーを実現するまでをご紹介いたします。

Kazuhisa Togo

June 27, 2016
Tweet

More Decks by Kazuhisa Togo

Other Decks in Programming

Transcript

  1. Fatal error: Call to a member function someMethodCall() on array

    εΫϦϓτݴޠ͋Δ͋Δ ഑ྻʹରͯ͠ϝιουݺͼग़͠
  2. Fatal error: Call to a member function someMethodCall() on array

    εΫϦϓτݴޠ͋Δ͋Δ ͜Ε΋࣮ߦ͢Δ·Ͱ෼͔Βͳ͍
  3. Fatal error: Call to a member function someMethodCall() on array

    εΫϦϓτݴޠ͋Δ͋Δ GolangͳΒ ίϯύΠϧ࣌ʹݕग़Մೳ
  4. ISUCON 3 (2013) ISUCON 4 (2014) ISUCON5 (2015) 1Ґ Perl

    44% Ruby 33.3% 10૊ Ruby 44% 11૊ 2Ґ Ruby 36% Go 30.0% 9૊ Go 32% 8૊ 3Ґ Python 12% Perl 20.0% 6૊ Perl 28% 7૊ 4Ґ Go Node.js PHP 4% PHP 16.6% 5૊ LUA
 Shell Javascript 4% 1૊ ISUCON Ref: http://isucon.net
  5. ISUCON 3 (2013) ISUCON 4 (2014) ISUCON5 (2015) 1Ґ Perl

    44% Ruby 33.3% 10૊ Ruby 44% 11૊ 2Ґ Ruby 36% Go 30.0% 9૊ Go 32% 8૊ 3Ґ Python 12% Perl 20.0% 6૊ Perl 28% 7૊ 4Ґ Go Node.js PHP 4% PHP 16.6% 5૊ LUA
 Shell Javascript 4% 1૊ ISUCON Golang͕2೥࿈ଓͰຊઓ2Ґ֫ಘ Ref: http://isucon.net
  6. ISUCON 3 (2013) ISUCON 4 (2014) ISUCON5 (2015) 1Ґ Perl

    44% Ruby 33.3% 10૊ Ruby 44% 11૊ 2Ґ Ruby 36% Go 30.0% 9૊ Go 32% 8૊ 3Ґ Python 12% Perl 20.0% 6૊ Perl 28% 7૊ 4Ґ Go Node.js PHP 4% PHP 16.6% 5૊ LUA
 Shell Javascript 4% 1૊ ISUCON ͭ·Γ։ൃεϐʔυ͸े෼ʹ଎͍ Ref: http://isucon.net
  7. ͕࣌ؒ͋Ε͹࿩͢͜ͱ • GoͰྑ͔ͬͨ͜ͱ • ฒྻॲཧ͕༰қ → ؆୯ʹCPUੑೳΛ࢖͍੾ΕΔ • ඪ४ϥΠϒϥϦ͕ॆ࣮ →

    SMTP΍HTTPͷαʔόʔɺ҉߸Խ͔Βը૾ॲཧ·Ͱʂ • ֎෦ϥΠϒϥϦͷಋೖ͕ඇৗʹָ → githubͳͲͷϦϙδτϦURLΛࢦఆ͢Δ͚ͩ • ґଘؔ܎ͷ೰Έ͕ͳ͍ → Go 1.5͔ΒVendoringʹରԠ • ඪ४ͰςετػೳΛ಺ଂ → Ϣχοτςετ΍ϕϯνϚʔΫɺίʔυͷղੳɾݕূ·Ͱ • ඪ४Ͱιʔείʔυͷίϝϯτ͔ΒυΩϡϝϯτΛࣗಈੜ੒ • ଞͷίϯύΠϧܕݴޠͱൺֱͨ͠ಛ௃ • ίϯύΠϧ͕ߴ଎ → ޮ཰తͳґଘؔ܎ղੳ΍֊૚ߏ଄Λ࣋ͨͳ͍ܕͳͲɺߴ଎ʹίϯύΠϧͰ͖Δ ઃܭ • ΨϕʔδίϨΫγϣϯ → ϝϞϦʔͷղ์ʹ಄Λ೰·ͤͳͯ͘ࡁΉɻgo1.5Ͱେ෯ʹߴ଎Խ • ࣮ߦϑΝΠϧ1ͭʹશͯΛύοΩϯά → Ϗϧυ͑͢͞Ε͹ґଘؔ܎Λؾʹ͠ͳ͍͍ͯ͘
  8. • Goͷઃܭࢥ૝ → அࣺ཭ϕʔεɻόάͷੜΈʹ͘͞ͱཧղͷ͠΍͢͞ɺߴ଎͞Λॏࢹͨ͠ઃܭ • FAQ͕ͱͯ΋ॆ࣮ → ઃܭࢥ૝͕ॻ͖࿈Ͷͯ͋Δ • ྫ֎͕ͳ͍

    → ʮྫ֎͸ίʔυΛෳࡶʹ͢ΔͨΊʯ • ؔ਺΍ԋࢉࢠͷΦʔόʔϩʔυ͕ͳ͍ → ʮࠞཚ΍όάͷݩɻແ͍΄͏͕ͣͬͱγϯϓϧʯ • δΣωϦΫε͕ͳ͍ → ʮকདྷతʹ͸ಋೖͷՄೳੑɻݱࡏ͸ϕετͳઃܭΛ໛ࡧதʯ • ඪ४ͷςετεΠʔτʹΞαʔγϣϯ͕ͳ͍ → ʮਖ਼͍͠ΤϥʔॲཧͱϨϙʔτͷهड़Λଅͨ͢Ίʯ • Goʹ͓͚Δ໰୊఺ • interface{} → ܕγεςϜͷར఺͕࡟͕ΕΔɺ΍ͬͺΓδΣωϦΫεཉ͍͠ • ࡉ͔͍࢓༷·Ͱཧղ͠ͳ͍ͱࢥΘͣόάΔ͜ͱ͸·ͩ͋Δ → Sliceͷ࢓༷͸᠘ • gccgoͷ։ൃ͕ؒʹ߹ͬͯͳ͍ → Go1.5Ҏ߱͸ϏϧυࡁΈόΠφϦΛಋೖ͢Δ͔1.4ܥͷΠϯετʔ ϧ͕ඞཁɻͦͯ͠gc͸gccgoΑΓ஗͍ʢͦΕͰ΋े෼଎͍͕ʣ ͕࣌ؒ͋Ε͹࿩͢͜ͱ