Slide 1

Slide 1 text

ʙ͋Εͬʁ࡞ऀɾɾɾ͋Εͬʁʁʁฤʙ !QZBNB(.01FQBCP *OD 3VCZ8PVME$POGFSFODF OHY@NSVCZWʹ͓͚Δ ϊϯϒϩοΩϯάͳNSVCZ࣮ߦͷ ࣮૷ৄࡉ

Slide 2

Slide 2 text

γχΞɾϓϦϯγύϧΤϯδχΞ ࢁԼ࿨඙!QZBNB ϗεςΟϯάࣄۀ෦νʔϑςΫχΧϧϦʔυ IUUQTUFOTOBQPODPN

Slide 3

Slide 3 text

ϗεςΟϯάࣄۀ &$ࢧԉࣄۀ ϋϯυϝΠυɾͦͷଞࣄۀ

Slide 4

Slide 4 text

೥ ϩϦϙοϓʂϨϯλϧαʔόαʔϏεఏڙ։࢝ ೥ ೥ ೥ ϔςϜϧαʔϏεఏڙ։࢝ 1ࢁ͕ϖύϘʹೖࣾʂʂ̍ ೥݄೔ ࣛࣇౡݝग़ਫࢢʹ͓͍ͯ1ࢁര஀ʂʂ̍ ೥ ݱࡏɾ૑ۀ೥໨ ϜʔϜʔυϝΠϯαʔϏεఏڙ։࢝

Slide 5

Slide 5 text

45/4 -JOVY/444FSWFS TUOTKQ

Slide 6

Slide 6 text

45/4

Slide 7

Slide 7 text

ࠓ೔࿩͢͜ͱ wOHY@NSVCZ wOHJOYͷجຊ wOHY@NSVCZWͷ՝୊ wOHY@NSVCZWʹ͓͚ΔϊϯϒϩοΩϯάॲཧ

Slide 8

Slide 8 text

લఏ wOHJOYͷΠϕϯτϞδϡʔϧ͸FQPMMલఏͰ࿩͠·͢ w3VCZͷ࿩Λ͠·͕͢ɺ3VCZߏจͷ࿩͸͋·Γग़͖ͯ ·ͤΜ

Slide 9

Slide 9 text

OHY@NSVCZ "'BTUBOE.FNPSZ&⒏DJFOU8FC4FSWFS&YUFOTJPO.FDIBOJTN 6TJOH4DSJQUJOH-BOHVBHFNSVCZGPSOHJOY IUUQOHYNSVCZPSH

Slide 10

Slide 10 text

OHY@NSVCZWʹίϯτϦϏϡʔτ

Slide 11

Slide 11 text

No content

Slide 12

Slide 12 text

Slide 13

Slide 13 text

OHY@NSVCZ NSVCZ@TTM@IBOETIBLF@IBOEMFS@DPEF TTMOHJOY44-OFX DFSUJpDBUF@EBUB'JMFSFBE QBUIUP\TTMTFSWFSOBNF^DSU LFZ@EBUB'JMFSFBE QBUIUP\TTMTFSWFSOBNF^LFZ TTMDFSUJpDBUF@EBUBDFSUJpDBUF@EBUB TTMDFSUJpDBUF@LFZ@EBUBLFZ@EBUB OHJOYͷ͋ΒΏΔΠϕϯτʹϑοΫͯ͠ɺNSVCZͷίʔυΛ࣮ߦ͠ɺ ϓϥΨϒϧʹτϥϑΟοΫίϯτϩʔϧग़དྷΔ

Slide 14

Slide 14 text

ϖύϘͷࣄྫ ಈతূ໌ॻ؅ཧ ਺ඦສυϝΠϯͷূ໌ॻΛ.Z42-Ͱ؅ཧ ίϯςϯπΩϟογϡ ΩϟογϡϙϦγʔΛ)551"1*ܦ༝Ͱऔಘ͠ɺOHJOYͷ Ωϟογϡͷ0/ɾ0''Λίϯτϩʔϧ

