Slide 1

Slide 1 text

©2020 Wantedly, Inc. Real World Migration from HTTP to gRPC 08.Sep.2020 - Nao Minami (@south37) Wantedly, Inc. CloudNative Days Tokyo 2020

Slide 2

Slide 2 text

©2019 Wantedly, Inc. /BP.JOBNJ *OGSBTUSVDUVSF5FBN 8BOUFEMZ *OD (JU)VCTPVUI 5XJUUFSTPVUI ϚΠΫϩαʔϏεؒ௨৴΁ͷH31$ಋೖʹऔΓ૊Ή 43&ͱͯ͠ͷ໾ׂʢαʔϏεͷ৴པੑʹ੹೚ʣ ։ൃج൫ͱͯ͠ͷ໾ׂʢΤϯδχΞͷੜ࢈ੑʹ੹೚ʣ

Slide 3

Slide 3 text

©2020 Wantedly, Inc. 1. gRPC Λͳͥར༻͢Δͷ͔ 2. gRPC ΛͲ͏ར༻࢝͠Ί͔ͨ 3. gRPC Λࣾ಺ʹͲ͏޿Ί͔ͨ Agenda

Slide 4

Slide 4 text

©2020 Wantedly, Inc. 1. gRPC Λͳͥར༻͢Δͷ͔ 2. gRPC ΛͲ͏ར༻࢝͠Ί͔ͨ 3. gRPC Λࣾ಺ʹͲ͏޿Ί͔ͨ Agenda

Slide 5

Slide 5 text

©2020 Wantedly, Inc. gRPC ͱ͸

Slide 6

Slide 6 text

©2020 Wantedly, Inc. gRPC ͱ͸ Google ੡ͷ high performance ͳ RPC framework w 3FNPUF1SPDFEVSF$BMM 31$ w DMJFOU͕ؔ਺ݺͼग़͠SFNPUFTFSWFS্Ͱؔ਺ݺͼग़͕͠ॲཧ͞Εͯ݁Ռ͕ฦ͞ΕΔ w )551Λ௨৴ϓϩτίϧͱͯ͠ར༻ w 1SPUPDPM#V⒎FSTΛαʔϏεఆٛʢTFSWFSͰ࣮૷͞Εͨ ؔ਺ͷܕʣͷهड़ʹར༻ H31$ͷެࣜEPDVNFOUΑΓҾ༻

Slide 7

Slide 7 text

©2020 Wantedly, Inc. HTTP/2 ͱ͸ ޮ཰తͳ Hypertext Transfer Protocol (HTTP) w (PPHMF੡41%:QSPUPDPM͕ݩʹͳͬͯඪ४Խ w 5SBOTQPSUΛޮ཰Խ͢Δ͍ͭ͘΋ͷ༏ΕͨػೳଟॏԽɺϔομѹॖɺFUD H31$ͷIJHIQFSGPSNBODFʹߩݙ IUUQTEFWFMPQFSTHPPHMFDPNXFCGVOEBNFOUBMTQFSGPSNBODFIUUQΑΓҾ༻

Slide 8

Slide 8 text

©2020 Wantedly, Inc. Protocol Buffers ͱ͸ Google ੡ IDL + ίϯύΠϥ + serialization library w *OUFSGBDF%FpOJUJPO-BOHVBHF *%- αʔϏεఆٛΛهड़͢ΔͨΊͷಠࣗݴޠ w *%-ͰαʔϏεఆٛΛهड़͢Δͱɺ1SPUPDPM#V⒎FSTίϯύΠϥʢQSPUPDʣ͕ ޮ཰తͳTFSJBMJ[BUJPOͷҝͷίʔυΛࣗಈੜ੒ w αʔϏεఆٛ͸"1*4DIFNBͱͯ͠ͷ໾ׂΛՌͨ͢ 4DIFNB%SJWFO%FWFMPQNFOUͰߴ͍ੜ࢈ੑΛ࣮ݱՄೳ API Schema = proto ϑΝΠϧ 4FSWFS։ൃ $MJFOU։ൃ

Slide 9

Slide 9 text

©2020 Wantedly, Inc. gRPC ͸ HTTP/2 ͱ Protocol Buffers Λར༻͢Δ ༏Εͨ RPC framework

Slide 10

Slide 10 text

©2020 Wantedly, Inc. gRPC Λͳͥར༻͢Δͷ͔

Slide 11

Slide 11 text

©2018 Wantedly, Inc. 8BOUFEMZͰ͸ 8BOUFEMZ7JTJUɺ8BOUFEMZ1FPQMFΛ ϚΠΫϩαʔϏεͰ։ൃ

Slide 12

Slide 12 text

©2018 Wantedly, Inc. ͸ͨΒ͘Λ໘ന͘ ༗໊اۀ΍ϕϯνϟʔɺελʔτΞοϓاۀɺؾʹͳΔ ΦϑΟεʹ࿩Λฉ͖ʹ͍͜͏ɻ
 ΩϥͬͱޫΔγΰτ΍ϓϩδΣΫτɺձࣾΛݟ͚ͭͯ ΤϯτϦʔ͠·͠ΐ͏ɻ஌Γ߹͍ͷͭͳ͕Γ͕෼͔ͬͯ ҆৺Ͱ͢ɻ

Slide 13

Slide 13 text

©2018 Wantedly, Inc. ड͚औ໊ͬͨࢗશͯΛɺճͷࡱӨͰಉ࣌ ʹಡΈࠐΈɻ
 ಡΈࠐΜ໊ͩࢗ͸ਓ޻஌ೳ͕ଈ࣌σʔλԽ ͠ɺ࿈བྷாʹ௥Ճ͞Ε·͢ɻ ݡ໊ࢗ͘؅ཧ

Slide 14

Slide 14 text

©2020 Wantedly, Inc. എܠ: Wantedly Visit ͱ Wantedly People ͷΞʔΩςΫνϟ ໿ 100 ͷϚΠΫϩαʔϏεΛ૊Έ߹Θͤͨ ΞʔΩςΫνϟ w 3VCZ (P 1ZUIPO /PEFKTͳͲ༷ʑͳݴޠͰϚΠΫϩαʔϏεΛ࣮૷ w ݩʑϚΠΫϩαʔϏεؒ௨৴ʹ͸)551Λར༻ LTDMVTUFS $PSF4FSWJDFT

Slide 15

Slide 15 text

©2018 Wantedly, Inc. ϚΠΫϩαʔϏε։ൃΛਐΊΔ্Ͱ ͍͔ͭ͘՝୊͕ଘࡏͨ͠

Slide 16

Slide 16 text

©2020 Wantedly, Inc. HTTP/1.1 Λར༻͢ΔࣄͰੜ͡Δ௨৴ latency ͕໰୊ w ,FFQBMJWFແ͠ͷૉ๿ͳ)551͸༷ʑͳཁҼͰ஗͘ͳΔ w FH%/4MPPLVQ 5$1XBZIBOETIBLF 5$1TMPXTUBSU FUD ՝୊1 ϚΠΫϩαʔϏε -BUFODZDBVTFECZVTJOH)551

