Slide 1

Slide 1 text

WebγεςϜͷ ύϑΥʔϚϯεͱGo DeNA.go #3 id:karupaneura

Slide 2

Slide 2 text

id:karupanerura • ιϑτ΢ΣΞΤϯδχΞ @ DeNA, Co,. LTD. • ͓࢓ࣄ: ϓϥοτϑΥʔϜ։ൃ (Perl/Go/Java/etc..) • ISUCON8: ༧બग़୊νʔϜ (࡞໰ɺϕϯνϚʔΧʔ) • αϚʔΠϯλʔϯγοϓ2019: ΤϯδχΞ޲͚ίʔε։ൃ • ୅දཧࣄ @ Japan Perl Association

Slide 3

Slide 3 text

Goal

Slide 4

Slide 4 text

WebγεςϜʹ͓͚Δຊ౰ͷGoͷڧΈ Λߟ͑௚ͯ͠΋Β͏

Slide 5

Slide 5 text

໰୊ҙࣝ • ʮͱΓ͋͑ͣGoͰॻ͍͓͚ͯ͹଎͍ΜͰ͠ΐʁʯ • ͍͘ΒLLͱൺ΂ͯϕϯνϚʔΫ͕༏ल͔ͩΒͱ͍ͬͯͦΓΌ… • ʮͰ΋ISUCONͰ༧બ௨աͯ͠ΔͷGoͷνʔϜ͹͔Γ͡ΌΜʯ • ༗རͳଆ໘͸ͨ͘͞Μ͋Δ͚Ͳ…είΞ͕௿͍νʔϜ΋…

Slide 6

Slide 6 text

ݱ࣮ΛݟΑ͏

Slide 7

Slide 7 text

໰୊ͱ͔ͬ͠Γ޲͖߹͓͏

Slide 8

Slide 8 text

ࠓճ࿩͢͜ͱ • WebγεςϜʹ͓͚ΔύϑΥʔϚϯεͱ͸ͳʹ͔ • Ͳ͏͍ͬͨ΋ͷ͕ϘτϧωοΫʹͳΔͷ͔ • ͦͷͨΊʹGoͷػೳΛͲͷΑ͏ʹ׆༻͢Δͱྑ͍ͷ͔

Slide 9

Slide 9 text

ࠓճ࿩͞ͳ͍͜ͱ • DeNAαϚʔΠϯλʔϯγοϓͷৄࡉ • ͲͷΑ͏ʹܭଌͯ͠ϘτϧωοΫΛൃݟ͢ΔͱΑ͍͔

Slide 10

Slide 10 text

ͦ΋ͦ΋ύϑΥʔϚϯεͬͯͳΜ͚ͩͬʁ

Slide 11

Slide 11 text

WebγεςϜʹ͓͚Δཧ૝తύϑΥʔϚϯε • γεςϜશମͰߟ͑ͨͱ͖... • ୯Ґ࣌ؒ౰ͨΓʹͨ͘͞ΜͷϦΫΤετΛॲཧͰ͖Δ • ಉ࣌ʹෳ਺ͷϦΫΤετΛޮ཰Α͘ॲཧͰ͖Δ • ϦΫΤετ୯ҐͰඞཁͱ͢ΔϦιʔε͕গͳ͘ࡁΉ • ͋·ΓແବʹϦιʔεΛফඅ͠ͳ͍

Slide 12

Slide 12 text

ҰํͰݱ࣮ͷγεςϜͷଟ͘͸ ཧ૝తͳύϑΥʔϚϯεͰ͸ͳ͍

Slide 13

Slide 13 text

ͳͥύϑΥʔϚϯε͸௿Լ͢Δ͔ • γεςϜશମͰߟ͑ͨͱ͖ʹ... • ୯Ґ࣌ؒ౰ͨΓʹͨ͘͞ΜͷϦΫΤετΛॲཧͰ͖ͳ͍ • ಉ࣌ʹෳ਺ͷϦΫΤετΛॲཧ͢Δޮ཰͕ѱ͍ • ϦΫΤετ୯ҐͰඞཁͱ͢ΔϦιʔε͕ଟ͍ • ແବʹϦιʔεΛফඅͯ͠͠·͏

Slide 14

Slide 14 text

ύϑΥʔϚϯεͷ௿ԼཁҼΛഉআ͢Ε͹ ύϑΥʔϚϯε͸޲্Ͱ͖Δ

Slide 15

Slide 15 text

ύϑΥʔϚϯεͷ௿ԼཁҼΛഉআ͢Ε͹ ύϑΥʔϚϯε͸޲্Ͱ͖Δ γεςϜશମͷϘτϧωοΫʹ஫໨͢Δ΂͖

Slide 16

Slide 16 text