Slide 15

Slide 15 text

OHJOY NSVCZ

Slide 16

Slide 16 text

Πϕϯτۦಈ ඇಉظ*0 OHJOY

Slide 17

Slide 17 text

Πϕϯτۦಈ OHJOY FQPMM FWFOU FWFOU FWFOU DMJFOU DMJFOU DMJFOU BDDFQU BDDFQU BDDFQU FQPMM@XBJU ઀ଓ΍ϨεϙϯεΛ*0Πϕϯτͱͯ͠ॲཧ͢Δ IUUQTMJOVYKNPTEOKQIUNM-%1@NBOQBHFTNBOFQPMM@XBJUIUNM

Slide 18

Slide 18 text

ඇಉظ*0શͯ͸ϑΝΠϧͰ͋Δ OHJOY FQPMM FWFOU FWFOU FWFOU DMJFOU DMJFOU DMJFOU BDDFQU BDDFQU BDDFQU FQPMM@XBJU ϑΝΠϧσΟεΫϦϓλͦΕͧΕΛϒϩοΫͤͣ FQPMMͰඇಉظʹ*0ॲཧΛߦ͏ GE GE GE

Slide 19

Slide 19 text

OHJOYXPSLFS OHJOY FQPMM FWFOU FWFOU FWFOU DMJFOU DMJFOU DMJFOU BDDFQU BDDFQU BDDFQU FQPMM@XBJU ΫϥΠΞϯτ͔ΒͷϦΫΤετ͸XPSLFS͕ॲཧ XPSLFS XPSLFS NBTUFS FQPMM@XBJU

Slide 20

Slide 20 text

OHY@NSVCZ OHJOY FQPMM FWFOU FWFOU FWFOU DMJFOU DMJFOU DMJFOU BDDFQU BDDFQU BDDFQU FQPMM@XBJU )551ϦΫΤετ࣌ͷNSVCZ࣮ߦ΋XPSLFSͰߦΘΕΔ XPSLFS XPSLFS NBTUFS MPDBUJPOIFBEFST\ NSVCZ@DPOUFOU@IBOEMFS@DPEF SOHJOY3FRVFTUOFX SDPOUFOU@UZQFUFYUIUNM OHJOYSQVUTIFBEFST\SIFBEFST@JOBMM^CSCS ^

Slide 21

Slide 21 text

OHY@NSVCZͷ՝୊ SFRVFTU SFRVFTU SFRVFTU NSVCZ NSVCZ NSVCZ SFTQPOTF SFTQPOTF SFTQPOTF XPSLFS XPSLFS͋ͨΓͷNSVCZ࣮ߦͰඇಉظ*0͕ϒϩοΫ͞ΕΔ

Slide 22

Slide 22 text

ࠓ೔ͷओ୊ SFRVFTU SFRVFTU SFRVFTU NSVCZ NSVCZ NSVCZ SFTQPOTF SFTQPOTF SFTQPOTF XPSLFS ͜͏ͳͬͨʂʂ͍̍ͯ͏࿩Λ͠·͢

Slide 23

Slide 23 text

Ϧιʔε͕͏·͘׆༻Ͱ͖ͳ͍έʔε container.boot! loop do break if container.boot? sleep 1000 end OHY@NSVCZ͔ΒίϯςφϓϩηεΛىಈ͠ɺ ىಈ׬ྃΛTMFFQͰ଴ͭΑ͋͘Δॲཧ

Slide 24

Slide 24 text

՝୊Λղܾ͢ΔϊϯϒϩοΩϯάΠϯλʔϑΣʔε /HJOY"TZODTMFFQ /HJOY"TZOD)551TVC@SFRVFTU

Slide 25

Slide 25 text

/HJOY"TZODTMFFQ

Slide 26

Slide 26 text