Slide 17

Slide 17 text

©2020 Wantedly, Inc. ϚΠΫϩαʔϏεͰ͸௨৴ latency ͷӨڹ͕େ͖͍ w ௨৴૬ख͕૿͑Δ΄Ͳɺ௨৴MBUFODZʢಛʹUBJMMBUFODZʣͷӨڹΛड͚΍͘͢ͳΔ w ྫϚΠΫϩαʔϏεؒ௨৴͕ͷ֬཰Ͱ஗͘ͳΔέʔεΛߟ͑Δ w ݸͷϚΠΫϩαʔϏεͱ௨৴͢Δ৔߹શମͱͯ͠͸ͷ֬཰Ͱ஗͍ w ݸͷϚΠΫϩαʔϏεͱ௨৴͢Δ৔߹શମͱͯ͠͸ͷ֬཰Ͱ஗͍ w ࣮ࡍʹUBJMMBUFODZͷد༩Ͱ஗͘ͳͬͯΔϚΠΫϩαʔϏε͕ଘࡏͨ͠ w ྫଞͷϚΠΫϩαʔϏεͱͷ௨৴MBUFODZ͕ࢧ഑తͳϚΠΫϩαʔϏεͰ BWFSBHFSFTQPOTFUJNFNTʹରͯ͠UJMFSFTQPOTFUJNF͕ NT ϚΠΫϩαʔϏεؒ௨৴ͷUBJMMBUFODZվળ͕ඞཁͱ͞Ε͍ͯͨ ϚΠΫϩαʔϏεʹ͓͚Δ௨৴ latency ͷ໰୊

Slide 18

Slide 18 text

©2020 Wantedly, Inc. Protocol Buffers ͷԸܙΛҰ෦ͷνʔϜͷΈ͕ڗड w ݩʑɺҰ෦νʔϜͰ͸1SPUPDPM#V⒎FSTΛϚΠΫϩαʔϏεͷ"1*4DIFNBͱͯ͠ར༻ 4DIFNB%SJWFO%FWFMPQNFOUͰߴ͍ੜ࢈ੑΛ࣮ݱ ՝୊2 CVJMEFSTDPOUPLZPl8FC"1*ʹடংΛ༩͑Δ1SPUPDPM#V⒎FSTl w ͔͠͠ɺ1SPUPDPM#V⒎FSTPWFS)551Ͱ͸ʮQBZMPBEΛMJCSBSZ͔Βར༻ͮ͠Β͍ʯ ͳͲ͍͔ͭ͘໰୊͋Γ ࣾ಺શମʹ͸1SPUPDPM#V⒎FSTΛ޿͛ͮΒ͍ঢ়گͩͬͨ

Slide 19

Slide 19 text

©2020 Wantedly, Inc.

Slide 20

Slide 20 text

©2020 Wantedly, Inc. gRPC ʹظ଴ͨ͜͠ͱ 1. ϚΠΫϩαʔϏεͷύϑΥʔϚϯεվળ 2. Protocol Buffers ͷࣾ಺શମͰͷར༻ʹΑΔɹɹɹ ։ൃੜ࢈ੑ޲্

Slide 21

Slide 21 text

©2020 Wantedly, Inc. gRPC ͕՝୊Λղܾͯ͘͠ΕΔ͜ͱΛظ଴ͯ͠ ಋೖΛܾΊͨ

Slide 22

Slide 22 text

©2020 Wantedly, Inc. 1. gRPC Λͳͥར༻͢Δͷ͔ 2. gRPC ΛͲ͏ར༻࢝͠Ί͔ͨ 3. gRPC Λࣾ಺ʹͲ͏޿Ί͔ͨ Agenda

Slide 23

Slide 23 text

©2020 Wantedly, Inc. 2-1. ݕূ 2-2. Πϯϑϥ੔උ 2-3. খ͘͞ಋೖ & ޮՌଌఆ 2. gRPC ΛͲ͏ར༻࢝͠Ί͔ͨ

Slide 24

Slide 24 text

©2020 Wantedly, Inc. 2-1. ݕূ 2-2. Πϯϑϥ੔උ 2-3. খ͘͞ಋೖ & ޮՌଌఆ 2. gRPC ΛͲ͏ར༻࢝͠Ί͔ͨ

Slide 25

Slide 25 text

©2020 Wantedly, Inc. gRPC ͷύϑΥʔϚϯεΛ։ൃ༻ k8s cluster Ͱݕূ w ݩʑɺຊ൪LTDMVTUFSͱ΄΅ಉ͡ߏ੒ͷLTDMVTUFS͕։ൃ༻్ͱͯ͠ଘࡏ w ϚΠΫϩαʔϏεͷίʔυΛH31$Λར༻͢Δ΋ͷ΁ͱॻ͖׵͑ͯ-BUFODZΛܭଌ 2-1. ݕূ ຊ൪LTDMVTUFS )551ϚΠΫϩαʔϏε )551 H31$ϚΠΫϩαʔϏε ։ൃ༻LTDMVTUFS 5SZH31$

