Slide 1

Slide 1 text

Javaͷ࣮૷Λ PerlͰςετ͢Δ YAPC::Kyoto 2023 Lightning Talks @karupanerura

Slide 2

Slide 2 text

@karupanerura • DeNA Co., LTD - Software Engineer • Japan Perl Association - Chief Director • Perl / Go / Java / Type Script / etc...

Slide 3

Slide 3 text

SEE: https://techcon2023.dena.dev/session/session6/

Slide 4

Slide 4 text

SEE: https://techcon2023.dena.dev/session/session6/

Slide 5

Slide 5 text

SEE: https://techcon2023.dena.dev/session/session6/

Slide 6

Slide 6 text

SEE: https://techcon2023.dena.dev/session/session6/ Ͳ͏͍͏͜ͱʁ

Slide 7

Slide 7 text

Plack::Test

Slide 8

Slide 8 text

Plack::Test • PSGI appΛςετ͢ΔͨΊͷPlackެࣜϢʔςΟϦςΟ • PSGI appʹରͯ͠೚ҙͷϦΫΤετΛॲཧͤͯ͞ϨεϙϯεΛಘΔ • ϦΫΤετ: HTTP::Request • Ϩεϙϯε: HTTP::Response

Slide 9

Slide 9 text

Plack::Testͷྫ test_psgi client => sub { my $cb = shift; my $req = HTTP::Request->new(GET => "http://localhost/hello"); my $res = $cb->($req); is $res->content, 'Hello World'; is $res->content_type, 'text/plain'; is $res->code, 200; }, app => sub { my $env = shift; return [ 200, [ 'Content-Type' => 'text/plain' ], [ "Hello World" ] ]; };

Slide 10

Slide 10 text

͜ΕΛͦͷ··࢖ͬͯ JavaଆΛςετͰ͖ͨΒ ָʹ҆ఆੑ͕ߴ·ΔͷͰ͸ʁ

Slide 11

Slide 11 text

Αͬ͠Ό ΍Δͧʂʂʂ

Slide 12

Slide 12 text

Ͳ͏΍ͬͯ΍Δʁ

Slide 13

Slide 13 text

Plack::Testͷྫ test_psgi client => sub { my $cb = shift; my $req = HTTP::Request->new(GET => "http://localhost/hello"); my $res = $cb->($req); is $res->content, 'Hello World'; is $res->content_type, 'text/plain'; is $res->code, 200; }, app => sub { my $env = shift; return [ 200, [ 'Content-Type' => 'text/plain' ], [ "Hello World" ] ]; };

Slide 14

Slide 14 text