/HJOY"TZODTMFFQ SFRVFTU SFRVFTU NSVCZ SFTQPOTF SFTQPOTF MPPQEP CSFBLJGDPOUBJOFSCPPU /HJOY"TZODTMFFQ FOE NSVCZ TMFFQ TMFFQ࣌ʹNSVCZͷϒϩοΫΛ։์͢Δ

Slide 27

Slide 27 text

/HJOY"TZODTMFFQ wOHYFWFOUMPPQ wOHY@BEE@UJNFS w'JCFS

Slide 28

Slide 28 text

OHJOYFWFOUMPPQ pOEUJNFS FQPMM@XBJU FYFDFWFOU IBOEMFS FYFDUJNFS IBOEMFS ௚ۙͰൃՐ͢ΔλΠϚʔΛ୳͢ *0ΠϕϯτΛ଴ͭ *0ΠϕϯτͷϋϯυϥΛ࣮ߦ͢Δ λΠϚʔͷϋϯυϥΛ࣮ߦ͢Δ

Slide 29

Slide 29 text

OHJOYFWFOUIBOEMFS wOHJOYͰ͸FWFOUʹIBOEMFSΛఆٛग़དྷΔ wUJNFSͷIBOEMFS͸ίʔϧόοΫͷΑ͏ͳΠϝʔδ wϢʔβʔͷ೚ҙͷΦϒδΣΫτΛ֨ೲɺऔΓग़͢͜ͱ ͕Մೳ

Slide 30

Slide 30 text

OHY@BEE@UJNFS ev = (ngx_event_t *)p; ev->handler = ngx_mrb_timer_handler; ev->data = re; ngx_add_timer(ev, (ngx_msec_t)timer); FWEBUBʹNSC@TUBUFͳͲ3VCZͷ৘ใΛอ࣋͠ɺ IBOEMFS࣮ߦ࣌ʹऔΓग़͠ɺ3VCZΛ࣮ߦ͢Δ

Slide 31

Slide 31 text

3VCZͷίϯςΩετ͸Ͳ͏ͳΔ͔ʁ puts "1" Nginx::Async.sleep 1000 puts "2" /HJOY"TZODTMFFQ͕࣮ߦ͞Εɺ QVUT͕࣮ߦ͞Εͯ͠·͏ ˠ3VCZͷॲཧΛఀࢭ͢Δඞཁ͕͋Δ

Slide 32

Slide 32 text

'JCFS

Slide 33

Slide 33 text

'JCFS fiber = Fiber.new { puts 'Ruby is' Fiber.yield puts 'Good' } fiber.resume fiber.resume ͍ΘΏΔίϧʔνϯͰɺ'JCFSZJFMEͷ࣌఺Ͱ ॲཧΛఀࢭͤ͞Δ͜ͱ͕ग़དྷΔɻ 'JCFSSFTVNFʹΑͬͯॲཧΛ࠶։

Slide 34

Slide 34 text