Slide 26

Slide 26 text

©2020 Wantedly, Inc. gRPC ͷݕূ݁Ռ͸ʁ

Slide 27

Slide 27 text

©2020 Wantedly, Inc. ௨৴෦෼ͷ latency ͷܶతͳվળΛ؍ଌ w "WFSBHFMBUFODZഒߴ଎Խ NTNT w 5BJMMBUFODZ UJMF ഒߴ଎Խ NTNT Latency [ms] percentile gRPC ։ൃ༻ k8s cluster Ͱͷ Benchmark ݁Ռ HTTP/1.1 20 40 60 80 100 100 150 50 0

Slide 28

Slide 28 text

©2020 Wantedly, Inc. ݕূ݁ՌΛड͚ͯ gRPC ΁ͷظ଴͕ߴ·ͬͨ

Slide 29

Slide 29 text

©2020 Wantedly, Inc. 2-1. ݕূ 2-2. Πϯϑϥ੔උ 2-3. খ͘͞ಋೖ & ޮՌଌఆ 2. gRPC ΛͲ͏ར༻࢝͠Ί͔ͨ

Slide 30

Slide 30 text

©2020 Wantedly, Inc. gRPC Λ Production Ͱར༻͢ΔͨΊͷΠϯϑϥ w -PBE#BMBODJOHɺ.POJUPSJOHͳͲͷΠϯϑϥ੔උ͕ඞཁ 2-2. Πϯϑϥ੔උ

Slide 31

Slide 31 text

©2020 Wantedly, Inc. gRPC Λ Production Ͱར༻͢ΔͨΊͷΠϯϑϥ w-PBE#BMBODJOH w .POJUPSJOH 2-2. Πϯϑϥ੔උ

Slide 32

Slide 32 text

©2020 Wantedly, Inc. gRPC ʹ͓͍ͯ͸ɺL4 load-balancer ͸ෆద੾ w H31$͸)551Λ׆༻ͯ͠ʮҰ౓ཱ֬ͨ͠MPOHMJWFEͳ5$1DPOOFDUJPOΛԿ౓΋ SFRVFTUʹར༻͢Δʯલఏͷઃܭ w -MPBECBMBODFS͸5$1DPOOFDUJPOཱ֬ͷෛՙ෼ࢄ͔͠ߦΘͳ͍ͨΊɺH31$Ͱ͸ USB⒏Dͷෛՙ෼ࢄ͕͏·͘ߦΘΕͳ͍ Load Balancing ௨৴૬ख͕ݻఆ͞ΕΔ

Slide 33

Slide 33 text

©2020 Wantedly, Inc. ղܾࡦ: Istio Λ L7 load-balancing ʹར༻ w *TUJP͸ɺ,VCFSOFUFTͳͲͰར༻Ͱ͖ΔαʔϏεϝογϡɾϓϥοτϑΥʔϜ w *TUJPʹΑͬͯDPOpHVSF͞Εͨ&OWPZΛTJEFDBSQSPYZͱͯ͠JOKFDUͯ͠ɺ -MPBECBMBODJOHʹར༻ͨ͠ Load Balancing &OWPZ

Slide 34

Slide 34 text

©2020 Wantedly, Inc. gRPC Λ Production Ͱར༻͢ΔͨΊͷΠϯϑϥ w -PBE#BMBODJOH w.POJUPSJOH 2-2. Πϯϑϥ੔උ

Slide 35

Slide 35 text

©2020 Wantedly, Inc. ຊ൪؀ڥͷΞϓϦέʔγϣϯ͸ϞχλϦϯά͕ඞཁ w ໰୊ͷݕ஌΍ύϑΥʔϚϯεͷܭଌͳͲ༷ʑͳ໨తͰϞχλϦϯάΛߦ͏ w )551Ͱ͸ͲͷϚΠΫϩαʔϏε΋%BUBEPH /FX3FMJD )POFZCBEHFSͳͲͰ SFRVFTU͝ͱͷNFUSJDTΛϞχλϦϯάಉ͡ঢ়گΛH31$Ͱ΋࡞Γ͍ͨ Monitoring

Slide 36

Slide 36 text

©2020 Wantedly, Inc. Monitoring gRPC server ͷϞχλϦϯάΛͲ͏࣮ݱ͢Δ͔ʁ => gRPC interceptor Λར༻ w H31$JOUFSDFQUPSΛར༻͢ΔࣄͰɺʮH31$SFRVFTUSFTQPOTFͷϥΠϑαΠΫϧʹ NFUSJDTૹ৴ͳͲͷ೚ҙͷॲཧΛࠩ͠ࠐΉʯ͜ͱ͕Մೳ $MJFOUH31$JOUFSDFQUPST $MJFOU 4FSWFSH31$JOUFSDFQUPST 4FSWFS 3FRVFTU 3FTQPOTF

Slide 37

Slide 37 text

©2020 Wantedly, Inc. Monitoring gRPC interceptor Λ༻ҙ w ֤छ4BB4޲͚ͷH31$JOUFSDFQUPSΛ࣮૷ͨ͠ w 3VCZ࣮૷ͷҰ෦͸044ͱͯ͠ެ։

Slide 38

Slide 38 text

©2020 Wantedly, Inc. 2-1. ݕূ 2-2. Πϯϑϥ੔උ 2-3. খ͘͞ಋೖ & ޮՌଌఆ 2. gRPC ΛͲ͏ར༻࢝͠Ί͔ͨ

Slide 39

Slide 39 text