Plack::Testͷྫ test_psgi client => sub { my $cb = shift; my $req = HTTP::Request->new(GET => "http://localhost/hello"); my $res = $cb->($req); # <---------- focus here is $res->content, 'Hello World'; is $res->content_type, 'text/plain'; is $res->code, 200; }, app => sub { my $env = shift; return [ 200, [ 'Content-Type' => 'text/plain' ], [ "Hello World" ] ]; };

Slide 15

Slide 15 text

my $res = $cb->($req);

Slide 16

Slide 16 text

ຊ෺ͷHTTP RequestΛ͢Δ SubRefΛ࢖͑͹͍͍ͷͰ͸ʁ

Slide 17

Slide 17 text

Plack::Test ͷυΩϡϝϯτͷ༷ࢠ

Slide 18

Slide 18 text

Plack::Test ͷυΩϡϝϯτͷ༷ࢠ

Slide 19

Slide 19 text

উͬͨʂʂʂʂ ୈࡾ෦ ׬ʂʂʂ

Slide 20

Slide 20 text

উͬͨʂʂʂʂ ୈࡾ෦ ׬ʂʂʂ

Slide 21

Slide 21 text

ͳͥͩΊͳͷ͔

Slide 22

Slide 22 text

1. ઃܭ্ͷো֐ 2. ϞοΫ/ελϒͷฐ֐

Slide 23

Slide 23 text

1. ઃܭ্ͷো֐ 2. ϞοΫ/ελϒͷฐ֐

Slide 24

Slide 24 text

ઃܭ্ͷো֐

Slide 25

Slide 25 text

ͦ΋ͦ΋ͷഎܠ • Perl੡ͷWebΞϓϦͷJava΁ͷஈ֊తͳҠߦ • ͜ΕΛ࣮ݱ͢ΔͨΊʹJavaͷ࣮૷͔Β΋ͱͷPerl࣮૷Λར༻ • APIܦ༝Ͱ΋ͱ΋ͱͷPerl࣮૷Λݺͼग़͢ • (࠷ऴతʹ͸͜Ε΋Javaʹஔ͖׵͑ͯPerl͔ΒJavaʹ׬શҠߦ) • PerlͱJava͕ࠞࡏ͢Δঢ়ଶΛςετ͍ͨ͠

Slide 26

Slide 26 text

ͭ·Γ

Slide 27

Slide 27 text

Before 0ME1FSM"QQ --# ALL

Slide 28

Slide 28 text

After 0ME1FSM"QQ --# /FX+BWB"QQ /path/to/current /path/to/replaced /path/to/internal1 /path/to/internal2 /path/to/internal3 and others

Slide 29

Slide 29 text

(Finally) /FX+BWB"QQ --# ALL

Slide 30

Slide 30 text

PerlͱJava͕ࠞࡏ͢Δঢ়ଶΛ ςετ͍ͨ͠

Slide 31

Slide 31 text

After 0ME1FSM"QQ --# /FX+BWB"QQ /path/to/current /path/to/replaced /path/to/internal1 /path/to/internal2 /path/to/internal3 and others

Slide 32

Slide 32 text

JavaʹϦΫΤετΛ౤͛ͭͭ Java -> Perl ͷϦΫΤετ΋ ॲཧ͢Δඞཁ͕͋Δ

Slide 33

Slide 33 text

Α͠

Slide 34

Slide 34 text

fork(2)

Slide 35

Slide 35 text

উͬͨʂʂʂʂ ୈࡾ෦ ׬ʂʂʂ

Slide 36

Slide 36 text

উͬͨʂʂʂʂ ୈࡾ෦ ׬ʂʂʂ

Slide 37

Slide 37 text

1. ઃܭ্ͷো֐ 2. ϞοΫ/ελϒͷฐ֐

Slide 38

Slide 38 text

fork(2)ͩͱͳͥବ໨ͳͷ͔ • Test::Mock::Guard΍Module::SpyͳͲͰ৭ʑͱ্ॻ͖͍ͯ͠Δ • μΠφϛοΫείʔϓͰαϒϧʔνϯΛҰ࣌తʹ্ॻ͖ • είʔϓ͕ผʹͳΔͱͦ΋ͦ΋͜Ε͕൓ө͞Εͣຊ෺ͷ࣮૷͕ಈ͘ • ্ॻ͖ͨ͠αϒϧʔνϯͰ஋Λୣͬͯ݁Ռͷൺֱʹ࢖ͬͨΓ • ΍Γ͍ͨ΄͏͍ͩ • ΋͕Έ͕Θ

Slide 39

Slide 39 text

ͭ·Γ

Slide 40

Slide 40 text

͜͏͍͏ײ͡ͷίʔυ͕͋Δ my $sent = 0; my $guard = Test::Mock::Guard->new( 'MyEmailSender' => { send => sub { $sent++ } }, ); my $res = $doit->($req); is $sent, 1, 'ϝʔϧΛ1௨͓ͬͨ͘Α';

Slide 41

Slide 41 text

fork(2)Ͱ͸ϓϩηε͕ผΕΔ

Slide 42

Slide 42 text

ผϓϩηεͷม਺͸ݟ͑ͳ͍

Slide 43

Slide 43 text

fork(2) is dead

Slide 44

Slide 44 text

Ͳ͏͢Δ͔

Slide 45

Slide 45 text

ಉҰϓϩηεͰશ෦΍Δ

Slide 46

Slide 46 text

Java͔ΒͷϨεϙϯεΛ଴ͪଓ͚ Internal API΁ͷϦΫΤετΛॲཧ

Slide 47

Slide 47 text

͜Ε͔͠ͳ͍Ͱ͠ΐ͏

Slide 48

Slide 48 text

select(2)

Slide 49

Slide 49 text

select(2)Λ࢖ͬͨղ๏ • Internal API΁ͷϦΫΤετΛड͚औΔSocketΛListen͢Δ • HTTP ClientͰJavaʹϦΫΤετΛ౤͛ͨΒselect(2)Ͱ଴ͭ • Internal API΁ͷϦΫΤετ͕དྷΔ or Java͔ΒϨεϙϯε͕དྷΔ • Listenͨ͠Socket͕ى͖ͨΒInternal APIΛॲཧͯ͠·ͨselect(2) • Java͔ΒϨεϙϯε͕དྷͨΒऴྃ

Slide 50

Slide 50 text

ਤղ

Slide 51

Slide 51 text

ςετ࣮ߦγʔέϯε 1SFQBSF .PDL FUD /FX+BWB"QQ

Slide 52

Slide 52 text

ςετ࣮ߦγʔέϯε 1SFQBSF .PDL FUD 1MBDL5FTU /FX+BWB"QQ

Slide 53

Slide 53 text

ςετ࣮ߦγʔέϯε 1SFQBSF .PDL FUD 1MBDL5FTU /FX+BWB"QQ *OUFSOBM"1* 5$1-JTUFOFS

Slide 54

Slide 54 text

ςετ࣮ߦγʔέϯε 1SFQBSF .PDL FUD 1MBDL5FTU TFMFDU /FX+BWB"QQ *OUFSOBM"1* 5$1-JTUFOFS

Slide 55

Slide 55 text

ςετ࣮ߦγʔέϯε 1SFQBSF .PDL FUD 1MBDL5FTU TFMFDU /FX+BWB"QQ *OUFSOBM"1* 5$1-JTUFOFS

Slide 56

Slide 56 text

ςετ࣮ߦγʔέϯε 1SFQBSF .PDL FUD 1MBDL5FTU TFMFDU /FX+BWB"QQ *OUFSOBM"1* 5$1-JTUFOFS

Slide 57

Slide 57 text

ςετ࣮ߦγʔέϯε 1SFQBSF .PDL FUD 1MBDL5FTU TFMFDU /FX+BWB"QQ *OUFSOBM"1* 5$1-JTUFOFS *OUFSOBM"1* 14(*"QQ

Slide 58

Slide 58 text

ςετ࣮ߦγʔέϯε 1SFQBSF .PDL FUD 1MBDL5FTU TFMFDU /FX+BWB"QQ *OUFSOBM"1* 5$1-JTUFOFS *OUFSOBM"1* 14(*"QQ

Slide 59

Slide 59 text

ςετ࣮ߦγʔέϯε 1SFQBSF .PDL FUD 1MBDL5FTU TFMFDU /FX+BWB"QQ *OUFSOBM"1* 5$1-JTUFOFS

Slide 60

Slide 60 text

ςετ࣮ߦγʔέϯε 1SFQBSF .PDL FUD 1MBDL5FTU TFMFDU /FX+BWB"QQ *OUFSOBM"1* 5$1-JTUFOFS

Slide 61

Slide 61 text

ςετ࣮ߦγʔέϯε 1SFQBSF .PDL FUD 1MBDL5FTU TFMFDU /FX+BWB"QQ *OUFSOBM"1* 5$1-JTUFOFS *OUFSOBM"1* 14(*"QQ

Slide 62

Slide 62 text

ςετ࣮ߦγʔέϯε 1SFQBSF .PDL FUD 1MBDL5FTU TFMFDU /FX+BWB"QQ *OUFSOBM"1* 5$1-JTUFOFS *OUFSOBM"1* 14(*"QQ

Slide 63

Slide 63 text

ςετ࣮ߦγʔέϯε 1SFQBSF .PDL FUD 1MBDL5FTU TFMFDU /FX+BWB"QQ *OUFSOBM"1* 5$1-JTUFOFS

Slide 64

Slide 64 text

ςετ࣮ߦγʔέϯε 1SFQBSF .PDL FUD 1MBDL5FTU TFMFDU /FX+BWB"QQ *OUFSOBM"1* 5$1-JTUFOFS

Slide 65

Slide 65 text

ςετ࣮ߦγʔέϯε 1SFQBSF .PDL FUD 1MBDL5FTU $IFDL3FTVMU

Slide 66

Slide 66 text

ςετ࣮ߦγʔέϯε 1SFQBSF .PDL FUD 1MBDL5FTU $IFDL3FTVMU EPOF@UFTUJOH

Slide 67

Slide 67 text

ղܾ

Slide 68

Slide 68 text

Ͳ͏΍ͬͯ΍ͬͯΔͷ • LWP(HTTP Client)Λຐվ଄ͭͭ͠Starlet(PSGI Server)Λѱ༻͢Δ • LWP::Protocol::httpsΛܧঝͨ͠ΦϨΦϨprotocolΛͭͬͯ͘޷͖์୊ • Starlet::Server#accept_loop͸max reqs per childΛ1ʹͯ͠ݺͼग़͢ • Server::Starter༻ʹ༻ҙ͞Εͨlistenersʹࣗ෼Ͱ࡞ͬͨSocketΛ౉͢ • acceptͯ͠ϦΫΤετΛॲཧ͢Δ·ͰStarletͰશࣗಈ

Slide 69

Slide 69 text

select(2) is cool

Slide 70

Slide 70 text

͓ΘΓ