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

実践!マイクロサービス

 実践!マイクロサービス

2016/07/25に行われたSRE Tech Talksでの発表内容です。
http://connpass.com/event/34825/

WantedlyはDockerを本番環境で2年ほど運用してきています。ただ、Dockerにしたところでマイクロサービス化とは程遠いところにあります。この2年でようやくマイクロサービス化してきていると言える状況になってきたので、どうやったら生産性を落とさずに信頼性を担保したマイクロサービス化がきるのか、インフラチームをリードしてきた立場から現実的な視点でお話したいと思います。

C9b46fd431b733b14acac138015f0210?s=128

Naoyoshi Aikawa

July 25, 2016
Tweet

More Decks by Naoyoshi Aikawa

Other Decks in Technology

Transcript

  1. ࣮ફʂϚΠΫϩαʔϏε /BPZPTIJ"JLBXB !BXBLJB  43&5FDI5BMLT

  2. ✤ Wantedlyʹ͸4೥2ϲ݄ɻ4ਓͷ࣌ʹೖͬͨɻ ✴ Web։ൃ => ΠϯϑϥϦʔμʔ ✴ ػցֶश΋࠷ۙ΍ͬͯ·͢ ✤ લ৬ɿGoogleͰݕࡧͷνʔϜ

    ✤ Qiita݁ߏॻ͍ͯ·͢ ࣗݾ঺հ
  3. Wantedlyʹ͍ͭͯ 1 2 3      

        ྫ: ؾͷ߹͏஥ؒͱ΍Γ͍ͨγΰτΛ୳ͤΔαʔϏε ϛογϣϯ:ʮγΰτͰίίϩΦυϧਓΛ૿΍͢ʯ
  4. Feed   Sync    Tools  ϏδωεSNSͱͯ͠ͷWantedly

    ಇ͘ਓશͯͷϓϥοτϑΥʔϜ΁
  5. Feed - γΰτͰ΍͍ͬͯΔ͜ͱΛൃ৴

  6. Feed - ֤ࣾͷαΠτʹ΋഑ஔՄೳ ֤͕ࣾɺࣾ಺৘ใ Λൃ৴͠΍͍͢ܗ ʹ ʮ͸ͨΒ͘ʯ ΛΦʔϓϯʹʂ

  7. Tools - πʔϧͷޱίϛ / Ϛʔέοτ

  8. Sync - άϧʔϓϝοηʔδ ࣾ֎ͷਓͱͷίϛϡχέʔγϣϯ΋ޮ཰తʹ

  9. 1. ͲΜͲΜ৽͍͠αʔϏεΛ
 ఏڙ͍͖͍ͯͨ͠ 2. ޮ཰։ൃ͢ΔͨΊʹɺࣗ༝ʹ
 ݴޠ΍ArchitectureΛબͼ͍ͨ 3. গਓ਺νʔϜͰߦ͍͖͍ͬͯͨ • ΤϯδχΞ:

    25ਓ • Πϯϑϥ: 3ਓ ΠϯϑϥʹٻΊΒΕ͍ͯΔ͜ͱ Go ʮطଘʯΑΓʮ৽نʯͷํ͕େมʹ python
  10. SREʹ͍ͭͯ

  11. ✤ SRE͸ 2003 ೥ʹ࢝·ͬͨ ✤ αΠτͷ৴པੑ޲্ʹ஫ྗ͍ͯ͠Δgoogle ͷ։ൃऀʹΑͬͯߏ੒͞ΕΔ ✤ ʮجຊతʹɺSRE͸ιϑτ΢ΣΞΤϯδχ ΞʹΦϖϨʔγϣϯʹؔ͢ΔػೳઃܭΛཔ

    Ήͱى͜Δ͜ͱʯ SRE by Google 8IFO43&pSTUTUBSUFEJO JUXBTDPNQPTFEPGBCVODIPG(PPHMFEFWFMPQFST XIPDBSFEBMPUBCPVUNBLJOHUIFTFSWJDFSFMJBCMF*UIJOLUIFDMFBSFTUTVNNBSZJT GSPN#FO5SFZOPS'VOEBNFOUBMMZ <43&>JTXIBUIBQQFOTXIFOZPVBTLBTPGUXBSF FOHJOFFSUPEFTJHOBOPQFSBUJPOTGVODUJPO IUUQTXXXRVPSBDPN8IBUJTJUMJLFUPCFB4JUF3FMJBCJMJUZ&OHJOFFS43&BU(PPHMF
  12. ✤ ڞ௨఺ ✴ ͲͪΒ͔ͱݴ͏ͱɺιϑτ΢ΣΞΤϯδχΞ͕͋ΓͷΠ ϯϑϥΤϯδχΞ ✴ ଓʑͱ৽ػೳ͕௥Ճ͞ΕΔαʔϏεΛɺ΄΅Ұఆͷਓ਺ Ͱ͞͹͚ΔΑ͏ʹ͢Δ ✴ ίʔυΊͬͪΌॻ͘(ίʔυʹͳͬͯͳ͍΋ͷ͸جຊධ

    Ձ͠ͳ͍) ✤ ૬ҧ఺ ✴ ΤϯδχΞ: αʔϏεͷ੒௕͕໨ඪ
 Πϯϑϥ: ΤϯδχΞͷੜ࢈ੑ޲্͕໨ඪ
 <=> (SRE: αΠτͷ৴པੑͷ୲อ͕໨ඪ) WantedlyΠϯϑϥΤϯδχΞͱͷൺֱ
  13. ϚΠΫϩαʔϏεͰԿ͕خ͍͔͠ εέʔϧͤ͞΍͍͢ ػಈతͳ૊৫ ʢίϯ΢ΣΠͷ๏ଇʣ ো֐ͷӨڹ͕෦෼త ݸผσϓϩΠ ࢖༻ٕज़ɾݴޠ ͕ࣗ༝ʹ ϞδϡʔϧԽ มԽʹڧ͍

    ࣺͯ΍͍͢
  14. ϚΠΫϩαʔϏεͰԿ͕خ͍͔͠ εέʔϧͤ͞΍͍͢ ػಈతͳ૊৫ ʢίϯ΢ΣΠͷ๏ଇʣ ো֐ͷӨڹ͕෦෼త ݸผσϓϩΠ ࢖༻ٕज़ɾݴޠ ͕ࣗ༝ʹ ϞδϡʔϧԽ มԽʹڧ͍

    ࣺͯ΍͍͢ ͱΓ͋͑ͣօ͍͍ͱࢥͬͯΔ ͚Ͳɺ࣮ࡍ΍Δͷେม…
  15. ✤ Docker͸1೥൒લ͔Βಋೖ ✴ ཧ༝: Heroku͔ΒͷҠߦ ✴ σϓϩΠ࣌ؒΛ୹͔ͨͬͨ͘͠ ✤ OS΋ܦݧ͔ΒશͯCoreOS ✤

    ͱ͸͍͑ɺMonolithic Railsͩͬͨ ✴ ͦΜͳαʔϏεͳ͔ͬͨ͠… ✴ ࠓ͸αʔϏε΋૿͑ɺ࣮ࡍʹϚΠΫϩαʔϏε Խ͖͍ͯͯ͠Δ Wantedlyͷݱঢ়
  16. Ͳ͏ͳͬͨΒ ϚΠΫϩαʔϏε͔

  17. 1. ͜ͷ࣌఺ΑΓɺશͯͷνʔϜ͸αʔϏεΠϯλʔϑΣʔεΛ௨ͯ͡શͯ ͷσʔλͱػೳΛެ։͢Δ͜ͱ 2. ֤νʔϜ͸֤ʑͦͷΠϯλʔϑΣʔεΛ௨ͯ͡௨৴͠ͳ͚Ε͹ͳΒͳ͍ 3. ͦͷଞͷશͯͷϓϩηεؒ௨৴͸ڐՄ͞Εͳ͍ɻμΠϨΫτϦϯΫɺ ଞͷνʔϜͷσʔλιʔε͔Β௚઀σʔλΛಡΉ͜ͱɺϝϞϦڞ༗Ϟ σϧɺόοΫυΞɺશͯΛې͡ΔɻωοτϫʔΫӽ͠ͷαʔϏεΠϯλʔ ϑΣʔεΛܦ༝ͨ͠௨৴͚͕ͩڐՄ͞ΕΔ

    4. ࢖༻͢Δٕज़͸໰Θͳ͍ɻ HTTP ɺ Corba ɺ Pubsub ɺ ΧελϜϓ ϩτίϧɺԿͰ΋ྑ͍ɻ Bezos ͸ؾʹ͠ͳ͍ 5. શͯͷαʔϏεΠϯλʔϑΣʔε͸ɺྫ֎ͳ͘ɺ֎෦ʹެ։ՄೳͳΑ͏ ʹθϩ͔Βઃܭ͞Εͳ͚Ε͹ͳΒͳ͍ɻ͢ͳΘͪɺνʔϜ͸શੈքͷ σϕϩούʹ޲͚ͯΠϯλʔϑΣʔεΛެ։͢Δ͜ͱ͕Ͱ͖ΔΑ͏ɺઃ ܭ͠ɺܭը͠ͳ͚Ε͹ͳΒͳ͍ɻྫ֎͸ແ͍ 6. ͦ͏͠ͳ͍ऀ͸ղޏ͞ΕΔ 2002೥ʹAmazonͷࣾ௕͕ग़ͨ࢘͠ྩ http://anond.hatelabo.jp/20111018190933
  18. 1. ͜ͷ࣌఺ΑΓɺશͯͷνʔϜ͸αʔϏεΠϯλʔϑΣʔεΛ௨ͯ͡શͯ ͷσʔλͱػೳΛެ։͢Δ͜ͱ 2. ֤νʔϜ͸֤ʑͦͷΠϯλʔϑΣʔεΛ௨ͯ͡௨৴͠ͳ͚Ε͹ͳΒͳ͍ 3. ͦͷଞͷશͯͷϓϩηεؒ௨৴͸ڐՄ͞Εͳ͍ɻμΠϨΫτϦϯΫɺ ଞͷνʔϜͷσʔλιʔε͔Β௚઀σʔλΛಡΉ͜ͱɺϝϞϦڞ༗Ϟ σϧɺόοΫυΞɺશͯΛې͡ΔɻωοτϫʔΫӽ͠ͷαʔϏεΠϯλʔ ϑΣʔεΛܦ༝ͨ͠௨৴͚͕ͩڐՄ͞ΕΔ

    4. ࢖༻͢Δٕज़͸໰Θͳ͍ɻ HTTP ɺ Corba ɺ Pubsub ɺ ΧελϜϓ ϩτίϧɺԿͰ΋ྑ͍ɻ Bezos ͸ؾʹ͠ͳ͍ 5. શͯͷαʔϏεΠϯλʔϑΣʔε͸ɺྫ֎ͳ͘ɺ֎෦ʹެ։ՄೳͳΑ͏ ʹθϩ͔Βઃܭ͞Εͳ͚Ε͹ͳΒͳ͍ɻ͢ͳΘͪɺνʔϜ͸શੈքͷ σϕϩούʹ޲͚ͯΠϯλʔϑΣʔεΛެ։͢Δ͜ͱ͕Ͱ͖ΔΑ͏ɺઃ ܭ͠ɺܭը͠ͳ͚Ε͹ͳΒͳ͍ɻྫ֎͸ແ͍ 6. ͦ͏͠ͳ͍ऀ͸ղޏ͞ΕΔ 2002೥ʹAmazonͷࣾ௕͕ग़ͨ࢘͠ྩ http://anond.hatelabo.jp/20111018190933 = APIͰશͯΛߦ͑
  19. Microservices׬੒ܗ API Gateway Swift Android Java React Angular API Request

    API Request Kong Kubernetes Go Rails Python api.wantedly.com /bot /v2 /v1 Mobile PC
  20. Microservicesͷલ (Monolithic) Swift Android Java Rails API Request Render HTML

    Rails www.wantedly.com Mobile PC
  21. Microservices׬੒ܗ API Gateway Swift Android Java React Angular API Request

    API Request Kong Kubernetes Go Rails Python api.wantedly.com /bot /v2 /v1 Mobile PC
  22. ϚΠΫϩαʔϏεͷ ɹɹɹਁಁͷͤ͞ํ

  23. ϚΠΫϩαʔϏεͷਁಁͷͤ͞ํ͸ ঎඼։ൃ 1. χʔζͷൃ۷ 2. ࢼ࡞඼։ൃ 3. େྔੜ࢈ WantedlyͰͷϚΠΫϩαʔϏεԽ 1.

    APIͷՁ஋Λ͋͛Δ 2. ͍͍APIΛ࡞ΕΔΑ͏ʹ͢Δ 3. APIΛ࡞Γ΍͘͢ ঎඼։ൃʹࣅ͍ͯΔ
  24. "1*ͷՁ஋Λ͋͛Δ

  25. 1. Rails͚ͩͲJavascriptΛnpmͰ؅ཧ 2. React.jsͷϜʔϒϝϯτΛ࡞Δ • Redux, Immutable.js ΋Ұॹʹೖͬͨ • ผʹAngular.jsͰ΋ྑ͍

    3. ࣾ಺ษڧձͰ͍Ζ͍Ζ
 ޿Ίͯ΋Β͏ • ࣾ಺ษڧձ΋3ճ • ֎෦ɺϒϩά΋ ΞϓϦଆ͕APIΛݩʹRender͢ΔΑ͏ʹ
  26. ϓϩμΫτΤϯδχΞͷԠԉ ʢͳʹ΋ͯ͠ͳ͍ʣ ΠϯϑϥΤϯδχΞͷͨ͜͠ͱ

  27. Ͱ΋ɺͦΕ͕Ұ൪ॏཁʂʂ

  28. WHY: ඞཁͳ͍΋ͷʹ࣌ؒ͸औΕͳ͍

  29. 1. ࠷ۙྲྀߦΓͷػցֶशͱབྷΊ 2. ߴ଎Խ/লϝϞϦ͕ॏཁʹͳ͖ͬͯͨ͜ͱͱབྷΊ ͍ͭͰʹ Python Go ಋೖͯ͠·͢ɻ

  30. ͍͍"1*Λ࡞ΕΔΑ͏ʹ

  31. 1. ͍͍APIΛௐࠪ • Heroku API Design, Facebook APIͷભҠ͕ͱͯ΋ࢀߟʹ 2. Heroku

    API Design Ͱجૅशಘ • όʔδϣϯ͸ϔομͰࢦఆ • ϖʔδωʔγϣϯ৘ใ΋ϔομʹ • Ϧιʔεͷωετ͸ /users/:id/posts ͷϨϕϧ·Ͱ 3. Facebook API Ͱ࣮ફٕज़शಘ • Batch APIͱ͍͏ߟ͑ํ • ϑΟʔϧυࢦఆ͸ඞਢʹ • /me?fields=id,name 4. ࣮ࡍʹখ͘͞ࢼ࡞඼Λ࡞Δ ͍͍APIͷௐࠪͱࢼ࡞඼ͷ࡞੒
  32. 1. APIͷυΩϡϝϯτ͸ API Blueprint͕Αͦ͞͏ • JSON Schema͸ಡΈʹ͘͘ϝϯς͕େม • Swagger͸ϚΠΫϩαʔϏεʹ͸ߴػೳ͗͢ 2.

    DreddͰجຊతͳΤϯυϙΠϯτͷςετ΋Ͱ͖Δ • ݴޠʹΑΒͳ͍ͷ͕ྑ͍ 3. GoͰwebmockςετΛॻ͘ͷ͸͔ͳΓେม • ؔ਺Λஔ͖׵͑ΒΕͳ͍ͷͰɺͲ͔͜ͰҾ਺౉͠ͷඞཁ͕… 4. ΍Γա͗෦෼ͷൃݟ • FacebookͷfieldsΛશ෦໌ࣔࢦఆ͠ͳ͍ͱ͍͚ͳ͍ͷ͸΍Γ͢ ͗… ࢼ࡞඼࡞੒ͰΘ͔ͬͨ͜ͱ
  33. "1*Λ࡞Γ΍͘͢

  34. 1. Auto Generatorͷ࡞੒ 2. Integrationςετ؆ུԽͷͨΊͷπʔϧ 3. ύοͱαʔϏεΛ্ཱͪ͛ΒΕΔΠϯϑϥ 4. ৭ΜͳAPIΛ౷߹؅ཧ APIΛ࡞Γ΍͘͢

  35. Auto Generator ͷ࡞੒ WHY • MicroʹͰ͖ΔRailsతͳ΋ͷ͕ཉ͍͠ • ࣮͸gRPC/Protocol Buffers͕ιϨͩͬͨΓ… gRPC

    • αʔόαΠυΛࣗಈੜ੒ • ΫϥΠΞϯτଆ΋ࣗಈੜ੒ • go, C++, Java, ruby, … ios, android, js ΋ • ໰୊: • ProtocolBuffers͕JSONʹൺ΂ͯ͸΍ͬͯͳ͍ • Ұൠతʹ࣌୅͸RPC(ಈࢺత)ΑΓ͔͸REST(໊ࢺత)
  36. ࠓͭͬͯ͘·͢ - wantedly/apig ࢓༷ • Input: Gormͱ͍͏ORϚούʔܗࣜͰॻ͘Goͷstruct • Output: αʔόʔίʔυҰࣜ(ςετɺυΩϡϝϯτ෇͖)

    package models import "time" type User struct { ID uint `gorm:"primary_key;AUTO_INCREMENT" json:"id"` Name string `gorm:"unique" json:"name,omitempty"` Emails []Email `gorm:"unique" json:"emails"` CreatedAt *time.Time `json:"created_at"` UpdatedAt *time.Time `json:"updated_at"` }
  37. wantedly/apig - ੜ੒͞ΕΔυΩϡϝϯτ

  38. Integrationςετͷ؆ུԽ WHY • ϚΠΫϩαʔϏε͸APIϦΫΤετ͕ଟ͘ͳΔ • ͦ͜Λmockͯ͠ςετ͢Δͷ͕ఆੴ • ஫: શ͘mockΛ࢖Θͳ͍ͰϦΫΤετͪ͠Ό͑೿΋ RudyͰ͸

    • webmock, vcrͱ͍͏΋ͷ͕͋Δ • ॳճ: ΄ΜͱʹϦΫΤετͯ͠ɺ݁ՌΛه࿥ • 2ճ໨Ҏ߱: ه࿥ͨ݁͠ՌΛ࠶ੜ • Ruby͸ϝιου࣮૷Λಈతʹॻ͖׵͑ΒΕΔͷͰͰ͖Δ GoͰ͸ɺͰ͖ͳ͍
  39. ϓϩΩγͰvcrΛ࣮ݱ - webmock-proxy ࣗ෼ͷ αʔϏε ֎෦ αʔϏε ϓ ϩ Ω

    γ ϦΫΤετΛ ه࿥ ରԠ͢Δ ϨεϙϯεΛ ه࿥ ϓϩΩγ͕ ݁ՌΛฦ͢ ॳճ ̎ճ໨
  40. ͺͬͱαʔϏεΛ্ཱͪ͛Δ Docker / Kubernetes Ͱ؅ཧ • ৄࡉ͸ɺ·ͨผͷػձʹɻطʹز͔ͭൃදͯ͠·͢ɻ WHY • ϚΠΫϩαʔϏενʔϜ͸ΠϯϑϥͷґཔΛίϛϡχέʔ

    γϣϯͰ͸ͳ͘APIͰߦ͏ HOW • ͦͷAPIͷϑΥʔϚοτ͕Dockerfile, k8s ͷ rc.yml • ΠϯλʔϯͰ΋1೔Ͱॻ͚Δ͜ͱ͸࣮ূࡁΈ • ΤϯδχΞ͸ɺٕज़ελοΫΛબ΂Δ • Πϯϑϥ͸ΫϥελΛඞࢮʹ؅ཧ • KubernetesͰͨͬͨॠؒʹDatadogͰϞχλϦϯά
  41. from https://getkong.org/ ͍ΖΜͳAPIΛ౷߹؅ཧ Auth, Logging, Rate Limit
 ͳͲΛҰׅରԠ API Gateway

    Pattern by Kong
  42. Google APIs ΋ API Gateway Pattern

  43. ·ͱΊ ϚΠΫϩαʔϏεԽͷखॱ 1. APIͷՁ஋Λ͋͛Δ • ԿͰ΋API͔ΒRender͢ΔΑ͏ʹ͢Δ 2. ͍͍APIΛ࡞ΕΔΑ͏ʹ͢Δ • Heroku΍େख͔ΒϕετϓϥΫςΟεΛֶͿ

    3. APIΛ࡞Γ΍͘͢ • Auto Generator Ͱ࡞੒ͷ؆ུԽͱΫΦϦςΟ୲อ • API Gateway Pattern Ͱ౷Ұ؅ཧ • Docker + Kubernetes Ͱ؆୯ʹ্ཱͪ͛
  44. ͜ͷଓ͖ɺҰॹʹ΍Γ·ͤΜ͔ʁ

  45. 5IBOLZPV /BPZPTIJ"JLBXB !BXBLJB