©2020 Wantedly, Inc. Ұ෦ͷϚΠΫϩαʔϏεͰ gRPC Λಋೖ w H31$ಋೖΛૉૣ͘ਐΊΔͨΊʹɺ࠷ॳ͸Ұ෦ͷϚΠΫϩαʔϏεͰಋೖ w ର৅ͱͯ͠lϢʔβʔαʔϏεzΛબΜͩ 2-3. খ͘͞ಋೖ & ޮՌଌఆ LTDMVTUFS $PSF4FSWJDFT ϢʔβʔαʔϏε

Slide 40

Slide 40 text

©2020 Wantedly, Inc. ͳͥϢʔβʔαʔϏεΛબΜͩͷ͔ʁ ಛ௃: traffic ͕ଟ͘ low latency ͕ඞཁ w ଟ͘ͷϚΠΫϩαʔϏε͔Βར༻͍ͯ͠ΔͨΊUSB⒏D͕ଟ͍ w Ϣʔβʔ͔ΒͷSFRVFTUॲཧͰಉظతʹSFRVFTU͞ΕΔέʔεଟ਺MPXMBUFODZ͕ඞཁ H31$ಋೖʹΑΔΠϯύΫτ͕ݦஶʹݱΕΔ͜ͱ͕ظ଴ग़དྷΔ ϢʔβʔαʔϏε Ϣʔβʔͷઃఆ஋΍ϓϩϑΟʔϧͷऔಘɾߋ৽

Slide 41

Slide 41 text

©2020 Wantedly, Inc. gRPC ಋೖΛͲ͏ਐΊ͔ͨʁ

Slide 42

Slide 42 text

©2020 Wantedly, Inc. k8s objects Λ 2 ηοτ༻ҙ w ύϑΥʔϚϯεಛੑͳͲ͕ҧ͏ͷͰɺ%FQMPZNFOUͱ)1"Λݸผʹ༻ҙ w )5513VCZPO3BJMTTFSWFS͕ىಈ͢Δ%FQMPZNFOU)1"4FSWJDF w H31$H31$TFSWFS͕ىಈ͢Δ%FQMPZNFOU)1"4FSWJDF w $MJFOUଆͰ௨৴ઌIPTU໊ LT4FSWJDF Λ੾Γସ͑ͯ௨৴खஈΛ੍ޚ gRPC ಋೖͷਐΊํ H31$ H31$TFSWFS $MJFOUϚΠΫϩαʔϏε )551 3VCZPO3BJMT

Slide 43

Slide 43 text

©2020 Wantedly, Inc. Client ϚΠΫϩαʔϏεͰ gRPC ͷར༻Λ૿΍͢ w Ұ෦ϦΫΤετʹH31$Λಋೖ༷ͯ͠ࢠΛݟͳ͕Βɺঃʑʹׂ߹Λ૿Ճ׬શʹҠߦ gRPC ಋೖͷਐΊํ ϢʔβʔαʔϏε ϢʔβʔαʔϏε )551 H31$ H31$ͷׂ߹Λ૿Ճ )551 H31$ $MJFOU $MJFOU

Slide 44

Slide 44 text

©2020 Wantedly, Inc. gRPC Λಋೖͨ݁͠Ռ͸ʁ

Slide 45

Slide 45 text

©2020 Wantedly, Inc. ϚΠΫϩαʔϏεؒ௨৴ͷύϑΥʔϚϯε͕ ܶతʹվળͨ͠

Slide 46

Slide 46 text

©2020 Wantedly, Inc. gRPC ΛҰ෦ϚΠΫϩαʔϏεʹಋೖͨ݁͠Ռ ௨৴෦෼ͷ Latency ͕ܶతʹվળ w ϢʔβʔαʔϏεͱͷ௨৴ͷBWFSBHFMBUFODZ͕SFRVFTU͋ͨΓ໿NTվળ w ౓ͷSFRVFTUॲཧͷதͰϢʔβʔαʔϏε΁Կ౓΋SFRVFTU͢Δέʔε͕ଘࡏ ௨৴ͷBWFSBHFMBUFODZ͕਺े਺ඦͷܶతվળ e.g. ϢʔβʔαʔϏε௨৴෦෼ͷ average latency ͕ 153ms ͔Β 45ms ʹ 240% վળͨ͠ྫ HTTP/1.1 gRPC

Slide 47

Slide 47 text

©2020 Wantedly, Inc. gRPC ΛҰ෦ϚΠΫϩαʔϏεʹಋೖͨ݁͠Ռ શͯͷॲཧΛؚΉ response time ΋ݦஶʹվળ w ϢʔβʔαʔϏεͱͷ௨৴͕ଟ͍FOEQPJOU͸ɺશମͷSFTQPOTFUJNF΋ܶతʹվળ w શମͱͯ͠ૣ͘ͳ͚ͬͨͩͰͳ͘ɺʮۃ୺ʹ஗͘ͳΔέʔεʯ͕ܹݮͨ͠ 5BJMMBUFODZվળͷޮՌΛ࣮ײ UJMFSFTQPOTFUJNF HTTP/1.1 gRPC e.g. 99%tile response time ͷϐʔΫ͕ 5,000ms ͔Β 1,900ms ʹ 3,000ms Ҏ্վળͨ͠ྫ

Slide 48

Slide 48 text

©2020 Wantedly, Inc. gRPC Λຊ൪ k8s cluster ʹಋೖͯ͠ ύϑΥʔϚϯεվળ͕ग़དྷΔͱ֬ೝͰ͖ͨ

Slide 49

Slide 49 text

©2020 Wantedly, Inc. 1. gRPC Λͳͥར༻͢Δͷ͔ 2. gRPC ΛͲ͏ར༻࢝͠Ί͔ͨ 3. gRPC Λࣾ಺ʹͲ͏޿Ί͔ͨ Agenda

Slide 50

Slide 50 text

