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

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

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

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

B9bd75cf321e63c5399b99e36c527cff?s=128

elixirfest

June 01, 2019
Tweet

Transcript

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

    All Rights Reserved. / Powered by Akatsuki Inc.
  2. ƀÔ ¯ŭ ċ܆Ĵ:BSD Jv]vJ<W?tLY: #<t`ožĮ7ñà Ď® ÿ× ċ܆Ĵ:BSD Jv]vJ<W?tLY: #:bpGvKntžĮ7ñà

  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Ż
  4. dT o yL L @ u/ d L

  5. dT o yL L L E L v ( ,

    d , . d u/ ) @ ) E
  6. o yL L śŢ]vLnt ❖ Elixir 1.7.3 ❖ Erlang 21.0

    o<aop ❖ Phoenix %‰6Ktbq" Cowboy Jv]v ➢ Android, iOS :bp 1 API pE?MV7±JSON 7ů ❖ Distillery, Jason, Dialyxir, Yacto, SimpleSchema "!...
  7. o yL A o yL L Ld ❖ DB $IZEKntbvq

    đ-¨Ħį ➢ Ruby on Rails $¶Ē$Jv] ĘŬIZEKntö ġĞ ❖ ‡r<TtK ➢ Process 7ŀ«#ũ©²Ŋ ➢ rMetMĪî„È$ƈ¶ąšĨ7Ñþ#A`svW 3 ➢ ETS (Erlang Term Storage) $Ĝī
  8. L ❖ Jv]v_qWĀ# JSON 7¶č ❖ ũ©Ā# ETS #ţ+Ů, ❖

    DB #fMPUvP7•43ĵ#Ę) ➢ Əų:EOM ➢ DB ŧŎūĞ o yL by Renee French CC BY 3.0
  9. HvhJv]v: Elixir šŠJv]v: Elixir p]vMbsDK: Nginx (OpenResty) o yL ´Jv]v%

    AWS ECS y$ ItTX˜©ˆ
  10. ĿĨJv]v: Python (Django) IJ1Jv]v: Python (Django) ďŠSvq: Elixir (Phoenix +

    Vue.js) o yL
  11. br<lvŏ©sF: (Fluentd) + Cloud Pub/Sub + Cloud Dataflow + BigQuery

    ŤżÂı: Go + GAE o yL
  12. L ❖ Docker <ivL ➢ Erlang, Elixir 7ŋ¤_qW ➢ OpenResty

    /fMPUvP.•43 ❖ CodeBuild y_qW"!7ŏ ➢ Docker <ivL$_qWDB f<FrvK nt:bp]vLnt:RbĀ$UvPÇ ā... ➢ ]RQšĨī$<tMPtM {Ŕ ➢ Ə}ê ❖ ECS y©ˆ o yL
  13. L @ L ❖ GitHub ( push 3  CircleCI

    Q>RE Ũ3 ➢ IvW`@vfRV ➢ It^<q ➢ ÁQ>RE (Dialyzer) ➢ TMV ➢ …
  14. L @ ) A ❖ Dialyzer %? → ƇįŚĉSvq ➢

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

    010ĵ ➢ CircleCI .¤½Ðŏœ7ŒÌ ❖ struct $Á7 t() Ïʼn3 ‹¡ ❖ ĵ#0%fEsÏʼn3 ‹¡ ➢ Typespec BigQuery $MDvf7 ¶Ā#Ïʼn3"!
  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 ńĊ
  17. ❖ ƀöÁśŢ!/Ă ➢ Hvh$ĥí7 struct Őħ3: State ➢ DkoEPvu÷$1ŏ©7 struct

    Őħ3: Action ➢ State #œö$ Action 7Ƌ#ˆī ➢ Action $ńĊ State $ńĊ7rMetM ❖ ƀöÁśŢ]VqsLRE7ĂipRV ➢ TMV/ ➢ p`9EPptF/ ▪ <tMPtMÇö "IvW7Ķ©/ ▪ Dialyzer $:KMV.3 L @ State State’ Action Action Result Action Action Result State’’
  18. d ❖ ]VqsLRE7Jv]v#ň  ďŠùě$Ö Ù 3 ➢ Fluentd Ų~Ü$sF7°3

    ▪ Redash (BI Svq) ďłuƁŘ ➢ ďŠSvq]Vq$ĥí7Çā3 ▪ DB y$7Ă ô 3 ➢ BigQuery $ĈĭsF 1 ]Vq$å“ ▪ €öKvW.¸- L @
  19. fag ❖ Elixir %Pvt£$HvhsLREīŲ#%”œƏų ➢ ×ÀrMetMP<h% 50ms ķÚ ➢ ģĨ#Əųª7ìť"0$HvhsLRE#ƅ~

    3 ❖ ”œƏų"$œƆ"sLRE7Jv]v#ň3 ➢ TMP_pT;$·y ➢ :<U:ĔĺďŠùě$Ö Ù 3 ▪ ]VqsLRE œƆ"KpvN  ]FŽĖ#Ű6430"ĥĚ7½Ź 3 ❖ Dialyzer ‹¡ ➢ ©įÁƒÐőIMV7ð " 1.PDCA 7ų-143 u/ d L
  20. dT o yL L L E L v ( ,

    d , . d u/ ) @ ) E
  21. u/ ) @ ) E o yL L L E

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

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

    ❖ :bpGvKntêŊ$İŗáƊŔ¾7Ē"řĢ 1œĉ ❖ éŷ"UX7Ðħ3y$^`@vftMQmvYtF#çƌ ӕùě ❖ APMӕ = o<aop7<tMVvq3? ❖ ‚½%%ŏ "  ➢ —Üo<aopĆóŠ / . Phoenix ¤ó ➢ úÌ$o<aop7ďŝńĊIgmYT;žĮ43 Spandex * 7‰ Datadog APM 7¡ī3 # ( ,d * https://github.com/spandex-project/spandex
  24. u/ ) @ ) E ❖ o<aop$ӕ VrvMījLmvq$ۧ ❖ pE?MV$šĨ$žËuсĀ#VrvMžËuсƀö7º&›

    ❖ § êŊŜğƀö#UIrvP7ۧ (cache, ETS, ÈźAPIĻ) ❖ Ecto $Ŝğ% SpandexEcto o<aop$ۧÒè²Ŋ @ 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
  25. u/ ) @ ) E ) : ( , d

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

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

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

    Connector  Mariaex o<aop* v0.8.4 7¡ī ❖ ÉŖēĩÅŧŎ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
  29. u/ ) @ ) E , . d ❖ 1ûķÚŧŎ7

    ņ3 … MySQL ijp{Ū EoRKm & ™ũ© DB dMV ĸ ijp J<N 512GB Prepared Statement ijppvE
  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, ...
  31. u/ ) @ ) E fag ❖ Elixir$Žï7Ĝ 30<t`o ⥜ñ

    ❖ APM/ŧŎTMV7ĜīêŊ/ÍÏê7õ¼ ❖  \f2e<tV#ŸŴ%.$$ 4. Elixir IgmYT;$¦.2Śę3  
  32. fag A U ci zL d Xc l d A

    pd  n L Lc R_ c L P n