$30 off During Our Annual Pro Sale. View Details »

安全かつ高速に進めるマイクロサービス化 / railsdm2018

安全かつ高速に進めるマイクロサービス化 / railsdm2018

Rails Developers Meetup 2018
https://railsdm.github.io/

Takashi Kokubun

March 24, 2018
Tweet

More Decks by Takashi Kokubun

Other Decks in Programming

Transcript

  1. ҆શ͔ͭߴ଎ʹਐΊΔ
    ϚΠΫϩαʔϏεԽ
    3BJMT%FWFMPQFST.FFUVQ
    !LLVCVO

    View Slide

  2. ࣗݾ঺հ
    • GitHub, Twitter: @k0kubun

    • Treasure Data ॴଐ

    • Site Reliability Engineer

    • Ruby 2.6ͷJITίϯύΠϥ։ൃத

    View Slide

  3. Treasure Data Ͱͷ1೥ؒ
    • 2017 1Q: TD APIͷ։ൃ

    • 2017 2Q: bigdam-queue

    • 2017 3Q: Fluentd Enterprise

    • 2017 4Q: Embulk Config Microservice

    • 2018 1Q: SRE: AutoScaling, Deployment

    View Slide

  4. ࠓ೔࿩͢͜ͱ
    1. αʔϏε෼ׂͷલʹߟ͑Δ΂͖͜ͱ

    2. ҆શ͔ͭߴ଎ʹ෼ׂ͢ΔͨΊͷςετख๏

    3. Railsʹ͓͚ΔϦτϥΠͷ࣮૷ύλʔϯ

    4. RailsΞϓϦͷ੾Γग़͠Ͱࠔ೉ͳ఺

    5. ҆શʹσϓϩΠ؀ڥΛվળ͍ͯ͘͠࿩

    View Slide

  5. 1. αʔϏε෼ׂͷલʹߟ͑Δ΂͖͜ͱ

    View Slide

  6. ϚΠΫϩαʔϏεԽͰ
    ԿΛղܾ͠·͔͢?
    Q1.

    View Slide

  7. ฐࣾͷࠓճͷαʔϏε෼ׂͷܦҢ
    ஫: ࠓճͷ੾Γग़͠ͰͲΕ΋طʹେମղܾࡁͰ͢!!!

    View Slide

  8. Ϟσϧͷ࣮૷ͷఆ͕ٛYAMLͱͯ͠
    ผϦϙδτϦʹ੾Γग़͞Ε͍ͯΔ

    View Slide

  9. ຊମͷRailsΞϓϦͱ͸ผʹϦϦʔε͢ΔͨΊɺ
    ͦͷYAMLΛDBʹͭͬ͜ΜͰಈతʹڍಈΛมߋ
    + APIͰͦΕ͕ϦϦʔεͰ͖Δঢ়ଶ

    View Slide

  10. APIʹΑΔYAMLͷϦϦʔεͰϝιουͷఆ͕ٛ
    ಈతʹมΘΔͷͰɺϝιουΛݺͼग़͢౓ʹΫ
    ΤϦ͕ඞཁʹͳΓ஗͍

    View Slide

  11. ͦ΋ͦ΋੾Γग़͞Ε͍ͯͳ͍Railsͷίʔυ
    ͱYAML͕ڧ݁߹ͳ͜ͱʹΑΔϦϦʔεॱং
    ґଘͷൃੜͱͦΕʹΑΔো֐

    View Slide

  12. ຊ౰͸1ͭͷϦϙδτϦʹͨ͠ํ͕͍͍ʹܾ·͍ͬͯΔ͕ɺ
    Ͱ͖Ε͹੹຿Λ໌֬ʹ෼཭ͯ͠νʔϜؒͷίϛϡχέʔγϣ
    ϯίετΛԼ͛ͨΓಠཱʹϦϦʔεͨ͠Γ͍ͨ͠

    View Slide

  13. => YAML͡Όͳͯͪ͘ΌΜͱαʔϏεͱͯ͠෼཭͠Α͏

    View Slide

  14. ϚΠΫϩαʔϏεԽͰൃੜ͢Δ
    ໰୊͸શͯڐ༰Ͱ͖·͔͢?
    Q2.

    View Slide

  15. ڥքΛލ͍ͰJOIN͕Ͱ͖ͳ͍

    View Slide

  16. DBΛ෼཭͢ΔͱɺͦΕΛލ͙τϥ
    ϯβΫγϣϯ͕͔͚ΒΕͣҰ؏ੑ͕
    ୲อͰ͖ͳ͘ͳΔ

    View Slide

  17. ϦιʔεΛऔΔͨΊʹී௨ͷ
    ActiveRecordͷίʔυ͕࢖͑ͳ͍

    View Slide

  18. ো֐ൃੜݯͷ૿Ճ

    View Slide

  19. αʔϏε͕૿͑Δ͜ͱʹΑΔ
    Πϯϑϥ؅ཧ/ӡ༻ίετͷ૿େ

    View Slide

  20. ΤϯυϙΠϯτؙ͝ͱ෼཭͢Δ?
    ಺෦APIʹ͍ͯ͠ΖΜͳ৔ॴ͔Βୟ͘?
    Q3.

    View Slide

  21. ࠓճ͸಺෦APIدΓͷɺ͔͠΋
    ࠷ॳ͔Βͦ͏࡞ΔͷͰ͸ͳ్͘
    தͰ੾Γग़࣌͢ͷ࿩Λ͠·͢

    View Slide

  22. 2. ҆શ͔ͭߴ଎ʹ෼ׂ͢ΔͨΊͷςετख๏

    View Slide

  23. ϚΠΫϩαʔϏεԽͷ࠷த
    ͲͷΑ͏ʹςετ͠·͔͢?

    View Slide

  24. ओͳςετͷબ୒ࢶ
    • ϝιουݺͼग़͠୯ҐͰڥքΛશͯελϒ͢Δ

    • VCRͰ֎෦ͷϦΫΤετΛશͯελϒ͢Δ

    • ಈ͔͢ίϯϙʔωϯτΛશͯ༻ҙͯ݁͠߹ςετ

    • Pact Ͱ Consumer Driven Contract Testing
    ࢀߟ: https://medium.com/@copyconstruct/testing-microservices-the-sane-way-9bb31d158c16

    View Slide

  25. ςετͰ۩ମతʹԿΛୡ੒͍ͨ͠ͷ͔
    • ୯ͳΔίϐϖͰࡁΈͦ͏ʹͳ͘ɺ੾Γग़͢ॠ͕ؒҰ൪Ϧε
    Ϋ͕ߴ͍ͷͰɺͲ͏ʹ͔͚ͯͦͩ҆͜͠શʹࡁ·͍ͤͨ

    • ͔ͱ͍ͬͯઐ༻ͷςετΛҰ͔Βॻ͖·͘Δ΄ͲՋͰ͸ͳ
    ͍ͷͰɺۃྗطଘͷςετࢿ࢈Λྲྀ༻͍ͨ͠

    • ͦͯ͠ଞͷ։ൃΛશ͘ࢭΊͨ͘ͳ͍ͷͰςετ͕ৗʹ࢓༷
    ͷมߋʹ௥ैͰ͖ͳ͍ͱ͍͚ͳ͍

    View Slide

  26. ओͳςετͷબ୒ࢶ
    • ϝιουݺͼग़͠୯ҐͰڥքΛશͯελϒ͢Δ

    • VCRͰ֎෦ͷϦΫΤετΛશͯελϒ͢Δ

    • ಈ͔͢ίϯϙʔωϯτΛશͯ༻ҙͯ݁͠߹ςετ

    • Pact Ͱ Consumer Driven Contract Testing
    ࢓༷มߋʹର͢Δ
    ελϒͷ௥ैΛ๨Εͦ͏

    View Slide

  27. ओͳςετͷબ୒ࢶ
    • ϝιουݺͼग़͠୯ҐͰڥքΛશͯελϒ͢Δ

    • VCRͰ֎෦ͷϦΫΤετΛશͯελϒ͢Δ

    • ಈ͔͢ίϯϙʔωϯτΛશͯ༻ҙͯ݁͠߹ςετ

    • Pact Ͱ Consumer Driven Contract Testing
    ୭͕Χηοτߋ৽͢Δͷ? ࣗಈͰߋ৽͢Δ
    ͳΒΧηοτʹͯ͠Δҙຯͳ͘ͳ͍?

    View Slide

  28. ओͳςετͷબ୒ࢶ
    • ϝιουݺͼग़͠୯ҐͰڥքΛશͯελϒ͢Δ

    • VCRͰ֎෦ͷϦΫΤετΛશͯελϒ͢Δ

    • ಈ͔͢ίϯϙʔωϯτΛશͯ༻ҙͯ݁͠߹ςετ

    • Pact Ͱ Consumer Driven Contract Testing
    ͜Ε͸ݩ͔Β͋ͬͯɺϝϯςίετ
    ͸ߴ͍͕ҰԠͦͷ··࢖͑Δ

    View Slide

  29. ओͳςετͷબ୒ࢶ
    • ϝιουݺͼग़͠୯ҐͰڥքΛશͯελϒ͢Δ

    • VCRͰ֎෦ͷϦΫΤετΛશͯελϒ͢Δ

    • ಈ͔͢ίϯϙʔωϯτΛશͯ༻ҙͯ݁͠߹ςετ

    • Pact Ͱ Consumer Driven Contract Testing
    ࢓༷มߋΛ͢Δਓͨͪʹ͜ΕΛֶशͯ͠΋Β͏ίετ͕ߴ
    ͗͢Δ + Pact Brokerͷ༻ҙ΍ӡ༻΋ඞཁͳͷͰɺҰճͷ
    ੾Γग़͠Ͱಋೖ͢Δʹ͸ΦʔόʔΩϧ (௕ظతʹ͸ཉ͍͠)

    View Slide

  30. ͡Ό͋݁߹ςετ͚ͩΛཔΓʹͰ͖Δͷ͔?
    • ݱঢ়ɺ݁߹ςετ͸ओʹΫϦςΟΧϧͳڍಈʹରͯ͠ͷΈ
    ॻ͔Ε͓ͯΓɺͦΕ͚ͩͩͱखബ͍

    • ͔ͱ͍ͬͯແҋʹ݁߹ςετΛ૿΍͢ͱอक͕͠ΜͲ͍

    • ςετࣗମͷอक͕νʔϜʹด͡ͳ͘ͳΔͷͰίϛϡχ
    έʔγϣϯίετ͕ൃੜ

    • ނো఺͕ଟͯ͘ෆ҆ఆʹͳΓ͕ͪ (ಛʹCapybaraͱ͔)

    View Slide

  31. ੾Γग़͠ݩΞϓϦͷrspecϓϩηε
    spec_helper.rb
    ࠓճ࢖༻ͨ͠ςετख๏: ੾Γग़ͨ͠ΞϓϦ
    Λىಈͯ͠ϢχοτςετΛ૸ΒͤΔ

    View Slide

  32. ੾Γग़͠ݩΞϓϦͷrspecϓϩηε
    spec_helper.rb
    ੾Γग़ͨ͠RailsΞϓϦ
    ͷϓϩηε
    at_exit
    ࠓճ࢖༻ͨ͠ςετख๏: ੾Γग़ͨ͠ΞϓϦ
    Λىಈͯ͠ϢχοτςετΛ૸ΒͤΔ
    Spawn
    Kill

    View Slide

  33. ੾Γग़͠ݩΞϓϦͷrspecϓϩηε
    spec_helper.rb
    at_exit
    ڞ༗DB
    (ޙͰ੾Γ཭͢)
    ࠓճ࢖༻ͨ͠ςετख๏: ੾Γग़ͨ͠ΞϓϦ
    Λىಈͯ͠ϢχοτςετΛ૸ΒͤΔ
    *_spec.rb FactoryBot
    ੾Γग़͢࠷த͸·ͩDB͕ڞ༗͞ΕͯΔ
    ͜ͱΛҰ࣌తʹ׆͔ͯ͠ςετΛಈ͔͢
    ੾Γग़ͨ͠RailsΞϓϦ
    ͷϓϩηε

    View Slide

  34. ੾Γग़͠ݩΞϓϦͷrspecϓϩηε
    spec_helper.rb
    at_exit
    ڞ༗DB
    (ޙͰ੾Γ཭͢)
    ࠓճ࢖༻ͨ͠ςετख๏: ੾Γग़ͨ͠ΞϓϦ
    Λىಈͯ͠ϢχοτςετΛ૸ΒͤΔ
    *_spec.rb FactoryBot
    ੾Γग़ͨ͠RailsΞϓϦ
    ͷϓϩηε
    ੾Γग़͠ݩ
    RailsΞϓϦ
    Կ΋ελϒͤͣϦΫΤετ

    View Slide

  35. ੾Γग़͠ݩΞϓϦͷrspecϓϩηε
    spec_helper.rb
    at_exit
    ڞ༗DB
    (ޙͰ੾Γ཭͢)
    ࠓճ࢖༻ͨ͠ςετख๏: ੾Γग़ͨ͠ΞϓϦ
    Λىಈͯ͠ϢχοτςετΛ૸ΒͤΔ
    *_spec.rb FactoryBot
    ੾Γग़ͨ͠RailsΞϓϦ
    ͷϓϩηε
    ੾Γग़͠ݩ
    RailsΞϓϦ
    ੾Γग़ͨ͠DB
    DBͷ੾Γ཭͠ʹ൐͍FactoryBotΛଔۀ
    ͔ΘΓʹAPIͰϦιʔεΛ࡞Δ

    View Slide

  36. ͜ͷख๏ͷྑ͍ͱ͜Ζɺѱ͍ͱ͜Ζ
    • ྑ͍ͱ͜Ζ

    • ଞͷਓ͕มߋͨ͠ςετΛ΄΅ͦͷ··࢖͑ɺͱʹ͔͘࢓༷มߋʹڧ͍

    • Կ΋ελϒ͠ͳ͍͍ͯ͘ͷͰςετΛॻ͘ͷָ͕

    • ѱ͍ͱ͜Ζ

    • ੾Γग़͠ݩͷCIͷ͕࣌ؒ৳ͼΔ

    • ੾Γग़ͨ͠ΞϓϦΛىಈ͢ΔखஈΛϝϯς͢Δίετ͕͔͔Δ

    • ੾Γग़ͨ͠ΞϓϦ಺ͰյΕͨ࣌ͷσόοάํ๏͕গ͠มΘΔͷͰ໘౗

    View Slide

  37. ۜͷ஄ؙ͸ͳ͍ͷͰࣗ෼ͨͪͷϑΣʔζ΍ཁ݅
    ʹ߹ΘͤͯॊೈʹղܾࡦΛม͑ଓ͚·͠ΐ͏

    View Slide

  38. 3. Railsʹ͓͚ΔϦτϥΠͷ࣮૷ύλʔϯ

    View Slide

  39. ΤϥʔϋϯυϦϯάͷ؍఺Ͱ
    ೚ҙͷAPIΫϥΠΞϯτʹٻΊΒΕΔཁ݅
    • ඇܾఆతͳΤϥʔʹରͯ͠exponential backoff͖ͭͰϦτ
    ϥΠͰ͖Δ

    • λΠϜΞ΢τΛઃ͚͍ͯΔ (ແݶʹϋϯά͠ͳ͍)

    • αʔϏε͕མ͍ͪͯΔ͜ͱ͕໌Β͔ͳ৔߹ɺҰఆظؒϦ
    ΫΤετΛεΩοϓͰ͖Δ (Circuit Breaker)

    View Slide

  40. Circuit BreakerύλʔϯͷͨΊͷϥΠϒϥϦ
    • circuit_breaker.gem

    • γϯϓϧɺ͚ͩͲmix-inͳͷͰݸਓతʹ͸͋·Γ࢖͍ͨ͘ͳ͍

    • expeditor.gem

    • Circuit Breaker͚ͩͰͳ͘ɺϦτϥΠɺλΠϜΞ΢τɺࣦഊ࣌
    ͷϑΥʔϧόοΫɺඇಉظԽͳͲ΋࣮૷

    • ਖ਼௚expeditorʹඇಉظԽ͸͍Βͳ͔ͬͨΜ͡Όͳ͍͔ͱࢥͬͯ
    Δ͚ͲɺฐࣾͰ͸makimoto͞Μͱ๻͕ৄ͍͠ͷͰ͜ΕΛ࠾༻

    View Slide

  41. ࣮ࡍͷAPIΫϥΠΞϯτͷྫ (GET)

    View Slide

  42. ϦτϥΠઓུ
    • exponential backoffΛ͚ͭɺແཧʹෛՙΛ͔͚ͳ͍Α͏ʹ

    • 5XXͰ΋ɺϦτϥΠՄೳͳ͜ͱ͕໌Β͔Ͱͳ͍Τϥʔ͸ઈରϦτϥΠ͠ͳ͍
    • ΫϥΠΞϯτଆͷϫʔΧʔΛແବʹϒϩοΫͨ͠Γɺαʔόʔଆͷো֐࣌ʹෛՙΛ͔͚Α
    Γঢ়گΛѱԽͤͨ͞Γ͢ΔͨΊ

    • ྫ͑͹500͸NoMethodErrorͱ͔ͩͬͨΓ͢ΔͷͰϦτϥΠ͢΂͖Ͱͳ͍

    • ϦτϥΠࠐΈͷશମͷλΠϜΞ΢τͱɺ֤ϦτϥΠͷλΠϜΞ΢τΛઃ͚Δ

    • ҰॠͰࢮ͵ΤϥʔΛΑΓଟΊʹϦτϥΠ͢ΔͨΊ

    • ͲͷΤϥʔ͕ϦτϥΠՄೳ͔͸APIʹΑͬͯҟͳΔ

    • ֤HTTPϝιου͝ͱʹ᠟౳ੑʹؔ͢ΔڍಈΛαʔόʔଆͰ౷Ұ͓ͯ͘͠ͱָ

    View Slide

  43. RailsͰසൟʹ࡞ΒΕͦ͏ͳҎԼͷύλʔϯͰ
    APIαʔόʔ/ΫϥΠΞϯτΛͲ͏࣮૷͢Δ͔
    • GET /embulk_configs (index)

    • GET /embulk_configs/:id (show)

    • POST /embulk_configs (create)

    • PATCH /embulk_configs/:id (update)

    • DELETE /embulk_configs/:id (destroy)
    APIͩͱ #new, #edit ͸࡞Γ·ͤΜΑͶ?

    View Slide

  44. GET /embulk_configs (index)
    • αʔόʔ

    • ౰ͨΓલ͚ͩͲGET͸શͯϩάҎ֎ͷ෭࡞༻͕ͳ͍Α͏ʹ͢Δ

    • ΫϥΠΞϯτ

    • ΄΅ϦτϥΠ͠์୊͚ͩͲɺલड़ͷཧ༝ʹΑΓ404, 422, 500
    ͱ͔͸΍Ί͓͖ͯ·͠ΐ͏

    • αʔόʔ͕མͪͯΔܥ(502, 503)ͱΫϥΠΞϯτͰλΠϜΞ΢
    τͨ͠ܥΛϦτϥΠ͢Δ

    View Slide

  45. GET /embulk_configs/:id (show)
    • GETͳͷͰ#indexͱಉ͡ঢ়ଶʹ͓ͯ͘͠

    View Slide

  46. POST /embulk_configs (create)
    • αʔόʔ

    • ࡞੒ର৅ͷϦιʔεʹunique index͕͋Δ: RecordNotUnique࣌ͷϨεϙϯεΛ
    ۠ผՄೳʹ͢Δ (409ฦ͢ͱ͔)

    • ͳ͍: ϦΫΤετIDΈ͍ͨͳ΋ͷΛΫϥΠΞϯτʹ༻ҙͤ͞ɺͦΕΛ͚࣋ͭͩͷ
    ςʔϒϧͷϨίʔυͱ࡞੒ର৅ͷϦιʔεΛτϥϯβΫγϣϯͰίϛοτ͢Δ

    • ΫϥΠΞϯτ

    • 409 Conflictͷ৔߹͸ϦτϥΠ͠ͳ͍

    • ϦΫΤετIDΛ༻ҙ͢Δ৔߹͸SecureRandom.uuidͱ͔Λ༻ҙ͠ɺϦτϥΠͷ
    ؒͰ͸ಉ͡஋͕౉ΔΑ͏ʹ͢Δ
    409ͷ࿩ͷݩωλ: http://frsyuki.hatenablog.com/entry/2014/06/09/164559

    View Slide

  47. PATCH /embulk_configs/:id (update)
    • αʔόʔ

    • ؾ߹Ͱ᠟౳ʹ͢Δ

    • ΞϓϦέʔγϣϯ࣍ୈ͕ͩɺ͘͝γϯϓϧͳཁ݅Ͱ͋Ε͹
    ᠟౳ʹͳΔΑ͏ʹ࣮૷͢Δͷ͸೉͘͠ͳ͍

    • ΫϥΠΞϯτ

    • ᠟౳ʹ͑͞ͳ͍ͬͯΕ͹ɺGETͱ͔ͱϦτϥΠ͢΂͖Τ
    ϥʔ͸มΘΒͳ͍ (ͳͬͯͳ͍ͳΒৗʹϦτϥΠ͠ͳ͍)
    UPDATEͷ᠟౳ੑʹؔͯ͠͸ͪ͜Β΋ࢀߟʹ: http://frsyuki.hatenablog.com/entry/2017/08/10/140416

    View Slide

  48. DELETE /embulk_configs/:id (destroy)
    • αʔόʔ

    • ඞͣ͠΋ϦτϥΠͰਖ਼ৗͳϨεϙϯε͕ظ଴Ͱ͖Δํ๏Ͱ͸ͳ͍͕ɺී௨ʹfind͠
    ͯdestroyͨ͠ΒϦιʔεʹର͢Δૢ࡞͸গͳ͘ͱ΋᠟౳ʹͳΔ

    • Ͳ͏ͯ͠΋᠟౳ʹ͍ͨ͠ͳΒɺ࿦ཧ࡟আ͔ͭաڈʹϨίʔυ͸ଘࡏ͚ͨ͠Ͳ࡟আ
    ࡁͰ͋Δ͜ͱ͕Θ͔Δ৔߹͸ɺ੒ޭΛฦͯ͠΋͍͍͔΋

    • ෺ཧ࡟আͷ৔߹͸ͦ΋ͦ΋࡞ΒΕ͍ͯͳ͔ͬͨ৔߹ͱ൑ผͰ͖ͳ͍ͷͰ404

    • ΫϥΠΞϯτ

    • ্هͷڍಈͰ͋Ε͹GETͱಉ͡ΤϥʔΛϦτϥΠͯ͠Ε͹͋·ΓࠔΒͳ͍͸ͣ

    • طʹ࡟আࡁͷ৔߹(404)͸ϦτϥΠ͠ͳ͍

    View Slide

  49. 4. RailsΞϓϦͷ੾Γग़͠Ͱࠔ೉ͳ఺

    View Slide

  50. ੾Γग़͠ઌʹ͍͚࣋ͬͯͳ͍
    ΞιγΤʔγϣϯ
    • ྫ͑͹੾Γग़ͦ͏ͱ͍ͯ͠ΔϞσϧ͕ belongs_to :user Λ࣋ͭ৔
    ߹

    • ֎෦ʹݟ͑Δܗͱͯ͠αʔϏε͕෼͔Ε͍ͯΔ৔߹͸usersςʔ
    ϒϧͷߋ৽ΛPubSubͰ௨஌ͯ͠੾Γग़͠ઌʹίϐʔΛ࣋ͭͱ͔

    • ͋Δ͍͸ɺDBΛ෼཭͢Δ౎߹Ͳ͏΍ͬͯ΋Ұ؏ੑ͸ଛͳΘΕΔ
    ͷͰɺׂΓ੾ͬͯuser_id͚ͩ΍ΓऔΓ͢Δ౳

    • JOINͰ͖ͳ͍͠ΧϥϜͷ஋ͷҙຯ͸ෆ໌ʹͳΔ͕ɺߏ੒͸
    γϯϓϧʹอͯΔ

    View Slide

  51. JOINͷඞཁͳιʔτ
    • A.belongs_to :b ͰBΛผαʔϏεʹ੾Γग़͍͕ͨ͠ɺb.nameͰAΛ
    ιʔτ͢ΔAPI͕͋Δ৔߹

    • ࢮ͋ΔͷΈ

    • ͦ΋ͦ΋ͦΜͳΠϯλʔϑΣʔεΛ࡞ΔͷΛ΍ΊΖ

    • DBͷ஋ͷҰ؏ੑΛ͋Δఔ౓͖͋ΒΊɺb.nameͷίϐʔͰ͋Δ
    a.b_nameΛੜ΍ͯ͠ϝϯς͢Δ͔͠ͳ͍

    • ྫ͑͹ιʔτʹa.b_nameΛ࢖͏͕஋͸b.nameΛฦ͢ͳͲ͢Δɻ
    ͨ·ʹॱং͕͓͔͍͠ͷΛڐ༰Ͱ͖ͳ͍ͳΒ੾Γग़͠͸ఘΊΔ

    View Slide

  52. ؾܰʹղܾͰ͖ͳ͘ͳΔN+1໰୊
    • ActiveRecordͷΫΤϦΛAPIݺͼग़͠ʹͨ͠ॠؒ
    includes/preload/eager_load ͕࢖͑ͣਏ͍໰୊

    • ઈରʹ΍ΊΑ͏: ࢥߟఀࢭΩϟογϡ

    • ී௨ʹidͷϦετΛऔͬͯฦ͢APIΛੜ΍͠ɺฦ͖ͬͯͨ
    ࢠϦιʔεΛ਌ϦιʔεͷΠϯελϯεม਺ʹ২͑Δ͔ɺ
    { ਌Ϧιʔε => ࢠϦιʔε } ͳHashΛ࡞Δ

    • ΍͍͔ͬͯ͘͠ͳ͍͕ɺ͜ͷ໰୊͸ൺֱత؆୯ͳํ

    View Slide

  53. ೝূೝՄͲ͏͢Δͷ໰୊
    • ී௨ʹ֎෦ʹݟ͑ͯΔ৔߹͸ී௨ʹೝূΛ࣮૷͢Ε͹͍͍
    ͚ͩ

    • ಺෦Ͱୟ͘API͸ɺ֎෦͔Βୟ͚ͳ͍Α͏ʹ্ͨ͠Ͱɺཁ
    ݅ʹΑͬͯ͸ϕʔγοΫͳೝূೝՄΛεΩοϓͰ͖Δ

    • ͕ɺ੾Γग़͠ઌͷೝՄʹ੾Γग़͠ݩͷϦιʔε͕ඞཁ
    ͳ৔߹ɺ͕Μ͹ͬͯ෼୲͠੾Γ཭͍͔ͯ͘͠͠ͳ͍

    • ʮେมͰ͢ΑͶɺ͜ΕʯҎ্ͷؾ࣋ͪ͸ಛʹͳ͍

    View Slide

  54. ࠷ߴͷղܾࡦ:
    ΈΜͳͰҰͭͷνʔϜʹͳΓ
    શһ͕શͯΛϝϯςͰ͖ΔΑ͏ʹͳΓ
    ͦ΋ͦ΋ϚΠΫϩαʔϏεԽΛෆཁʹ͢Δ
    ·͋ͦΕ͕Ͱ͖ͳ͍͔Β͜Μͳ໘౗ͳ໰୊Λղܾ͠ͳ͍ͱ͍͚ͳ͍Θ͚Ͱ͢

    View Slide

  55. 5. ҆શʹσϓϩΠ؀ڥΛվળ͍ͯ͘͠࿩

    View Slide

  56. ةݥͳσϓϩΠ؀ڥΛվળ͠
    ͍ͯͬͨ࿩
    • ϚΠΫϩαʔϏε͸ಛʹؔ܎ͳ͍͚Ͳʮ҆શ͔ͭߴ଎ʯʹ
    ॏཁͳ෦෼

    • ͲΜͳʹஸೡʹ࣮૷ͯ͠΋σϓϩΠ؀ڥ͕μϝͩͱ҆શ
    ʹ΋ߴ଎ʹ΋ਐΊΒΕͳ͍

    View Slide

  57. ਓྨͷσϓϩΠͷจ໌ͷൃల
    • ssh + git pull σϓϩΠ (capistrano)

    • ΞʔΧΠϒΛpull͢ΔλΠϓͷσϓϩΠ

    • DockerίϯςφͷσϓϩΠ

    • ίϯςφΫϥελ΁ͷσϓϩΠ (ECS, k8s)

    View Slide

  58. ਓྨͷσϓϩΠͷจ໌ͷൃల
    • ssh + git pull σϓϩΠ (capistrano)

    • ΞʔΧΠϒΛpull͢ΔλΠϓͷσϓϩΠ

    • DockerίϯςφͷσϓϩΠ

    • ίϯςφΫϥελ΁ͷσϓϩΠ (ECS, k8s)
    զʑ͸ݱࡏͲ͔ͬͪΛ
    ਐΊͯΔঢ়ଶ

    View Slide

  59. ϚϧνΫϥ΢υɺ
    DockerԽʹੑೳ໰୊ͷ͋ΔHadoop
    => CodeDeploy

    View Slide

  60. ਓࡐ͕ෆ଍͍ͯ͠Δ͸͕ͣԿ
    ނ͔ཚཱ͢ΔσϓϩΠ؀ڥ

    View Slide

  61. CI͕௨͍ͬͯͳͯ͘΋30෼ʹҰճ
    ChefͰσϓϩΠ͕૸Δ

    View Slide

  62. CI͕௨͍ͬͯͳͯ͘΋30෼ʹҰճ
    ChefͰσϓϩΠ͕૸Δ
    => CodeDeploy͔ΒmitamaeΛୟ͘
    k0kubun/mitamae-plugin-resource-deploy_revision
    k0kubun/mitamae-plugin-resource-runit
    k0kubun/mitamae-plugin-recipe-buildpack

    View Slide

  63. Ͳ͏΍ͬͯಈ͍ͯΔ͔શ͘
    Θ͔Βͳ͍heroku-buildpack

    View Slide

  64. खಈͷఀࢭΦϖϨʔγϣϯ
    Կ͕Ͳ͜ʹ͋Δ͔͙͢ࢥ͍ग़ͤͳ͘ͳΔrunit

    View Slide

  65. खಈͷఀࢭΦϖϨʔγϣϯ
    Կ͕Ͳ͜ʹ͋Δ͔͙͢ࢥ͍ग़ͤͳ͘ͳΔrunit
    => ࣗಈఀࢭͰ͖Δsystemd service

    View Slide

  66. gemͷόʔδϣϯΛ্͛ΔͱյΕΔ

    View Slide

  67. gemͷόʔδϣϯΛ্͛ΔͱյΕΔ
    => αʔϏεΠϯ/αʔϏεΞ΢τԽ

    View Slide

  68. We’re hiring

    View Slide

  69. ·ͱΊ
    • ͦ͜Ͱ੾Γग़͢ͷ͕ຊ౰ʹྑ͍ͷ͔Α͘ߟ͑·͠ΐ͏

    • Ҡߦத͸ϩʔΧϧͰΞϓϦΛ্ཱͪ͛ͯςετ͢Δͱ͍͏
    બ୒ࢶ΋༗ޮ

    • API͸᠟౳ʹͳΔΑ͏ઃܭɺແҙຯͳϦτϥΠ͸ආ͚Δ

    • ੾Γग़͠ʹ͓͚Δਏ͍఺ͱͦͷରԠํ਑Λ঺հ͠·ͨ͠

    • We’re hiring

    View Slide