©2020 Wantedly, Inc. ՝୊: gRPC ͷར༻͕Ұ෦ʹݶΒΕ͍ͯͨ w H31$͕Ұ෦Ͱ͔͠ར༻͞Εͯͳ͍ͱɺԸܙΛड͚ΒΕΔͷ͸Ұ෦ͷFOEQPJOUͱ Ұ෦ͷ։ൃऀʹݶΒΕͯ͠·͏ 3. gRPC Λࣾ಺ʹͲ͏޿Ί͔ͨ Ұ෦ͷH31$ϚΠΫϩαʔϏε ଟ͘ͷ)551ϚΠΫϩαʔϏε

Slide 51

Slide 51 text

©2020 Wantedly, Inc. ΰʔϧ: gRPC ͷར༻Λ޿͛ͯԸܙΛ޿͘ड͚Δ w ଟ͘ͷFOEQPJOUͰH31$Λར༻༏ΕͨύϑΥʔϚϯεʹΑͬͯϢʔβʔମݧΛվળ w ଟ͘ͷ։ൃऀ͕H31$Λར༻1SPUPDPM#V⒎FSTʹΑΓ։ൃੜ࢈ੑΛ޲্ 3. gRPC Λࣾ಺ʹͲ͏޿Ί͔ͨ ଟ͘ͷH31$ϚΠΫϩαʔϏε Ұ෦ͷ)551ϚΠΫϩαʔϏε

Slide 52

Slide 52 text

©2020 Wantedly, Inc. gRPC Λར༻ͨ͠։ൃΛ޿͛Δ͜ͱΛ໨ࢦͨ͠

Slide 53

Slide 53 text

©2020 Wantedly, Inc. 3-1. ։ൃ؀ڥ੔උ 3-2. ࣾ಺΁એ఻ͯ͠޿͍͛ͯ͘ 3. gRPC Λࣾ಺ʹͲ͏޿Ί͔ͨ

Slide 54

Slide 54 text

©2020 Wantedly, Inc. 3-1. ։ൃ؀ڥ੔උ 3-2. ࣾ಺΁એ఻ͯ͠޿͍͛ͯ͘ 3. gRPC Λࣾ಺ʹͲ͏޿Ί͔ͨ

Slide 55

Slide 55 text

©2020 Wantedly, Inc. ੜ࢈ੑͷߴ͍։ൃ؀ڥΛߏங w εΩʔϚ؅ཧϫʔΫϑϩʔɺϥΠϒϥϦ੔උʹΑͬͯ։ൃ؀ڥΛ੔͑Δ 3-1. ։ൃ؀ڥ੔උ

Slide 56

Slide 56 text

©2020 Wantedly, Inc. ੜ࢈ੑͷߴ͍։ൃ؀ڥΛߏங wεΩʔϚ؅ཧ w ϥΠϒϥϦ੔උ 3-1. ։ൃ؀ڥ੔උ

Slide 57

Slide 57 text

©2020 Wantedly, Inc. Monorepo Λ࠾༻͠ͳ͍৔߹͸ɺͲ͏΍ͬͯಉ͡ proto ϑΝΠϧΛڞ༗͢Δ͔ߟ͑Δඞཁ͕͋Δ ಉ͡QSPUPϑΝΠϧ 3FQPTJUPSZ" 3FQPTJUPSZ# 3FQPTJUPSZ$ εΩʔϚ؅ཧ = proto ϑΝΠϧ؅ཧ

Slide 58

Slide 58 text

©2020 Wantedly, Inc. Ͳ͏΍ͬͯ proto ϑΝΠϧΛڞ༗͢Δ͔ʁ w खಈ$PQZ1BTUFʁ ෳ਺SFQPTJUPSZΛ੔߹ੑΛอͬͯߋ৽͠ଓ͚Δͷ͕೉͍͠ w QSPUPϑΝΠϧΛࣗಈμ΢ϯϩʔυ͢ΔػߏΛ༻ҙ͢Δʁ ֤ϨϙδτϦͷ։ൃऀ͕ίʔυੜ੒Λߦ͏ඞཁ͕͋ΓɺQSPUPDWFSTJPO΍ QMVHJOͷ༗ແͳͲɺ։ൃऀؒͷ؀ڥͷҧ͍ʹۤ͠Ή ͦ͜Ͱɺcentral repository Λ༻ҙͨ͠ εΩʔϚ؅ཧ = proto ϑΝΠϧ؅ཧ

Slide 59

Slide 59 text

©2020 Wantedly, Inc. apis: εΩʔϚ؅ཧͷͨΊͷ central repository w lBQJTz͸8BOUFEMZͷ͢΂ͯͷQSPUPϑΝΠϧΛ؅ཧ εΩʔϚ؅ཧ = proto ϑΝΠϧ؅ཧ

Slide 60

Slide 60 text

