Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Go駆動開発で超速Pushエンジンを作った話

 Go駆動開発で超速Pushエンジンを作った話

Go Conference 2014 spring で発表した資料。
受託開発に持ち込んだ事例紹介。
http://connpass.com/event/6370/

kadota kyohei

May 31, 2014
Tweet

More Decks by kadota kyohei

Other Decks in Technology

Transcript

  1. Goۦಈ։ൃͰ௒଎PushΤϯδϯΛ࡞ͬͨ࿩
    @plan9user
    GoCon 2014 spring

    View Slide

  2. GoΛ࢖͍͍ͨҰ৺Ͱडୗۀ຿΁࣋ͪࠐΜͩ࣌ͷ࿩

    View Slide

  3. ࣗݾ঺հ
    • ໳ଟګฏ
    • झຯ͸”Plan 9”Ͱ͢ʂ
    • Go޷͖ͳΒPlan 9ͷࢥ૝΋޷Ή͸ͣ
    • 2011೥͔ΒϑΣϯϦϧͰಇ͍ͯ·͢

    View Slide

  4. • ͜ͳ͍ͩSleipnir 6͕ग़·ͨ͠ʂ
    • ڞಉ։ൃ෦
    • اۀ༷͔Βͷडୗ։ൃΛߦ͏෦ॺ
    • ࣮੷঺հ - http://biz.fenrir-inc.com
    • Sleipnir΁ͷ͝ҙݟ͸ެࣜαΠτ͔Β
    ϑΣϯϦϧגࣜձࣾ

    View Slide

  5. • εϚʔτϑΥϯΞϓϦ։ൃ΍ͬͯ·͢
    • iOS, Android
    • Windows 8 (एׯ)
    • ࡢ೥຤͋ͨΓ͔ΒXamarin͸͡Ί·ͨ͠
    ۀ຿಺༰

    View Slide

  6. go?
    • ϓογϡ௨஌
    • ࠃ಺αʔϏεͰͳ͚Ε͹×ɹͱ͔
    • ࣗ෼ͰશମΛίϯτϩʔϧ͍ͨ͠ɹͱ͔
    • ങ͍੾Γ͍ͨɹͱ͔

    View Slide

  7. push௨஌ͷ͘͠Έ
    1. ΞϓϦτʔΫϯΛαʔόʹૹ৴
    2. αʔό͸อଘ͍ͯ͠ΔτʔΫϯͱϝοηʔδ
    Ληοτʹͯ͠APNs/GCM΁ૹ৴
    3. ϝοηʔδ͕֤୺຤΁ಧ͘
    ܾͯ͠೉͘͠͸ͳ͍Μ͚ͩͲ…

    View Slide

  8. • ࠷ॳ͸PHPͰ࣮૷
    • ਫ४Λຬͨͤͳ͍
    • ਺ेສ௨஌ʹ଱͑ΒΕͳ͍
    • ઃܭ͕·͔ͣͬͨ
    • PHPѱ͘ͳ͍
    performance problems…





    ສ ສ ສ ສ

    View Slide

  9. ͩΊͩͬͨͱ͜Ζ

    View Slide

  10. problem?
    • PHPͳͷͰฒྻԽ͕೉͔ͬͨ͠
    • ೋॏૹ৴๷ࢭͷͨΊDBΛΩϡʔʹ͍ͯͨ͠
    • ௨৴Τϥʔ౳ͰϦτϥΠ͢΂͖৔߹΍్த
    Ͱམͪͨ৔߹Λ૝ఆ
    • ׬ྃϚʔΫ΋DBʹ͍࣋ͬͯͨ

    View Slide

  11. goal?
    • ॲཧͷ଴ͪ࣌ؒΛͳͯ͘͠ੑೳΛ্͛Δ
    • ୺຤਺͕ଟ͍ͱ͖͸෼ࢄͯ͠ૹ৴͢Δ
    • ෳ਺ϚγϯͰͻͱͭͷγεςϜʹ͢Δ
    • DB΁ͷґଘΛͳ͘͢

    View Slide

  12. ͓΍ʁ

    View Slide

  13. ͜ΕGoͷग़൪͡ΌͶʁ

    View Slide

  14. GoΛ޷Ήཧ༝(౰࣌)
    • Rob Pike΍Russ Cox͕ࢀՃͯ͠Δ
    • Plan 9ʹ΋ؔΘ͓ͬͯΒΕ·ͨ͠
    • Alef, Limbo͔Βଓ͘CSPྑ͍
    • ඪ४ύοέʔδ΋ॆ࣮ͯͦ͠͏(งғؾ)

    View Slide

  15. GoͱXamarinಉ࣌౤ೖܾఆ
    • Α͘௨ͬͨͳͱࢥ͍·͢…
    • ӡ͕ྑ͘ظؒݶఆͷΞϓϦͩͬͨ
    • ௕ظӡ༻ͳΒอक΋ߟ͑Δඞཁ͕͋Δ
    • ։ൃظ͕ؒൺֱత௕͘औΕͨ
    • ࠷ॳ͸ௐ΂ͳ͕Βॻ͘ͷͰޮ཰ѱ͍

    View Slide

  16. GoͰॻ͘ʂ

    View Slide

  17. overview
    GSPOU
    GSPOU
    DUMS
    BHFOU
    BHFOU
    BHFOU
    rpc઀ଓ
    ϊʔυ(ϓϩηε)

    View Slide

  18. net/rpcύοέʔδ
    // ܾ·ͬͨܗͷϝιουΛΤΫεϙʔτ͓͍ͯͯ͠
    fund (agent *Agent) Broadcast(r *Request, res *Response) error {
    return nil
    }
    !
    // ผͷϊʔυ͔ΒrpcΛίʔϧ͢Δ
    c, _ := rpc.Dial(“net”, “localhost:17030”)
    err := c.Call(“Broadcast”, r, &res)

    View Slide

  19. front
    GSPOU
    GSPOU
    DUMS
    BHFOU
    BHFOU
    BHFOU
    rpc઀ଓ
    ϊʔυ(ϓϩηε)

    View Slide

  20. front
    • Ҋ݅ݻ༗ͷϩδοΫΛ୲౰
    • ΄ͱΜͲ͕JSONΛड৴ͯ͠ɺctlr΁ϦΫΤετૹ৴
    • Ҋ݅ݻ༗ͷϩδοΫͳͷͰ౎౓࣮૷͢Δ
    • DBؔ܎ͷॲཧ΋͜ͷϊʔυ͕ରԠ͢Δ

    View Slide

  21. controller
    GSPOU
    GSPOU
    DUMS
    BHFOU
    BHFOU
    BHFOU
    rpc઀ଓ
    ϊʔυ(ϓϩηε)

    View Slide

  22. controller
    • front͔ΒͷrpcϦΫΤετΛड͚෇͚Δϊʔυ
    • ෳ਺ͷΤʔδΣϯτΛ؅ཧ͢Δ
    • 1ϦΫΤετ಺ͷ௨஌਺͕ଟ͗͢Δ৔߹͸ෳ਺
    ΤʔδΣϯτ΁෼ׂసૹ
    • ΤʔδΣϯτͷબผ͸ۭ͍͍ͯΔ΋ͷΛબͿ *

    View Slide

  23. ։͍͍ͯΔagentΛબ୒
    // ϦΫΤετ༻νϟωϧΛ1ຊ͚ͩ༻ҙ
    req := make(chan *Request, bufSize)
    !
    // ؅ཧ͢Δϊʔυ෼ɺϦΫΤετ༻νϟωϧ͔Βड৴͢ΔΰϧʔνϯΛىಈ͓ͯ͘͠
    for agent := range agents {
    go func(c chan *Request){
    _ = <-c
    }(req)
    }
    !
    // νϟωϧʹϦΫΤετΛ౤͛Δͱ଴ػ͍ͯ͠ΔΰϧʔνϯͷͲΕ͔͕र͏
    select {
    case req <- newReq:
    ….
    case <-time.After(timeoutInterval):

    View Slide

  24. agent
    GSPOU
    GSPOU
    DUMS
    BHFOU
    BHFOU
    BHFOU
    rpc઀ଓ
    ϊʔυ(ϓϩηε)

    View Slide

  25. • ίϯτϩʔϥ͔ΒͷϦΫΤετΛ࣮ࡍʹ
    APNs/GCM΁ૹ৴͢Δ
    • ෳ਺ϦΫΤετ͸ՄೳͳΒ1ͭʹ·ͱΊΔ *
    agent

    View Slide

  26. ෳ਺·ͱΊͯૹ৴
    que := make(chan *Message, bufSize)

    // ctlr͔ΒͷϦΫΤετड৴
    req := <-que
    msgs = append(msgs, req)
    for len(que) > 0 {
    msgs = append(msgs, <-que)
    }
    conn.WriteMessages(msgs)

    View Slide

  27. ੑೳଌఆ

    View Slide

  28. ੑೳଌఆ
    • ࣮ࡍͷAPNs/GCMΛ࢖ͬͯੑೳࢼݧ͸೉͍͠
    • ࢼݧʹ଱͑͏Δྔͷ୺຤Λ͍࣋ͬͯͳ͍
    • GCM͸1୺຤΁਺ສ݅ૹΔͱInternalServerError
    • Fake APNs/GCMΛ࡞ͬͯϕϯνϚʔΫ
    • গͳ͘ͱ΋લճΑΓྑ͘ͳͬͨͷ͔͸෼͔Δ

    View Slide

  29. ςετίʔυ
    // ςετ༻Fake APNsαʔό(ຊ෺͸gateway.push.apple.com:2195)Λىಈ
    s := apnstest.NewServer(func(w io.Writer, msg *apns.Message) {
    // wʹԿ͔Write͢Ε͹Τϥʔͱͯ͠ΫϥΠΞϯτʹฦ͢
    // Կ΋͠ͳ͚Ε͹ਖ਼ৗʹ௨஌׬ྃ
    })
    cli := NewClient(s.Addr)
    msg := newMessage()
    !
    que := make([]<-chan error, b.N)
    for i := 0; i < b.N; i++ {
    que[i] = cli.Go(msg)
    }

    View Slide

  30. result.
    • ฒྻ਺ʹΑΔ͕10ʙ
    30ඵͰεέʔϧ͢Δ
    Α͏ʹͳͬͨ
    • άϥϑ͸15ฒྻఔ౓
    • 2ʙ300ສ͋ͨΓͳΒ
    ͓ͦΒ͘ಉ͡ఔ౓





    ສ ສ ສ ສ
    1)1൛ (P൛

    View Slide

  31. डୗ։ൃͱGo

    View Slide

  32. • डୗ։ൃͷ৔߹ɺGoಋೖ͸೉͘͠Έ͑Δ
    • ٕज़ऀ਺͕গͳ͍
    • ن໛ͷେ͖ͳ։ൃʹ଱͑ΒΕͳ͍
    • 2೥ޙ3೥ޙ΋αϙʔτ͞Ε͍ͯΔ͔ෆಁ໌
    • ࣮੷͕গͳ͍
    Goͬͯେৎ෉ʁ

    View Slide

  33. • ؀ڥߏங͕؆୯
    • όΠφϦ͚ͩͰಈ࡞͢Δ

    ˠຊ൪؀ڥͰϥΠϒϥϦ؅ཧ͕ෆཁ
    • WindowsͰ΋LinuxͰ΋ಈ࡞͢Δ
    • ࠓ೥ྲྀߦΔݴޠʹϊϛωʔτ
    • ྲྀߦͬͨࠒʹࣗຫͰ͖Δɺ͔΋ʁ
    ͚ͩͲϝϦοτ΋

    View Slide

  34. GoͰྑ͔ͬͨ͜ͱ͸͋ͬͯ΋
    Go͔ͩΒࠔͬͨ͜ͱ͸ແ͍
    डୗͰ΋GoΛྲྀߦΒ͍ͤͯ͜͏

    View Slide

  35. ͋Γ͕ͱ͏͍͟͝·ͨ͠

    View Slide