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

Ruby App on Netflix Microservices Stack

Ruby App on Netflix Microservices Stack

At Tokyu RubyKaigi 09 #tqrk09

Naoto Takai

August 29, 2015
Tweet

More Decks by Naoto Takai

Other Decks in Programming

Transcript

  1. /FUqJYͷNJDSPTFSWJDFTελοΫͰ
    3VCZΞϓϦέʔγϣϯΛಈ͔ͯ͠ΈΔ

    View Slide

  2. View Slide

  3. σϞ

    View Slide

  4. docker-machine ls
    NAME ACTIVE DRIVER STATE URL
    default * virtualbox Running tcp://192.168.99.100:23
    docker inspect -f '{{range $p, $conf := .NetworkSettings.Ports}
    {{(index $conf 0).HostPort}} {{end}}' zuul_messenger
    8080/tcp -> 8000
    curl http://192.168.99.100:8000
    {"message":"Minnano Wedding is hiring."}

    View Slide

  5. Έͳ͞Μɺ͜Μͳ͜ͱʹ͓ࠔΓͰ͔͢ʁ

    View Slide

  6. w ରԠσόΠε͕ଟ͍ʢҎ্ʣ
    w τϥϑΟοΫ͕ଟ͍ʢશถͷʣ

    View Slide

  7. ͨͿΜ͍ͳ͍ʜʜ

    View Slide

  8. /FUqJYελοΫ͸NJDSPTFSWJDFT

    ΞʔΩςΫνϟͷ୅දྫ

    View Slide

  9. EPO`UFWFODPOTJEFSNJDSPTFSWJDFT
    VOMFTTZPVIBWFBTZTUFNUIBUTUPP
    DPNQMFYUPNBOBHFBTBNPOPMJUI
    IUUQNBSUJOGPXMFSDPNCMJLJ.JDSPTFSWJDF1SFNJVNIUNM

    View Slide

  10. IUUQNBSUJOGPXMFSDPNCMJLJ.JDSPTFSWJDF1SFNJVNIUNM

    View Slide

  11. ૊৫ʹΑͬͯʮෳࡶʯͷఆٛ͸ҟͳΔ

    View Slide

  12. View Slide

  13. ڞ௨ϥϯλΠϜαʔϏεͱϥΠϒϥϦʔ
    ŠŠϚΠΫϩαʔϏεΛՃ଎͢ΔϥϯλΠϜίϯςφʔͱϥΠϒϥϦʔɺαʔϏεɻ
    Ϋϥ΢υϓϥοτϑΥʔϜ͸ɺ/FUqJYͷେ෦෼Λ઎ΊΔαʔϏε܈ͷجૅͰ͋ΓɺςΫϊϩδʔελοΫͰ͢ɻ
    Ϋϥ΢υϓϥοτϑΥʔϜ͸ɺΫϥ΢υαʔϏε΍ΞϓϦέʔγϣϯϥΠϒϥϦɺΞϓϦέʔγϣϯίϯς
    φ͔Βߏ੒͞Ε·͢ɻಛʹϓϥοτϑΥʔϜʹΑͬͯɺ&VSFLBʹΑΔαʔϏεσΟεΧόϦɺ"SDIBJVTʹΑΔ
    ෼ࢄઃఆ؅ཧɺ3JCCPOʹΑΔϨδϦΤϯεͰΠϯςϦδΣϯτͳϓϩηεʗαʔϏεؒ௨৴ͳͲ͕ɺఏڙ͞
    Ε·͢ɻ୯ҰͷαʔϏεݺͼग़͠ʹͱͲ·Βͳ͍৴པੑΛఏڙ͢ΔͨΊʹɺ)ZTUSJYʹΑͬͯϥϯλΠϜͰಠ
    ཱͨ͠଱ϨΠςϯγͱ଱ো֐ੑ͕ఏڙ͞Ε·͢ɻ͜ΕΒͷϥΠϒϥϦʔ΍αʔϏε͸ɺ+7.ϕʔείϯςφͰ
    ͋Ε͹ͲͷΑ͏ͳ؀ڥͰ΋ಈ࡞͠·͢ɻ
    ·ͨɺϓϥοτϑΥʔϜ͸+7.ίϯςφαʔϏεΛɺ,BSZPOͱ(PWFSOBUPSɺඇ+BWBϥϯλΠϜ؀ڥ޲͚ʹ͸
    1SBOBαΠυΧʔʹΑΓɺఏڙ͠·͢ɻ1SBOB͕Πϯελϯε಺ͰϓϩΩγػೳΛఏڙ͢Δͷʹର͠ɺ;VVM
    ʢ)ZTUSJYͱ&VSFLBɺ3JCCPOͷϓϩηεؒ௨৴ػೳΛ౷߹͢Δ΋ͷʣ͸ɺΫϥ΢υ؀ڥͷڥքʹ͓͚Δಈతʹ
    εΫϦϓτʹΑ੍ͬͯޚՄೳͳϓϩΩγΛఏڙ͠·͢ɻ

    View Slide

  14. ύϧεͷϑΝϧγͷϧγ͕
    ύʔδͰίΫʔϯʘ ?P?
    ʗ

    View Slide

  15. ڞ௨ϥϯλΠϜαʔϏεͱϥΠϒϥϦʔ
    ŠŠϚΠΫϩαʔϏεΛՃ଎͢ΔϥϯλΠϜίϯςφʔͱϥΠϒϥϦʔɺαʔϏεɻ
    Ϋϥ΢υϓϥοτϑΥʔϜ͸ɺ/FUqJYͷେ෦෼Λ઎ΊΔαʔϏε܈ͷجૅͰ͋ΓɺςΫϊϩδʔελοΫͰ͢ɻ
    Ϋϥ΢υϓϥοτϑΥʔϜ͸ɺΫϥ΢υαʔϏε΍ΞϓϦέʔγϣϯϥΠϒϥϦɺΞϓϦέʔγϣϯίϯς
    φ͔Βߏ੒͞Ε·͢ɻಛʹϓϥοτϑΥʔϜʹΑͬͯɺ&VSFLBʹΑΔαʔϏεσΟεΧόϦɺ"SDIBJVTʹΑΔ
    ෼ࢄઃఆ؅ཧɺ3JCCPOʹΑΔϨδϦΤϯεͰΠϯςϦδΣϯτͳϓϩηεʗαʔϏεؒ௨৴ͳͲ͕ɺఏڙ͞
    Ε·͢ɻ୯ҰͷαʔϏεݺͼग़͠ʹͱͲ·Βͳ͍৴པੑΛఏڙ͢ΔͨΊʹɺ)ZTUSJYʹΑͬͯϥϯλΠϜͰಠ
    ཱͨ͠଱ϨΠςϯγͱ଱ো֐ੑ͕ఏڙ͞Ε·͢ɻ͜ΕΒͷϥΠϒϥϦʔ΍αʔϏε͸ɺ+7.ϕʔείϯςφͰ
    ͋Ε͹ͲͷΑ͏ͳ؀ڥͰ΋ಈ࡞͠·͢ɻ
    ·ͨɺϓϥοτϑΥʔϜ͸+7.ίϯςφαʔϏεΛɺ,BSZPOͱ(PWFSOBUPSɺඇ+BWBϥϯλΠϜ؀ڥ޲͚ʹ͸
    1SBOBαΠυΧʔʹΑΓɺఏڙ͠·͢ɻ1SBOB͕Πϯελϯε಺ͰϓϩΩγػೳΛఏڙ͢Δͷʹର͠ɺ;VVM
    ʢ)ZTUSJYͱ&VSFLBɺ3JCCPOͷϓϩηεؒ௨৴ػೳΛ౷߹͢Δ΋ͷʣ͸ɺΫϥ΢υ؀ڥͷڥքʹ͓͚Δಈతʹ
    εΫϦϓτʹΑ੍ͬͯޚՄೳͳϓϩΩγΛఏڙ͠·͢ɻ

    View Slide

  16. w ରԠσόΠε͕ଟ͍ʢҎ্ʣ
    w τϥϑΟοΫ͕ଟ͍ʢશถͷʣ

    View Slide

  17. ରԠσόΠε͕ଟ͍͔ΒɺσόΠε͝ͱͷࠩҟΛ
    ड͚ೖΕɺσόΠεຖʹ࠷దԽ͞ΕͨϨεϙϯε
    Λฦ٫͢Δඞཁ͕͋Δɻ

    View Slide

  18. ΫϥΠΞϯτ
    3&45GVM"1*
    Ϧιʔε
    3&45GVM"1*
    Ϧιʔε
    3&45GVM"1*
    Ϧιʔε
    3FTPVSDFCBTFE"1*

    View Slide

  19. ΫϥΠΞϯτ
    3&45GVM"1*
    Ϧιʔε
    3&45GVM"1*
    Ϧιʔε
    3&45GVM"1*
    Ϧιʔε
    "1*(BUFXBZ
    &YQFSJFODFCBTFE"1*
    Ϋϥ΢υ؀ڥͷڥքʹ͓͚Δ
    ಈతʹεΫϦϓτʹΑ੍ͬͯ
    ޚՄೳͳϓϩΩγ

    View Slide

  20. ରԠσόΠε͕ଟ͍͔ΒɺҰ෦ͷσόΠε͕ར༻
    ͢Δ෦෼ͷͨΊ͚ͩʹɺΞϓϦέʔγϣϯશମ͕
    Τϥʔʹͳͬͯ΄͘͠ͳ͍ɻ

    View Slide

  21. ΫϥΠΞϯτ
    3&45GVM"1*
    Ϧιʔε
    3&45GVM"1*
    Ϧιʔε
    3&45GVM"1*
    Ϧιʔε
    "1*(BUFXBZ

    View Slide

  22. ΫϥΠΞϯτ
    3&45GVM"1*
    Ϧιʔε
    3&45GVM"1*
    Ϧιʔε
    3&45GVM"1*
    Ϧιʔε
    "1*(BUFXBZ
    ଱ϨΠςϯγͱ଱ো֐ੑ

    View Slide

  23. ରԠσόΠε͕ଟ͍͔ΒɺҰ෦ͷσόΠε͕ར༻
    ͢Δ෦෼ͷͨΊ͚ͩʹɺΞϓϦέʔγϣϯશମΛ
    εέʔϧͤͨ͘͞ͳ͍ɻ

    View Slide

  24. ϩʔυόϥϯα
    "1*(BUFXBZ
    αʔϏε
    ϊʔυ
    αʔϏε
    ϊʔυ
    αʔϏε
    ϊʔυ
    αʔϏεͷ਺͕૿Ճ͢ΔʹͭΕ
    ϩʔυόϥϯαͷ؅ཧ͕ࠔ೉ʹ
    ͳΔ

    View Slide

  25. "1*(BUFXBZ
    αʔϏε
    ϊʔυ
    αʔϏε
    ϊʔυ
    αʔϏε
    ϊʔυ
    ΫϥΠΞϯταΠυϩʔυόϥϯγϯά
    ʹΑΔϨδϦΤϯεͰΠϯςϦδΣϯτ
    ͳϓϩηεʗαʔϏεؒ௨৴

    View Slide

  26. αʔϏεσΟεΧόϦʹΑΔ

    ಈతͳϊʔυͷొ࿥ͱཁٻ
    "1*(BUFXBZ
    αʔϏε
    ϊʔυ
    αʔϏε
    ϨδετϦ
    ొ࿥
    Ұཡ

    View Slide

  27. αʔϏεϨδετϦ΁ͷొ࿥ͳͲΛ

    ఏڙ͢Δ+7.ίϯςφαʔϏε
    αʔϏε
    ϨδετϦ
    ొ࿥
    ϔϧενΣοΫ
    ίϯςφαʔϏε
    ΞϓϦέʔγϣϯ

    View Slide

  28. ϦΫΤετ
    ΫϥΠΞϯτ ΞϓϦέʔγϣϯ
    "1*(BUFXBZ
    αʔϏε
    ϨδετϦ
    Ϩεϙϯε
    ొ࿥
    ϦΫΤετ
    Ұཡ
    Ϩεϙϯε
    ΞϓϦέʔγϣϯ
    ίϯςφαʔϏε
    ΞϓϦέʔγϣϯ
    ίϯςφαʔϏε
    ϩʔυόϥϯγϯάʴ
    ଱ϨΠςϯγɾ଱ো֐ϨΠϠʔ

    View Slide

  29. ;VVM
    3JCCPO)ZTUSJY
    &VSFLB
    ,BSZPO 1SBOB
    ϦΫΤετ
    ΫϥΠΞϯτ ΞϓϦέʔγϣϯ
    "1*(BUFXBZ
    αʔϏε
    ϨδετϦ
    Ϩεϙϯε
    ొ࿥
    ϦΫΤετ
    Ұཡ
    Ϩεϙϯε
    ΞϓϦέʔγϣϯ
    ίϯςφαʔϏε
    ΞϓϦέʔγϣϯ
    ίϯςφαʔϏε
    ϩʔυόϥϯγϯάʴ
    ଱ϨΠςϯγɾ଱ো֐ϨΠϠʔ

    View Slide

  30. require 'sinatra'
    require 'sinatra/json'
    get '/' do
    json(message: 'Minnano Wedding is hiring.')
    end
    get '/status' do
    json(status: 'OK')
    end

    View Slide

  31. w αʔϏεϨδετϦ΁ͷࣗ෼ࣗ਎ͷొ࿥
    w αʔϏεϨδετϦ͔ΒͷϔϧενΣοΫ
    w ଞαʔϏεͷσΟεΧόϦͱΫϥΠΞϯταΠυ
    ϩʔυόϥϯγϯά
    w ઃఆ৘ใͷऔಘɺߋ৽ʢࠓճ͸ݴٴ͍ͯ͠ͳ͍ʣ

    View Slide

  32. αΠυΧʔύλʔϯʹΑΓ
    ଞαʔϏεϊʔυʹରͯ͠
    Πϯελϯε಺ͰϓϩΩγ
    ػೳΛఏڙ
    αʔϏε
    ϨδετϦ
    1SBOB
    BQQSC
    αʔϏε
    ϊʔυ
    αʔϏε
    ϊʔυ
    ϦΫΤετ
    ϦΫΤετ
    ొ࿥
    ϔϧενΣοΫ
    ϦΫΤετ
    ϔϧε
    νΣοΫ

    View Slide

  33. cat Procfile
    app: rackup -E production --host 0.0.0.0
    plana: prana/bin/Prana -c config.properties
    cat config.properties
    prana.host.healthcheck.url=http://localhost:9292/status
    prana.host.healthcheck.timeout=1500
    prana.proxy.req.acceptencoding=gzip
    eureka.name=MESSENGER
    eureka.vipAddress=MESSENGER
    eureka.port=9292
    eureka.serviceUrl.default=http://eureka:8080/eureka/v2/
    eureka.validateInstanceId=false

    View Slide

  34. docker run -d --name exhibitor netflixoss/exhibitor:1.5.2
    docker run -d --name eureka -d netflixoss/eureka:1.1.142
    docker run -d --name messenger --link eureka:eureka \

    takai/messenger bundle exec foreman start
    docker run -e "origin.zuul.client.DeploymentContextBasedVipAddr
    -d --name zuul_messenger \

    --link eureka:eureka netflixoss/zuul:1.0.28

    View Slide

  35. ڞ௨ϥϯλΠϜαʔϏεͱϥΠϒϥϦʔ
    ŠŠϚΠΫϩαʔϏεΛՃ଎͢ΔϥϯλΠϜίϯςφʔͱϥΠϒϥϦʔɺαʔϏεɻ
    Ϋϥ΢υϓϥοτϑΥʔϜ͸ɺ/FUqJYͷେ෦෼Λ઎ΊΔαʔϏε܈ͷجૅͰ͋ΓɺςΫϊϩδʔελοΫͰ͢ɻ
    Ϋϥ΢υϓϥοτϑΥʔϜ͸ɺΫϥ΢υαʔϏε΍ΞϓϦέʔγϣϯϥΠϒϥϦɺΞϓϦέʔγϣϯίϯς
    φ͔Βߏ੒͞Ε·͢ɻಛʹϓϥοτϑΥʔϜʹΑͬͯɺ&VSFLBʹΑΔαʔϏεσΟεΧόϦɺ"SDIBJVTʹΑΔ
    ෼ࢄઃఆ؅ཧɺ3JCCPOʹΑΔϨδϦΤϯεͰΠϯςϦδΣϯτͳϓϩηεʗαʔϏεؒ௨৴ͳͲ͕ɺఏڙ͞
    Ε·͢ɻ୯ҰͷαʔϏεݺͼग़͠ʹͱͲ·Βͳ͍৴པੑΛఏڙ͢ΔͨΊʹɺ)ZTUSJYʹΑͬͯϥϯλΠϜͰಠ
    ཱͨ͠଱ϨΠςϯγͱ଱ো֐ੑ͕ఏڙ͞Ε·͢ɻ͜ΕΒͷϥΠϒϥϦʔ΍αʔϏε͸ɺ+7.ϕʔείϯςφͰ
    ͋Ε͹ͲͷΑ͏ͳ؀ڥͰ΋ಈ࡞͠·͢ɻ
    ·ͨɺϓϥοτϑΥʔϜ͸+7.ίϯςφαʔϏεΛɺ,BSZPOͱ(PWFSOBUPSɺඇ+BWBϥϯλΠϜ؀ڥ޲͚ʹ͸
    1SBOBαΠυΧʔʹΑΓɺఏڙ͠·͢ɻ1SBOB͕Πϯελϯε಺ͰϓϩΩγػೳΛఏڙ͢Δͷʹର͠ɺ;VVM
    ʢ)ZTUSJYͱ&VSFLBɺ3JCCPOͷϓϩηεؒ௨৴ػೳΛ౷߹͢Δ΋ͷʣ͸ɺΫϥ΢υ؀ڥͷڥքʹ͓͚Δಈతʹ
    εΫϦϓτʹΑ੍ͬͯޚՄೳͳϓϩΩγΛఏڙ͠·͢ɻ

    View Slide