©2020 Wantedly, Inc. “apis” repository ΛͲ͏ར༻͢Δͷ͔ʁ “apis” ͷ CI ύΠϓϥΠϯͰίʔυੜ੒͕ߦΘΕΔ w 3VCZ (P 1ZUIPO /PEFKTͦΕͧΕͷݴޠ޲͚ͷίʔυΛQSPUPϑΝΠϧ͔Βੜ੒ w ੜ੒͞Εͨίʔυ͸֤ݴޠͷ1BDLBHF.BOBHFSͰ഑৴ FH#VOEMFS (P.PEVMFT FUD w ։ൃऀ͕ࣗ෼Ͱίʔυੜ੒Λߦ͏ඞཁ͕ͳ͍ঢ়ଶΛ࣮ݱ

Slide 61

Slide 61 text

©2020 Wantedly, Inc. # Gemfile gem 'apis', git: 'git@github.com:wantedly/apis-ruby.git', tag: 'xxx.yyy.zzz' 3VCZXJUI#VOEMFS

Slide 62

Slide 62 text

©2020 Wantedly, Inc. ੜ࢈ੑͷߴ͍։ൃ؀ڥΛߏங w εΩʔϚ؅ཧ wϥΠϒϥϦ੔උ 3-1. ։ൃ؀ڥ੔උ

Slide 63

Slide 63 text

©2020 Wantedly, Inc. ֤ݴޠ޲͚ʹϥΠϒϥϦͰ֤छػೳΛఏڙ w ݴޠ w 3VCZ (P 1ZUIPO /PEFKT w ػೳ w H31$4FSWFS $MJFOU։ൃ༻VUJMJUZ w H31$JOUFSDFQUPST w 1SPUPDPM#V⒎FSTར༻ͷͨΊͷVUJMJUZ ϥΠϒϥϦ੔උ

Slide 64

Slide 64 text

©2020 Wantedly, Inc. ϥΠϒϥϦ͸Ͳ͏͍ͬͨܗͰ੔උͨ͠ͷ͔ʁ

Slide 65

Slide 65 text

©2020 Wantedly, Inc. “servicex” ͱݺ͹ΕΔࣾ಺ڞ௨ library Λར༻ w ݩʑɺ)551ͷ࣌୅͔ΒʮͲͷϚΠΫϩαʔϏε͔Β΋ڞ௨Ͱ࢖ΘΕΔػೳʯΛ TFSWJDFYͰఏڙ͖ͯͨ͠H31$։ൃΛศརʹ͢ΔMJCSBSZ΋TFSWJDFYͰఏڙ w TFSWJDFY͸֤ݴޠ޲͚ʹଘࡏ w 3VCZ (P 1ZUIPO ϥΠϒϥϦ͸Ͳ͏͍ͬͨܗͰ੔උͨ͠ͷ͔ʁ ϚΠΫϩαʔϏε" ϚΠΫϩαʔϏε# ϚΠΫϩαʔϏε$ lTFSWJDFYz

Slide 66

Slide 66 text

©2020 Wantedly, Inc. servicex-ruby Ͱ࣮૷ͨ͠ػೳΛҰ෦঺հ

Slide 67

Slide 67 text

©2020 Wantedly, Inc. gRPC server ։ൃͷͨΊͷ grpc-server ίϚϯυ w H31$TFSWJDFDMBTT͸ࣗಈͰIBOEMFSͱͯ͠ొ࿥ w H31$JOUFSDFQUPS΋ඞཁͳ΋ͷ͸ࣗಈͰઃఆ w 3VCZPO3BJMTͷΑ͏ͳ)PUSFMPBEJOHػೳΛఏڙ w ։ൃऀ͸ɺH31$TFSWJDFDMBTTͷ࣮૷ʹूதߴ͍ੜ࢈ੑΛ࣮ݱ “servicex-ruby” ͷػೳ $ bundle exec grpc-server handling /grpc.health.v1.Health/Check with # handling /grpc.health.v1.Health/Watch with # handling /wantedly.users.UserService/ListUsers with # . . . gRPC server starting... * Listening on tcp://0.0.0.0:6046 * Environment: development

Slide 68

Slide 68 text

©2020 Wantedly, Inc. gRPC client ͷͨΊͷ Servicex::Grpc.stub_for w H31$JOUFSDFQUPSͱͯ͠ඞཁͳ΋ͷ͸ࣗಈͰઃఆ w 6TFS"HFOU΋ࣗಈͰઃఆ w ։ൃऀ͸ʮH31$ͷ࢖͍ํʯΛؾʹ͢Δࣄͳ͘ɺϩδοΫͷ࣮૷ʹूதߴ͍ੜ࢈ੑ # NOTE: Load UsersPb::UserService from apis require "wantedly/users/users_services_pb" grpc_server_url = “xxx” client = Servicex::Grpc.stub_for( UsersPb::UserService, grpc_server_url, ) client.get_user(UsersPb::GetUserRequest.new(…)) “servicex-ruby” ͷػೳ

Slide 69

Slide 69 text

©2020 Wantedly, Inc. Pb: Protocol Buffers ͷར༻Λ؆୯ʹ͢Δ utility w 1CΛར༻͢ΔࣄͰQSPUPCVGPCKFDUΛ؆୯ʹ࡞੒Մೳ w ྫ͑͹ɺ4USJOH͔ΒUJNFTUBNQΦϒδΣΫτΛ࡞੒͢Δ͜ͱ͕Մೳ [1] pry(main)> Pb.to_timestamp("2019-05-15T00:00:00+09:00") => 8JUIl1Cz [1] pry(main)> Google::Protobuf::Timestamp.new( [1] pry(main)* seconds: Time.parse("2019-05-15T00:00:00+09:00").to_i [1] pry(main)* ) => 8JUIPVUl1Cz “servicex-ruby” ͷػೳ

Slide 70

Slide 70 text

©2020 Wantedly, Inc. servicex-ruby ͷػೳͷҰ෦͸ OSS Խ w 044ԽΛ௨ͯ͠ɺH31$ͷΤίγεςϜ੒ख़ʹߩݙ “servicex-ruby” ͱ OSS

Slide 71

Slide 71 text

©2020 Wantedly, Inc. Ruby Ͱͷ gRPC ։ൃΛखް͘αϙʔτͨ͠

Slide 72

Slide 72 text

©2020 Wantedly, Inc. Go, Python, Node.js ͳͲଞͷݴޠͰ͸ʁ

Slide 73

Slide 73 text

©2020 Wantedly, Inc. “grapi” + “servicex-go” Λར༻ w HSBQJH31$HSQDHBUFXBZߏ੒ͷ"1*TFSWFS޲͚DPEFHFOFSBUPSMJCSBSZ 044 w H31$TFSWFS୯ಠར༻΋Մೳ w TFSWJDFYHPHSBQJͷਪ঑ઃఆH31$JOUFSDFQUPS౳Λఏڙ͢Δࣾ಺ڞ௨MJCSBSZ Go ͷ gRPC ։ൃ؀ڥ (P$POGFSFODF4QSJOH lHSBQJ#VMEJOH+40/"1*TFSWFSXJUIHSQDHBUFXBZGPSNJDSPTFSWJDFTz

Slide 74

Slide 74 text

©2020 Wantedly, Inc. Go ͷ gRPC ։ൃ؀ڥ package main import ( ... "github.com/izumin5210/grapi/pkg/grapiserver" "github.com/wantedly/servicex-go/v2/pkg/servicex" "github.com/wantedly/servicex-go/v2/pkg/grpcx" "github.com/wantedly/spath/to/server" ) func InitializeGrapiServerEngine(ctx context.Context) (*grapiserver.Engine, error) { userServiceServer := server.NewUserServiceServer(ctx) engine := grapiserver.New( grpcx.WithDefault(), grapiserver.WithServers(userServiceServer), ) return engine, nil } func run() error { ctx := context.Background() defer servicex.Close() s, err := InitializeGrapiServerEngine(ctx) if err != nil { return fail.Wrap(err) } return s.ServeContext(ctx) }

Slide 75

Slide 75 text

©2020 Wantedly, Inc. “grapi” ͱ “servicex-go” ͕ࣾ಺ڞ௨ͷػೳ͸ఏڙ w ։ൃऀ͸H31$TFSWFSͷϩδοΫ࣮૷ʹूதͰ͖Δߴ͍ੜ࢈ੑΛ࣮ݱ Go ͷ gRPC ։ൃ؀ڥ

Slide 76

Slide 76 text

©2020 Wantedly, Inc. Python ͷ gRPC ։ൃ؀ڥ

Slide 77

Slide 77 text

©2020 Wantedly, Inc. “servicex-python” ͱ͍͏ࣾ಺ڞ௨ library Λར༻ w lHSQDYzQBDLBHFͱͯ͠HSQDY4FSWFSDMBTTͳͲͷVUJMJUZΛ༻ҙ w ։ൃऀ͸ɺH31$TFSWJDFDMBTTͷ࣮૷ʹूதߴ͍ੜ࢈ੑΛ࣮ݱ Python ͷ gRPC ։ൃ؀ڥ import servicex.grpcx as grpcx class UserService(users_pb2_grpc.UserServiceServicer): ... server = grpcx.Server( port=os.getenv("APP_GRPC_PORT", "3000"), max_workers=10, grpc_services=[ grpcx.ServiceInfo( name=users_pb2.DESCRIPTOR.services_by_name['UserService'].full_name, adder=users_pb2_grpc.add_UserServiceServicer_to_server, servicer=UserService(), ) ] ) server.run()

Slide 78

Slide 78 text

©2020 Wantedly, Inc. gRPC client ։ൃʹ͸ grpc package Λ௚઀ར༻ w 1ZUIPO͸.-ϚΠΫϩαʔϏεͱͯ͠຤୺Ͱͷར༻͕ଟ͍ H31$DMJFOUར༻͸গͳ͘VUJMJUZͷχʔζ͸গͳ͍ w χʔζ͕૿͑ͨλΠϛϯάͰࣾ಺ڞ௨MJCSBSZԽͷ༧ఆ Python ͷ gRPC ։ൃ؀ڥ from grpc.experimental import aio class UsersService: def __init__(self) -> None: self.base_url = ... async def get(self, user_id: int) -> users_pb2.User: async with aio.insecure_channel(target=self.base_url) as channel: stub = users_pb2_grpc.UserServiceStub(channel) req = users_pb2.GetUserRequest(...) res = await stub.GetUser(req, timeout=2) return res.user #SPXTFS H31$ 1ZUIPO.-ϚΠΫϩαʔϏε

Slide 79

Slide 79 text

©2020 Wantedly, Inc. Node.js ͷ gRPC ։ൃ؀ڥ

Slide 80

Slide 80 text

©2020 Wantedly, Inc. Node.js ੡ Backend for Frontend (BFF) Ͱ gRPC client Λར༻ w 6UJMJUZMJCSBSZΛར༻͢ΔࣄͰɺH31$DMJFOUΛར༻ͨ͠։ൃΛޮ཰Խ w lBQJTOPEFzͰܕఆٛϑΝΠϧΛੜ੒ͯ͠5ZQF4DSJQUͷ੩తܕݕࠪʹ׆༻ Node.js ͷ gRPC ։ൃ؀ڥ /PEFKT#'' (SBQI2- H31$ )551 #SPXTFS import { UserServiceClient, IUserServiceClient, } from "@wantedly_private/apis-node/path/to/users_pb"; import { serviceClientCreator } from "../../utils/grpc/"; export class UserService extends serviceClientCreator( UserServiceClient, “127.0.0.1:3000”, ) {}

Slide 81

Slide 81 text

©2020 Wantedly, Inc. ֤ݴޠͰ gRPC ։ൃ؀ڥΛ੔͑ͨ

Slide 82

Slide 82 text

©2020 Wantedly, Inc. 3-1. ։ൃ؀ڥ੔උ 3-2. ࣾ಺΁એ఻ͯ͠޿͍͛ͯ͘ 3. gRPC Λࣾ಺ʹͲ͏޿Ί͔ͨ

Slide 83

Slide 83 text

©2020 Wantedly, Inc. લఏ: ։ൃνʔϜʹ gRPC ͷར༻Λڧ੍͸ग़དྷͳ͍ w ։ൃνʔϜ͸ͦΕͧΕ͕ʮࣗ෼ͨͪͷ࠾༻͢Δٕज़ελοΫʯΛબఆ 3-2. ࣾ಺΁એ఻ͯ͠޿͍͛ͯ͘ Infra (k8s, gRPC, etc.) ։ൃ νʔϜ A w ج൫ΛUPPMMJCSBSZͱͯ͠ఏڙ w LTͷ֦ு౳ʢFHDVTUPNDPOUSPMMFSʣ w ϓϩμΫτΛ։ൃ w ࣗ෼ͨͪͰٕज़બఆ ։ൃ νʔϜ B ։ൃ νʔϜ C

Slide 84

Slide 84 text

©2020 Wantedly, Inc. Ξϓϩʔν: ϝϦοτΛૌٻͭͭࣾ͠಺ษڧձ w ʮH31$ͰύϑΥʔϚϯεվળͨ͠ྫʯΛఆظతʹࣾ಺Ͱએ఻ͯ͠ϝϦοτΛૌٻ w ʮࣾ಺ษڧձʯΛ։࠵ͯ͠ɺH31$TFSWFSDMJFOU։ൃͷ஌ࣝΛਁಁ 3-2. ࣾ಺΁એ఻ͯ͠޿͍͛ͯ͘

Slide 85

Slide 85 text

©2020 Wantedly, Inc.

Slide 86

Slide 86 text

©2020 Wantedly, Inc.

Slide 87

Slide 87 text

©2020 Wantedly, Inc. ΞϓϦέʔγϣϯίʔυॻ͖׵͑Λੵۃతʹࢧԉ w H31$ͷར༻ྫΛ૿΍͍ͯ͘͜͠ͱͰɺH31$ར༻ͷٕज़త৺ཧతϋʔυϧΛԼ͛Δ 3-2. ࣾ಺΁એ఻ͯ͠޿͍͛ͯ͘

Slide 88

Slide 88 text

©2020 Wantedly, Inc.

Slide 89

Slide 89 text

©2020 Wantedly, Inc. ϝϦοτૌٻɺࣾ಺ษڧձɺ஍ಓͳίʔυมߋΛ௨ͯ͠ ঃʑʹࣾ಺ʹ gRPC Λ޿͍͛ͯͬͨ

Slide 90

Slide 90 text

©2020 Wantedly, Inc. gRPC Λࣾ಺ʹ޿ΊΔऔΓ૊Έͷ݁Ռ͸ʁ

Slide 91

Slide 91 text

©2020 Wantedly, Inc. gRPC ͕ࣾ಺Ͱ޿͘ར༻͞ΕΔΑ͏ʹͳͬͨ w ΞΫςΟϒʹ։ൃ͞Ε͍ͯΔओཁͳϚΠΫϩαʔϏε͕H31$Խ w ৽نͷϚΠΫϩαʔϏε։ൃʹ͸΄΅H31$Λར༻ w όοΫΤϯυ։ൃऀͷ໿ׂ͕H31$Λར༻ͨ͠։ൃΛܦݧ gRPC Λࣾ಺ʹ޿ΊΔऔΓ૊Έͷ݁Ռ )551 H31$ ϢʔβʔαʔϏε $PSF4FSWJDFT

