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

ロマサガRS における Elixir サーバー開発実践 ~生産性を上げてゲームの面白さに注力~

ロマサガRS における Elixir サーバー開発実践 ~生産性を上げてゲームの面白さに注力~

「ロマンシング サガ リ・ユニバース」( ㈱スクウェア・エニックスより配信)は、Elixir でサーバーを開発しました。アカツキとして Elixir でゲームをリリースするのは初めてでしたが、ETS を用いたオンメモリデータや、Dialyzer による型チェック、加えて Erlang VM の高い並列性を活用することで、安全な作りと高速なレスポンスタイムを担保しながら機能開発をスピーディに進めることができ、ゲームの面白さに注力することができました。

本セッションでは、ロマサガRSのアプリケーション構成や開発フローなどを話し、Elixir で安心してモバイルゲームのサーバーを開発できることを示します。また、アーキテクチャやインフラ運用にも触れ、プロダクションで運用するポイントを紹介します。最後に、Elixir で大規模負荷に対応する中で遭遇した、ややディープな問題解決の Tips を共有します。

elixirfest

June 01, 2019
Tweet

More Decks by elixirfest

Other Decks in Technology

Transcript

  1. ϩϚαΨ34ʹ͓͚Δ &MJYJSαʔόʔ։ൃ࣮ફ
    ʙੜ࢈ੑΛ্͛ͯήʔϜͷ໘ന͞ʹ஫ྗʙ
    © 2018, 2019 SQUARE ENIX CO., LTD. All Rights Reserved. / Powered by Akatsuki Inc.

    View Slide

  2. ƀÔ ¯ŭ
    ċ܆Ĵ:BSD Jv]vJ#Ď® ÿ×
    ċ܆Ĵ:BSD Jv]vJ#:bpGvKntžĮ7ñà

    View Slide

  3. x u L
    Q
    ae
    23Ø'2$sftKtF JCΖøˆ
    sftKtF JCƒ1300Øã$|ĬŌ³
    L d n S_ Xmlt L LP dv L
    ud d Xe dffc L s ed X gl
    wME=>:u?YREM02Ż

    View Slide

  4. dT
    o yL
    L @
    u/ d L

    View Slide

  5. dT
    o yL L L E L v
    ( , d
    , . d
    u/ ) @ ) E

    View Slide

  6. o yL
    L
    śŢ]vLnt
    ❖ Elixir 1.7.3
    ❖ Erlang 21.0
    o❖ Phoenix %‰6Ktbq" Cowboy Jv]v
    ➢ Android, iOS :bp1 API pE?MV7±JSON 7ů
    ❖ Distillery, Jason, Dialyxir, Yacto, SimpleSchema "!...

    View Slide

  7. o yL
    A o yL L Ld
    ❖ DB $IZEKntbvqđ-¨Ħį
    ➢ Ruby on Rails $¶Ē$Jv] ĘŬIZEKntöġĞ
    ❖ ‡r➢ Process 7ŀ«#ũ©²Ŋ
    ➢ rMetMĪî„È$ƈ¶ąšĨ7Ñþ#A`svW 3
    ➢ ETS (Erlang Term Storage) $Ĝī

    View Slide

  8. L
    ❖ Jv]v_qWĀ# JSON 7¶č
    ❖ ũ©Ā# ETS #ţ+Ů,
    ❖ DB #fMPUvP7•43ĵ#Ę)
    ➢ Əų:EOM
    ➢ DB ŧŎūĞ
    o yL
    by Renee French
    CC BY 3.0

    View Slide

  9. HvhJv]v: Elixir
    šŠJv]v: Elixir
    p]vMbsDK:
    Nginx (OpenResty)
    o yL
    ´Jv]v% AWS ECS y$
    ItTX˜©ˆ

    View Slide

  10. ĿĨJv]v:
    Python (Django)

    IJ1Jv]v:
    Python (Django)
    ďŠSvq:
    Elixir (Phoenix + Vue.js)
    o yL

    View Slide

  11. br(Fluentd)
    + Cloud Pub/Sub
    + Cloud Dataflow
    + BigQuery
    ŤżÂı: Go + GAE
    o yL

    View Slide

  12. L
    ❖ Docker ➢ Erlang, Elixir 7ŋ¤_qW
    ➢ OpenResty /fMPUvP.•43
    ❖ CodeBuild y_qW"!7ŏ
    ➢ Docker nt:bp]vLnt:RbĀ$UvPÇ
    ā...
    ➢ ]RQšĨī$➢ Ə}ê
    ❖ ECS y©ˆ
    o yL

    View Slide

  13. L @
    L
    ❖ GitHub ( push 3
    CircleCI Q>REŨ3
    ➢ IvW`@vfRV
    ➢ It^➢ ÁQ>RE (Dialyzer)
    ➢ TMV
    ➢ …

    View Slide

  14. L @
    ) A
    ❖ Dialyzer %? → ƇįŚĉSvq
    ➢ ýij"Á$ſŶ$ďIJ
    ➢ ¢ŵ{²Ŋ"œÕ$ďIJ
    ❖ Typespec (Á:[TvKnt) 7
    …ìĂ . 3
    ❖ Elixir ©įÁƒ3¡Ģ7
    ĜÞĢ7Œß 3
    ➢ ©įÁƒ"$ÐőIMV‡
    ➢ ÁQ>RE PDCA ų"3
    ➢ IvWĨŚ/"3

    View Slide

  15. L @
    ) A @
    ❖ PLT DkRKm7¡ī
    ➢ svBq$ÐŏĀſ%
    010ĵ
    ➢ CircleCI .¤½Ðŏœ7ŒÌ
    ❖ struct $Á7 t() Ïʼn3 ‹¡
    ❖ ĵ#0%fEsÏʼn3 ‹¡
    ➢ Typespec
    BigQuery $MDvf7
    ¶Ā#Ïʼn3"!

    View Slide

  16. ❖ Pvt£$IftW]Vq
    ❖ ]VqsLRE%Jv]vŜľ
    Eo<:tV#%Ġ›ī$ńĊ$+7ů
    ➢ QvVƂĕ
    ➢ sLRE$TMP_pT;$·y
    ❖ Pvt #]Vq$ĥí7
    JSON ªu¿Ň DB #ŒÌ3
    ➢ DkRKmĝÊ$æŻ""3
    ƐöĀſ$ſ]Vq™ž 3Ƒ
    L @
    Eo<:tV
    Jv]v
    DB
    IftW
    ńĊ

    View Slide

  17. ❖ ƀöÁśŢ!/Ă
    ➢ Hvh$ĥí7 struct Őħ3: State
    ➢ DkoEPvu÷$1ŏ©7 struct Őħ3: Action
    ➢ State #œö$ Action 7Ƌ#ˆī
    ➢ Action $ńĊ State $ńĊ7rMetM
    ❖ ƀöÁśŢ]VqsLRE7ĂipRV
    ➢ TMV/
    ➢ p`9EPptF/
    ■ ■ Dialyzer $:KMV.3
    L @
    State
    State’
    Action
    Action
    Result
    Action
    Action
    Result
    State’’

    View Slide

  18. d
    ❖ ]VqsLRE7Jv]v#ň
    ďŠùě$ÖÙ3
    ➢ Fluentd Ų~Ü$sF7°3
    ■ Redash (BI Svq) ďłuƁŘ
    ➢ ďŠSvq]Vq$ĥí7Çā3
    ■ DB y$7Ă ô 3
    ➢ BigQuery $ĈĭsF1
    ]Vq$å“
    ■ €öKvW.¸-
    L @

    View Slide

  19. fag
    ❖ Elixir %Pvt£$HvhsLREīŲ#%”œƏų
    ➢ ×ÀrMetMP➢ ģĨ#Əųª7ìť"0$HvhsLRE#ƅ~ 3
    ❖ ”œƏų"$œƆ"sLRE7Jv]v#ň3
    ➢ TMP_pT;$·y
    ➢ :■ ]VqsLREœƆ"KpvN
    ]FŽĖ#Ű6430"ĥĚ7½Ź 3
    ❖ Dialyzer ‹¡
    ➢ ©įÁƒÐőIMV7ð "1.PDCA 7ų-143
    u/ d L

    View Slide

  20. dT
    o yL L L E L v
    ( , d
    , . d
    u/ ) @ ) E

    View Slide

  21. u/ ) @ ) E
    o yL L L E L v
    ❖ p]vMbsDK# OpenResty 7òī
    ❖ Lua MEpbV#03BMPhšĨ
    ➢ šŠuORKntĿĨ
    ● APIº&›“$Ĺć br➢ itTXtM~$rMetMů­
    ● itTXtMjvW7ŸÏEo<:tV#?ovèļ
    ● :bpGvKnt$āøˆĐ~.rMetM7ů­ 3
    ➢ rMetM$¿Ň

    View Slide

  22. u/ ) @ ) E
    o yL L L E L v
    !1šĨ3) Ɠ
    ❖ àžrMetM¿Ň7:bpGvKntJv]v(Cowboy)ŏ
    ➜ ƏŧŎĀ# CPU ‰īĦġÆ
    ➜ p]vMbsDK#¿Ň30#❖ :bpGvKntJv]v%:bpGvKntšĨ$+#Ĥª3ù
    êŊƉ.žĮ¨ĦƉ.ō

    View Slide

  23. u/ ) @ ) E
    APM : Application Performance Monitoring
    ❖ :bpGvKntêŊ$İŗáƊŔ¾7Ē"řĢ1œĉ
    ❖ éŷ"UX7Ðħ3y$^`@vftMQmvYtF#çƌ
    ӕùě
    ❖ APMӕ = o❖ ‚½%%ŏ"
    ➢ —Üo➢ úÌ$oSpandex * 7‰ Datadog APM 7¡ī3 #
    ( ,d
    * https://github.com/spandex-project/spandex

    View Slide

  24. u/ ) @ ) E
    ❖ o❖ pE?MV$šĨ$žËuсĀ#VrvMžËuсƀö7º&›
    ❖ § êŊŜğƀö#UIrvP7ۧ (cache, ETS, ÈźAPIĻ)
    ❖ Ecto $Ŝğ% SpandexEcto o@ cil
    SampleApp.Tracer.start_trace("request", service: :sample, type: :web, resource: req.path, ...)
    # APId r
    SampleApp.Tracer.finish_trace()
    A A AE & & A AE @ & & D A DA &
    A
    M

    View Slide

  25. u/ ) @ ) E
    ) : ( , d
    ❖ APIė$ŅŜëÃ
    pE?MVö,
    ršĨĀſ$˜ş
    (DB, Èź API etc.),
    ?ovĦ
    ❖ :[fpďIJ
    (Watchdog)

    View Slide

  26. u/ ) @ ) E
    ) : ( , d
    ❖ ‡ų"pE?MV11$
    šĨĀſ/P`rvhFo`œĉ
    ❖ ^`@vftMõ¼#Ąī
    N+1E?pď›
    õ¼

    View Slide

  27. u/ ) @ ) E
    ( , c l @
    ❖ ETS ëÃ$ò°.QmvYtFĀ#%Ą¨
    ➢ :EOMƍÚƏ$ĈĭĩÅ%ŜğÒŦ1ƄÈ
    ❖ ’%3Av]vcRW%3
    ➢ xź$dMV$+Ŝğ3 ūĞ
    ➢ ĩÅÇöŜğ‘ĕ (disable) 30#
    ■ disable 3 :bpGvKntũ©"]F#ŸŴ
    ■ Spandex #ŽĖ Pull Request 7ű 5¬Û#fvL
    .1
    = IgmYT;žĮ$ipRV

    View Slide

  28. u/ ) @ ) E
    , . d
    ❖ DB Connector Mariaex o❖ ÉŖēĩÅŧŎTMV7+3 …
    ➢ MySQL Jv]vy$ Prepared Statement !8!8Æ 3
    ➢ U`@qVyƃ (1024) #¢ŵ3 –$E?p?ov#
    ➢ yƃ7 MySQL $ŞÏÉ Ý yxü%Śę#ŕ
    * https://github.com/xerions/mariaex

    View Slide

  29. u/ ) @ ) E
    , . d
    ❖ 1ûķÚŧŎ7ņ3 …
    MySQLijp{Ū
    EoRKm & ™ũ©
    DB
    dMV
    ĸ
    ijp
    J512GB
    Prepared Statement
    ijppvE

    View Slide

  30. u/ ) @ ) E
    , . d
    ÒĽ
    ❖ IgmYT;óČ4 Pull Request 7ŷī 5»Ǝ%Śĝ
    ➢ ÉŖēĩÅ$ MySQL $EoRKm½Ź 3 7ù
    fvL.1
    ¡īùě
    ❖ GitHub 1 v0.8 aotQ*% master $ăø7°ä3çŔ2
    ❖ Ecto $ config #„z7ۧ
    config :app, App.Repo,
    adapter: Ecto.Adapters.MySQL,
    prepare: :unnamed,
    ...

    View Slide

  31. u/ ) @ ) E
    fag
    ❖ Elixir$Žï7Ĝ30❖ APM/ŧŎTMV7ĜīêŊ/ÍÏê7õ¼
    ❖ \f2e4. Elixir IgmYT;$¦.2Śę3

    View Slide

  32. fag
    A U ci zL d Xc l
    d A pd
    n L Lc R_ c
    L P n

    View Slide