3VCZJT (PPE

Slide 35

Slide 35 text

OHY@NSVCZ'JCFS *NBHF MPDBUJPOIFBEFST\ NSVCZ@DPOUFOU@IBOEMFS@DPEF QVUT /HJOY"TZODTMFFQ QVUT ^ MPDBUJPOIFBEFST\ NSVCZ@DPOUFOU@IBOEMFS@DPEF 'JCFSOFXEP QVUT /HJOY"TZODTMFFQ QVUT FOE 3VCZͷίʔυΛ'JCFSͰ҉໧తʹแΉ

Slide 36

Slide 36 text

OHY@NSVCZ'JCFS *NBHF EFG@OHY@NSC@QSFQBSF@pCFS OHJOY@IBOEMFS pCFS@IBOEMFS'JCFSOFX\OHJOY@IBOEMFSDBMM^ MBNCEBEP SFTVMUpCFS@IBOEMFSSFTVNF FOE FOE 'JCFSΛ͞Βʹ1SPDͰแΉ

Slide 37

Slide 37 text

/HJOY"TZODTMFFQ class Async class << self def sleep(*args) __sleep(*args) Fiber.yield end end end @@TMFFQ UJNFS࡞Δϝιου ಺Ͱ 'JCMFSΠϯελϯεΛ$ͷίϯςΩετʹ อଘ͠ɺOHJOYͷλΠϚʔϋϯυϥʔʹઃఆޙɺ 'JCFSZJFMEͰ3VCZΛఀࢭ

Slide 38

Slide 38 text

OHY@BEE@UJNFS OHY@NSVCZ@UJNFS @IBOEFS 'JCFSZJFME 'JCFSSFTVNF 'JCFSΦϒδΣΫτΛίʔϧόοΫؔ਺ͷϙΠϯλͱڞʹ λΠϚʔʹηοτ λΠϚʔηοτ࣌఺Ͱ3VCZͷίϯςΩετΛఀࢭ͠ɺOHJOYͷ ΠϕϯτϧʔϓΛ࠶։ λΠϚʔΠϕϯτൃՐ࣌ʹ࣮ߦ͞ΕɺλΠϚʔΠϕϯτ͔Β 3VCZͷίϯςΩετΛऔΓग़͢ 3VCZͷ࣮ߦΛ࠶։͢Δ /HJOY"TZOD4MFFQ

Slide 39

Slide 39 text

/HJOY"TZOD)551TVC@SFRVFTU

Slide 40

Slide 40 text

OHY@IUUQ@TVCSFRVFTU location / { # subrequest } location /subreqest { puts "hello" } # http://localhost/ => hello ͋ΔϩέʔγϣϯʹདྷͨϦΫΤετΛ ଞͷϩέʔγϣϯʹϦΫΤετͨ݁͠ՌͰ Ԡ౴͢ΔΑ͏ͳ࢖͍ํ

Slide 41

Slide 41 text

SFRVFTU SFRVFTU NSVCZ SFTQPOTF SFTQPOTF NSVCZ ϦΫΤετΛ౤͛ΔͱϒϩοΫΛ։์͠ɺ Ϩεϙϯε࣌ʹίʔϧόοΫΛड͚औΓ࠶։ TVCSFRFTU 3FRVFTU 3FTQPOTF /HJOY"TZOD)551TVC@SFRVFTU

Slide 42

Slide 42 text

/HJOY"TZOD)551TVC@SFRVFTU3FEJT location / { # subrequest /redis } location /redis { puts redis get key } 3FEJTͷϦΫΤετ଴ͪ࣌ؒ΍ ֎෦"1*ΛOHY@NSVCZͰ࣮ߦ͢Δ Α͋͘Δέʔε

Slide 43

Slide 43 text

/HJOY"TZOD)551TVC@SFRVFTU def sub_request(location, query_param = nil) if query_param.is_a?(Hash) __sub_request(location, ::nginx::Utils....) elsif query_param.is_a?(String) __sub_request(location, query_param) elsea __sub_request(location) end Fiber.yield end TMFFQͱಉ͘͡ɺ@@TVC@SFRVFTUͰ ίʔϧόοΫΛઃఆ͠ɺ'JCFSZJFME

Slide 44

Slide 44 text

/HJOY"TZOD)551TVC@SFRVFTU ps->handler = ngx_mrb_async_http_sub_request_done; ps->data = actx; if (ngx_http_subrequest(r, actx->uri, args, &sr, ps, NGX_HTTP_SUBREQUEST_IN_MEMORY) != NGX_OK) { mrb_raise(mrb, E_RUNTIME_ERROR, "ngx_http_subrequest failed for http_sub_rquest method"); } ίʔϧόοΫΛઃఆ͠ɺαϒϦΫΤετΛ࣮ߦ͢Δ

Slide 45

Slide 45 text

/HJOY"TZOD)551TVC@SFRVFTU static ngx_int_t ngx_mrb_async_http_sub_request_done(ngx_http_request_t *sr, void *data, ngx_int_t rc) { ngx_mrb_async_http_ctx_t *actx = data; ngx_mrb_reentrant_t *re = actx->re; ngx_http_mruby_ctx_t *ctx; re->r = sr->parent; ... ίʔϧόοΫͰฦ٫͞ΕΔOHY@IUUQ@SFRVFTU@Uߏ଄ମ˞͔Β͸ αϒϦΫΤετͷϨεϙϯεϘσΟ΍ϔομ͕औಘͰ͖ͳ͍ ˞֤ΠϕϯτͰ࣋ͪճΒΕΔɺϦΫΤετͷ৘ใ

Slide 46

Slide 46 text

XBJUJOHTVCSFRVFTU pOBMJ[FCPEZpMUFS /HJOY"TZOD)551TVC@SFRVFTU NBJOSFRVFTU OHY@IUUQ@SFRVFTU@U TVCSFRVFTU OHY@IUUQ@SFRVFTU@U PUIFSFWFOU OHY@IUUQ@SFRVFTU@UNBJO pOJTISFRVFTU NSVCZ αϒϦΫΤετͷϨεϙϯε͸ɺϝΠϯϦΫΤετͷ ώʔϓʹॻ͍ͯ͋͛Δඞཁ͕͋Δ

Slide 47

Slide 47 text

/HJOY"TZOD)551TVC@SFRVFTU location /async_http_sub_request { mruby_rewrite_handler_code ' Nginx::Async::HTTP.sub_request "/sub_req_dst" res = Nginx::Async::HTTP.last_response nginx.rputs res.body '; } Ϩεϙϯεͷड͚औΓ͸ϝΠϯϦΫΤετͷ(FUUFSΛ௨ͯ͠ɺ αϒϦΫΤετ͕ॻ͍ͨώʔϓͷ஋Λऔಘ

Slide 48

Slide 48 text

ੑೳධՁ

Slide 49

Slide 49 text

IUUQTICNBUTVNPUPSKQFOUSZ

Slide 50

Slide 50 text

ଌఆ؀ڥ w.BD#PPL1SP.JE w$16()[*OUFM$PSFJ w.FNPSZ(# w7JSUVBM#PY w$16$PSF w.FNPSZ(# w046CVOUV9FOJBM

Slide 51

Slide 51 text

TMFFQNTFD SFUVSO MPDBUJPO" CMPDLJOH IUUQSFRVFTU MPDBUJPO# OPOCMPDLJOH IUUQSFRVFTU BC $ ab -n 10000 -c 100 http://127.0.0.1:58080/ PSJHJOʹ)551ϦΫΤετ͢Δ؀ڥ IUUQSFRVFTU IUUQSFRVFTU

Slide 52

Slide 52 text

OPOCMPDLJOH͕ഒఔ౓ߴ଎Ͱ͋Δ CMPDLJOHIUUQSFRVFTU OPOCMPDLJOHIUUQSFRVFTU 3FRVFTUTQFSTFDPOE<TFD> NFBO 5JNFQFSSFRVFTU 5JNFQFSSFRVFTU 5SBOTGFSSBUF<,CZUFTTFD>SFDFJWFE 3FRVFTUTQFSTFDPOE<TFD> NFBO 5JNFQFSSFRVFTU 5JNFQFSSFRVFTU 5SBOTGFSSBUF<,CZUFTTFD>SFDFJWFE

Slide 53

Slide 53 text

࠷ޙʹ

Slide 54

Slide 54 text

NSVCZ࠷ߴʂʂ̍ NSVCZʹΑͬͯΤϯδχΞͱͯ͠ɺ Ұஈਂ͘જΕΔΑ͏ʹͳͬͨ

Slide 55

Slide 55 text

5IBOLZPV ࠷৽ͷ࠾༻৘ใΛνΣοΫˠ !QC@SFDSVJU