Slide 92

Slide 92 text

©2020 Wantedly, Inc. ࣾ಺ͷ։ൃऀ͔Βتͼͷ੠΋ฉ͍ͨ w lH31$͸͔ͳΓ։ൃମݧ͕ྑ͔ͬͨzͱ͍͏੠͕ಧ͍ͨ gRPC Λࣾ಺ʹ޿ΊΔऔΓ૊Έͷ݁Ռ

Slide 93

Slide 93 text

©2020 Wantedly, Inc. gRPC ͕ࣾ಺ελϯμʔυͱ ݴ͑Δͱ͜Ζ·Ͱ޿·ͬͨ

Slide 94

Slide 94 text

©2020 Wantedly, Inc. ͦͷ݁Ռ͞Βʹɻɻɻ

Slide 95

Slide 95 text

©2020 Wantedly, Inc. ϚΠΫϩαʔϏεͷύϑΥʔϚϯε͕վળग़དྷͨ w H31$͕޿͘ར༻͞ΕΔΑ͏ʹͳͬͨࣄͰɺଟ͘ͷFOEQPJOUͰԸܙΛड͚ΔΑ͏ʹͳͬͨ Protocol Buffers Λར༻ͨ͠։ൃ͕޿͕ͬͨ w H31$͕޿·ͬͨ݁Ռɺଟ͘ͷ։ൃऀ͕1SPUPDPM#V⒎FSTΛར༻͢ΔΑ͏ʹͳͬͨ εΩʔϚۦಈ։ൃͷԸܙΛड͚ΒΕΔػձ͕૿͑ͨ gRPC ͕޿·ͬͨ݁Ռ