۩ମྫΛҎͯߟ͑ͯΈΔ

Slide 17

Slide 17 text

DeNA αϚʔΠϯλʔϯγοϓ2019 ΤϯδχΞίʔε

Slide 18

Slide 18 text

՝୊: ΞϓϦέʔγϣϯΛ͍͍ײ͡ʹͤΑ (͍͍ײ͡ʹ͸ύϑΥʔϚϯε΋ؚ·ΕΔ)

Slide 19

Slide 19 text

ΞϓϦέʔγϣϯ঺հ (demo)

Slide 20

Slide 20 text

ύϑΥʔϚϯεཁ݅ ʮ֨҆εϚϗͷൃചΛه೦͠CMʹग़ԋதͷਓؾܳਓ͕ϦΞϧλ ΠϜͰ࣭໰Λड͚෇͚Δઐ໳νϟϯωϧΛ։ઃ͠·͢ɻʯ ͜͜·Ͱ଱͑ΒΕΕ͹ޚͷࣈɺഒͰ΋େৎ෉ͳΒ҆຾Մೳɿ • 5000ൃݴ/ඵ (x2: 10000ൃݴ/ඵ) • 5ສਓͷಉ࣌઀ଓ (10ສಉ࣌઀ଓ)

Slide 21

Slide 21 text

γεςϜߏ੒ਤ • EC2 1୆ • AppͱDBಉډ • ALBͰTLSΛॲཧ • S3/Cloud Frontະ࢖༻

Slide 22

Slide 22 text

ύϑΥʔϚϯεվળͷྲྀΕ for { • ܭଌ • ϘτϧωοΫΛಛఆ • ϘτϧωοΫΛղফ }

Slide 23

Slide 23 text

ύϑΥʔϚϯεվળͷྲྀΕ for { • ܭଌ • ϘτϧωοΫΛಛఆ • ϘτϧωοΫΛղফɹˡɹࠓճ͸͜͜ʹ஫໨ }

Slide 24

Slide 24 text

࣮ࡍͷύϑΥʔϚϯεվળ

Slide 25

Slide 25 text

վળޙͷγεςϜߏ੒ਤ • App/DB෼཭ • S3/Cloud Front׆༻ • ΄͔MySQLνϡʔχϯά౳

Slide 26

Slide 26 text

ൃݴ͕ଟ͘ͳΔ໰୊΁ͷରࡦ

Slide 27

Slide 27 text

ൃݴ͕ଟ͘ͳΔ໰୊΁ͷରࡦ • νϟοταʔϏεͷൃݴ͕ଟ͍ͱͲ͏ͳΔ͔ • DBͷinsert͕٧·Δ (MySQLͷνϡʔχϯάͰ΋Ұఆվળ͢Δ) • insert͕ͳͥ٧·Δ͔ • DBͷϩοΫΛಉ࣌ଟൃతʹऔΔ͜ͱʹͳΔ͔Β

Slide 28

Slide 28 text

insertͷϩοΫڝ߹ʹͲ͏ରॲ͢Δ͔ • insert͸DBͷϩοΫΛऔΔ͜ͱʹͳΔ • ϩοΫΛऔΔػձΛ΁Β͢͜ͱʹΑͬͯϩοΫڝ߹ΛݮΒͤΔ • ෳ਺ͷൃݴΛ·ͱΊͯinsert͢Δͱ... • 1ճͷϩοΫͰෳ਺ͷൃݴ͕insertͰ͖͓ͯಘ

Slide 29

Slide 29 text

insertΛbufferingͯ͠·ͱΊͯ΍Δ • ൃݴΛόοϑΝϦϯάͯ͠insert͢Δworker goroutineΛ࡞੒ • ϦΫΤετΛॲཧ͢Δgoroutine͔Βchannelܦ༝Ͱ౤͛Δ • channelͰinsertͷ݁ՌΛड͚औΔ • worker͸buffer͕Ұఆ݅਺ཷ·ͬͨͱ͖͔ҰఆͷintervalͰॲཧ

Slide 30

Slide 30 text

࣮ࡍͷίʔυ • ʢDBνϡʔχϯά͚ͩͰ໰୊Λղফͯ͠͠·ͬͨͷͰະ࣮૷ʣ • DeNA.goͷͨΊʹॻ͖ԼΖͦ͏ͱࢥ͚ͬͨͲؒʹ߹Θͳ͔ͬͨ

Slide 31

Slide 31 text

ಉ࣌઀ଓ਺͕ଟ͘ͳΔ໰୊΁ͷରࡦ

Slide 32

Slide 32 text

