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年でようやくマイクロサービス化してきていると言える状況になってきたので、どうやったら生産性を落とさずに信頼性を担保したマイクロサービス化がきるのか、インフラチームをリードしてきた立場から現実的な視点でお話したいと思います。

Avatar for Naoyoshi Aikawa

Naoyoshi Aikawa

July 25, 2016
Tweet

More Decks by Naoyoshi Aikawa

Other Decks in Technology

Transcript

  1. Wantedlyʹ͍ͭͯ 1 2 3      

        ྫ: ؾͷ߹͏஥ؒͱ΍Γ͍ͨγΰτΛ୳ͤΔαʔϏε ϛογϣϯ:ʮγΰτͰίίϩΦυϧਓΛ૿΍͢ʯ
  2. ✤ SRE͸ 2003 ೥ʹ࢝·ͬͨ ✤ αΠτͷ৴པੑ޲্ʹ஫ྗ͍ͯ͠Δgoogle ͷ։ൃऀʹΑͬͯߏ੒͞ΕΔ ✤ ʮجຊతʹɺSRE͸ιϑτ΢ΣΞΤϯδχ ΞʹΦϖϨʔγϣϯʹؔ͢ΔػೳઃܭΛཔ

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

    Ձ͠ͳ͍) ✤ ૬ҧ఺ ✴ ΤϯδχΞ: αʔϏεͷ੒௕͕໨ඪ
 Πϯϑϥ: ΤϯδχΞͷੜ࢈ੑ޲্͕໨ඪ
 <=> (SRE: αΠτͷ৴པੑͷ୲อ͕໨ඪ) WantedlyΠϯϑϥΤϯδχΞͱͷൺֱ
  4. ✤ Docker͸1೥൒લ͔Βಋೖ ✴ ཧ༝: Heroku͔ΒͷҠߦ ✴ σϓϩΠ࣌ؒΛ୹͔ͨͬͨ͘͠ ✤ OS΋ܦݧ͔ΒશͯCoreOS ✤

    ͱ͸͍͑ɺMonolithic Railsͩͬͨ ✴ ͦΜͳαʔϏεͳ͔ͬͨ͠… ✴ ࠓ͸αʔϏε΋૿͑ɺ࣮ࡍʹϚΠΫϩαʔϏε Խ͖͍ͯͯ͠Δ Wantedlyͷݱঢ়
  5. 1. ͜ͷ࣌఺ΑΓɺશͯͷνʔϜ͸αʔϏεΠϯλʔϑΣʔεΛ௨ͯ͡શͯ ͷσʔλͱػೳΛެ։͢Δ͜ͱ 2. ֤νʔϜ͸֤ʑͦͷΠϯλʔϑΣʔεΛ௨ͯ͡௨৴͠ͳ͚Ε͹ͳΒͳ͍ 3. ͦͷଞͷશͯͷϓϩηεؒ௨৴͸ڐՄ͞Εͳ͍ɻμΠϨΫτϦϯΫɺ ଞͷνʔϜͷσʔλιʔε͔Β௚઀σʔλΛಡΉ͜ͱɺϝϞϦڞ༗Ϟ σϧɺόοΫυΞɺશͯΛې͡ΔɻωοτϫʔΫӽ͠ͷαʔϏεΠϯλʔ ϑΣʔεΛܦ༝ͨ͠௨৴͚͕ͩڐՄ͞ΕΔ

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

    4. ࢖༻͢Δٕज़͸໰Θͳ͍ɻ HTTP ɺ Corba ɺ Pubsub ɺ ΧελϜϓ ϩτίϧɺԿͰ΋ྑ͍ɻ Bezos ͸ؾʹ͠ͳ͍ 5. શͯͷαʔϏεΠϯλʔϑΣʔε͸ɺྫ֎ͳ͘ɺ֎෦ʹެ։ՄೳͳΑ͏ ʹθϩ͔Βઃܭ͞Εͳ͚Ε͹ͳΒͳ͍ɻ͢ͳΘͪɺνʔϜ͸શੈքͷ σϕϩούʹ޲͚ͯΠϯλʔϑΣʔεΛެ։͢Δ͜ͱ͕Ͱ͖ΔΑ͏ɺઃ ܭ͠ɺܭը͠ͳ͚Ε͹ͳΒͳ͍ɻྫ֎͸ແ͍ 6. ͦ͏͠ͳ͍ऀ͸ղޏ͞ΕΔ 2002೥ʹAmazonͷࣾ௕͕ग़ͨ࢘͠ྩ http://anond.hatelabo.jp/20111018190933 = APIͰશͯΛߦ͑
  7. 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
  8. 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
  9. ϚΠΫϩαʔϏεͷਁಁͷͤ͞ํ͸ ঎඼։ൃ 1. χʔζͷൃ۷ 2. ࢼ࡞඼։ൃ 3. େྔੜ࢈ WantedlyͰͷϚΠΫϩαʔϏεԽ 1.

    APIͷՁ஋Λ͋͛Δ 2. ͍͍APIΛ࡞ΕΔΑ͏ʹ͢Δ 3. APIΛ࡞Γ΍͘͢ ঎඼։ൃʹࣅ͍ͯΔ
  10. 1. Rails͚ͩͲJavascriptΛnpmͰ؅ཧ 2. React.jsͷϜʔϒϝϯτΛ࡞Δ • Redux, Immutable.js ΋Ұॹʹೖͬͨ • ผʹAngular.jsͰ΋ྑ͍

    3. ࣾ಺ษڧձͰ͍Ζ͍Ζ
 ޿Ίͯ΋Β͏ • ࣾ಺ษڧձ΋3ճ • ֎෦ɺϒϩά΋ ΞϓϦଆ͕APIΛݩʹRender͢ΔΑ͏ʹ
  11. 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ͷௐࠪͱࢼ࡞඼ͷ࡞੒
  12. 1. APIͷυΩϡϝϯτ͸ API Blueprint͕Αͦ͞͏ • JSON Schema͸ಡΈʹ͘͘ϝϯς͕େม • Swagger͸ϚΠΫϩαʔϏεʹ͸ߴػೳ͗͢ 2.

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

    • αʔόαΠυΛࣗಈੜ੒ • ΫϥΠΞϯτଆ΋ࣗಈੜ੒ • go, C++, Java, ruby, … ios, android, js ΋ • ໰୊: • ProtocolBuffers͕JSONʹൺ΂ͯ͸΍ͬͯͳ͍ • Ұൠతʹ࣌୅͸RPC(ಈࢺత)ΑΓ͔͸REST(໊ࢺత)
  14. ࠓͭͬͯ͘·͢ - 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"` }
  15. Integrationςετͷ؆ུԽ WHY • ϚΠΫϩαʔϏε͸APIϦΫΤετ͕ଟ͘ͳΔ • ͦ͜Λmockͯ͠ςετ͢Δͷ͕ఆੴ • ஫: શ͘mockΛ࢖Θͳ͍ͰϦΫΤετͪ͠Ό͑೿΋ RudyͰ͸

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

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

    γϣϯͰ͸ͳ͘APIͰߦ͏ HOW • ͦͷAPIͷϑΥʔϚοτ͕Dockerfile, k8s ͷ rc.yml • ΠϯλʔϯͰ΋1೔Ͱॻ͚Δ͜ͱ͸࣮ূࡁΈ • ΤϯδχΞ͸ɺٕज़ελοΫΛબ΂Δ • Πϯϑϥ͸ΫϥελΛඞࢮʹ؅ཧ • KubernetesͰͨͬͨॠؒʹDatadogͰϞχλϦϯά
  18. ·ͱΊ ϚΠΫϩαʔϏεԽͷखॱ 1. APIͷՁ஋Λ͋͛Δ • ԿͰ΋API͔ΒRender͢ΔΑ͏ʹ͢Δ 2. ͍͍APIΛ࡞ΕΔΑ͏ʹ͢Δ • Heroku΍େख͔ΒϕετϓϥΫςΟεΛֶͿ

    3. APIΛ࡞Γ΍͘͢ • Auto Generator Ͱ࡞੒ͷ؆ུԽͱΫΦϦςΟ୲อ • API Gateway Pattern Ͱ౷Ұ؅ཧ • Docker + Kubernetes Ͱ؆୯ʹ্ཱͪ͛