Slide 96

Slide 96 text

©2020 Wantedly, Inc. ૊৫શମͱͯ͠ gRPC ͷԸܙΛ ड͚ΒΕΔΑ͏ʹͳͬͨ

Slide 97

Slide 97 text

©2020 Wantedly, Inc. ·ͱΊ

Slide 98

Slide 98 text

©2020 Wantedly, Inc. ύϑΥʔϚϯε΍։ൃੜ࢈ੑͷ؍఺Ͱ gRPC ʹண໨ w ՝୊)551ͷ௨৴MBUFODZ w ՝୊1SPUPDPM#V⒎FSTʹΑΔ։ൃੜ࢈ੑ޲্ͷԸܙ͕Ұ෦νʔϜʹݶఆ ૉૣ͘ಋೖ͠։ൃ؀ڥ੔උΛߦ্ͬͨͰར༻Λ޿͛ͨ w Ұ෦ͷϚΠΫϩαʔϏεͰH31$Λૉૣ͘ݕূɾಋೖ w ϝϦοτૌٻ΍ࣾ಺ษڧձͱͱ΋ʹ஍ಓʹίʔυΛมߋ͠ɺࣾ಺ʹ޿Ίͨ ͦͷ݁Ռ gRPC ͸޿͘࢖ΘΕΔΑ͏ʹͳͬͨ w ଟ਺ͷϚΠΫϩαʔϏεͰH31$͕ར༻͞ΕͯύϑΥʔϚϯε͕վળ w ଟ਺ͷ։ൃऀ͕H31$Λར༻͢ΔࣄͰɺ૊৫શମͱͯ͠։ൃੜ࢈ੑ͕޲্ ·ͱΊ

Slide 99

Slide 99 text

©2020 Wantedly, Inc. • Chris Briggs https://unsplash.com/photos/V72Hk6LjjjI Photo Credit