ಉ࣌઀ଓ਺͕ଟ͘ͳΔͱ • ൃݴͷऔಘ͕ଟ͘ͳΔ • ࠩ෼͚ͩऔಘ͍ͨ͠ • ͔͠͠৽ணΛpolling͢Δͱൃݴͷগͳ͍νϟϯωϧ͕ਏ͍ • ʢॳظ࣮૷͸શൃݴΛऔΔAPIΛpollingͯ͠Δʣ

Slide 33

Slide 33 text

Server Sent Events • ҰੲલͷComet͕࢓༷Λ੔ཧͯ͠ਖ਼نԽ͞Ε·ͨ͠తͳ΍ͭ • WebSocketΑΓѻ͍͕؆୯ • αʔόʔͱΫϥΠΞϯτͰίωΫγϣϯΛషΓଓ͚Δ • αʔόʔ͔ΒΫϥΠΞϯτʹσʔλΛpushͰ͖Δ (ٯ͸ෆՄ)

Slide 34

Slide 34 text

DBʹϦΫΤετΛඈ͹͞ͳ͍ • ͖ͬ͞ͷ΍ͭͱಉ͡ཁྖͰworker͕࠷৽ͷൃݴΛbuffering͢Δ • DB΁͸worker͚͕ͩpollingͯ͠bufferΛߋ৽͍ͯ͘͠ • client͝ͱʹ࠷ޙͷൃݴΛอ͓͍࣋ͯͯͦ͠ΕҎ߱ͷ෺Λ௨஌ • ௨஌͞Εͨ΋ͷΛServer Sent EventsͰclientʹૹΔ

Slide 35

Slide 35 text

࣮ࡍͷίʔυ (worker goroutine)

Slide 36

Slide 36 text

࣮ࡍͷίʔυ (worker goroutine)

Slide 37

Slide 37 text

࣮ࡍͷίʔυ (worker goroutine)

Slide 38

Slide 38 text

࣮ࡍͷίʔυ (http handler)

Slide 39

Slide 39 text

ͦͷଞ

Slide 40

Slide 40 text

sync.Pool • ϦΫΤετͷbytes.BufferͳͲΛৗʹ࡞ΔͱGC͕ਏ͍ • sync.PoolΛ࢖͏ͱgoroutine͝ͱʹڝ߹͠ͳ͍Pool͕࡞ΕΔ • ϝϞϦޮ཰͸ྑ͍͕ϝϞϦ͸ফඅ͍ͯ͘͠ͷͰѻ͍ʹ͸஫ҙ

Slide 41

Slide 41 text

encoding/json • ϨεϙϯεΛ࡞Δͷʹඞͣ͠΋ͦΕͱಉαΠζͷόοϑΝΛ࡞ Δඞཁ͸ͳ͍ • ࡞ͬͨͿΜ͔Βૹ͍͚ͬͯ͹Α͍ • ͨͩ͠ (*json.Encoder).Write ͸్தͰerrorΛฦ͠ࢭ·Δ͜ͱ ͕͋Δ • ਖ਼͘͠ϨεϙϯεΛฦͨ͢Ίʹ͸buffer͸ඞཁ

Slide 42

Slide 42 text

io • sync.PoolͰอ࣋ͨ͠bytes.BufferΛhttp.ResponseWriter΁ • bytes.Buffer͸io.WriterToΛ࣮૷͍ͯ͠ΔͷͰWriteToͰ͖Δ • bytes.BufferͷWriteTo͸bytes.Bufferͷposition͚ͩม͍͑ͯ ͖ޮ཰Α͘WriteͰ͖Δ • io.CopyBufferͳͲ΋ศར

Slide 43

Slide 43 text

database/sql • σϑΥϧτͰDBͱͷ઀ଓΛόοϑΝϦϯάͯ͘͠ΕΔ • SetMaxIdleConns/SetMaxOpenConns/SetConnMaxLifetime • ࣮ࡍͷن໛ʹ͋Θͤͯௐ੔͢Δͱ઀ଓ͕࠷దԽͰ͖Δ • SetMaxIdleConnsͷσϑΥϧτ͸2

Slide 44

Slide 44 text

·ͱΊ

Slide 45

Slide 45 text

·ͱΊ • Goʹ͚ͨͩ͠Ͱ͸଎͘ͳΒͳ͍ͷͰϦιʔεΛޮ཰Α͘࢖͓͏ • ಛʹϘτϧωοΫʹͳΓ΍͍͢Ϧιʔεʹ஫ҙ • ༨༟͕͋ΔϦιʔεΛ׆༻ͯ͠޻෉͠Α͏ • جຊػೳ΍io, syncͳͲศརͳඪ४ύοέʔδΛ·ͣ׆༻͠Α͏ • ݶΓ͋ΔϦιʔεΛޮ཰Α͘׆༻͢Δϊ΢ϋ΢ͷๅݿ