Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
XFLAG × スポーツ × Elixir
Search
MIXI ENGINEERS
PRO
June 01, 2019
Programming
1
3.4k
XFLAG × スポーツ × Elixir
https://elixir-fest.jp/
Erlang & Elixir Fest 2019の発表資料です。
MIXI ENGINEERS
PRO
June 01, 2019
Tweet
Share
More Decks by MIXI ENGINEERS
See All by MIXI ENGINEERS
「モンスターストライク」の運営を支えるデータ分析基盤の歴史と進化 / History and evolution of the data analysis infrastructure supporting “Monster Strike” operations
mixi_engineers
PRO
3
120
【全貌公開】 MIXI の Atlassian Cloud 移行の裏側 / Behind MIXI's Migration to Atlassian Cloud
mixi_engineers
PRO
0
200
MIXI TECH NOTE #12
mixi_engineers
PRO
2
26
運営11年目タイトルを守る最強の盾の有効性と活用法
mixi_engineers
PRO
2
280
MIXI における技術広報とその役割
mixi_engineers
PRO
2
290
セキュリティ監視の内製化 効率とリスク
mixi_engineers
PRO
8
2.5k
IT企業でロボットを作った話 / A story about building a robot in an IT company
mixi_engineers
PRO
2
110
「共闘ことばRPG コトダマン」 SREチーム流 アプリのユーザー体験向上を支えるオブザーバビリティ
mixi_engineers
PRO
1
290
MIXI M のこれまでとこれから / Welcome Fintech Community #2
mixi_engineers
PRO
1
270
Other Decks in Programming
See All in Programming
LLM Supervised Fine-tuningの理論と実践
datanalyticslabo
7
1.3k
クリエイティブコーディングとRuby学習 / Creative Coding and Learning Ruby
chobishiba
0
3.9k
fs2-io を試してたらバグを見つけて直した話
chencmd
0
240
From Translations to Multi Dimension Entities
alexanderschranz
2
140
バグを見つけた?それAppleに直してもらおう!
uetyo
0
180
103 Early Hints
sugi_0000
1
240
どうして手を動かすよりもチーム内のコードレビューを優先するべきなのか
okashoi
3
200
良いユニットテストを書こう
mototakatsu
8
2.8k
「とりあえず動く」コードはよい、「読みやすい」コードはもっとよい / Code that 'just works' is good, but code that is 'readable' is even better.
mkmk884
3
510
Mermaid x AST x 生成AI = コードとドキュメントの完全同期への道
shibuyamizuho
0
160
[JAWS-UG横浜 #76] イケてるアップデートを宇宙いち早く紹介するよ!
maroon1st
0
480
htmxって知っていますか?次世代のHTML
hiro_ghap1
0
340
Featured
See All Featured
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
28
4.4k
4 Signs Your Business is Dying
shpigford
181
21k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
251
21k
How to train your dragon (web standard)
notwaldorf
88
5.7k
BBQ
matthewcrist
85
9.4k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
95
17k
Build The Right Thing And Hit Your Dates
maggiecrowley
33
2.4k
Learning to Love Humans: Emotional Interface Design
aarron
273
40k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
226
22k
Building Your Own Lightsaber
phodgson
103
6.1k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
10
810
A Modern Web Designer's Workflow
chriscoyier
693
190k
Transcript
XFLAG XFLAG × スポーツ × Elixir スポーツ事業推進室 村山 寛明 Erlang &
Elixir Fest 2019
2 自己紹介 スポーツ推進事業室 2014年ミクシィ新卒入社 1年目 SNS mixiの開発/運用 (Perl) 2年目 モンストサーバサイド開発
(Ruby) 3年目 SRE (Ruby) 4年目 ファイトリーグ サーバ開発 (Elixir) 5年目 スポーツ事業 (Elixir) 6年目 ← 今ここ 趣味 クラフトビール ボードゲーム♟ ポーカー 村山 寛明 / Hiroaki Murayama
3 XFLAGとスポーツ事業
4 XFLAG がスポーツをやる理由 • XFLAGとは ◦ ミクシィ社のエンターテインメント事業領域の ブランド名 ◦ 「友達や家族とワイワイ盛り上がれる『場』」を
提供することがコンセプト ◦ スマホアプリ「モンスターストライク」 • なぜスポーツなのか ◦ 今度は「みんなでワイワイできる『場』」をスタ ジアムやアリーナなどのスポーツ観戦の場へ
5 なぜElixirを選択したのか?
6 なぜElixirを選択したのか? • ファイトリーグでの開発実績があり資産を利用できる ◦ ファイトリーグに関しては過去の発表資料があります • Rubyライクで人を誘いやすい ◦ 社内プロジェクトだとRubyの利用率が高く学習コストが低い
• ポータビリティが高く運用が楽 • WebSocketを使ったインタラクション性の高いコンテンツを作る必要があった ◦ プロトタイプ等には利用、今回のプロダクトには利用してない Erlang & Elixir Fest 2018 Elixir Conf 2017
7 全体のアーキテクチャ
8 全体のアーキテクチャ スマホアプリ ブラウザ ImageFlux メディア配信 Webクライアント EKS/k8s APPサーバ API
CS Tool Admin Tool MySQL 5.7 Redis / RedisCluster メディア アップロード REST API (Protocol Buffers) データベース
9 Protocol Buffersを使ったAPI開発
10 Protocol Buffersを使ったAPI開発 • Protocol Buffers とは ◦ APIのインタフェースを定義する言語の一つ ◦
データ領域がバイナリで通信量の削減 ◦ ドキュメント/コードの自動生成がPluginとして可能 • REST API + Protocol Buffers ◦ リクエスト/レスポンスのフォーマットにProtobufを利用 ◦ gRPCにもチャレンジしたかったがライブラリ等もまだ不十分であり、プロダク ション環境で使うには運用コストが高いと判断しProtbufのみ利用にした
11 Protocol Buffersを使ったAPI開発 • 自動生成しているもの ◦ APIドキュメント ◦ Elixir側 ▪
APIのRequest/Responseの型定義 ▪ Enumや共通の型定義 ◦ クライアント側 ▪ APIClientのモジュール定義 ▪ APIのRequest/Responseの型定義 ▪ Enumや共通の型定義
12 Protocol Buffersを使ったAPI開発 • 定義ファイルをリポジトリ管理 • Dockerで管理しており開発者はdocker-compose runするだけ ◦ protocというコンパイラがありpluginを指定することで各言語へ変換できる
◦ pluginをdockerfileで管理して実行すると各Projectへコピー • ドキュメントはREADME.mdとして定義ファイルと一緒にリポジトリで管理すると GitHub上でそのまま見ることができる Protobuf file Run protoc Copy to each projects
13 Protocol Buffersを使ったAPI開発 • xflagstudio/protobuf-elixir ◦ オープンソースの tony612/protobuf-elixir がベース ◦
enumを関数として呼び出せるようにしたもの ▪ 既存のものはfieldアクセスなので動的にしかチェックできなかった ▪ enumで定義されていない関数呼び出しがビルドエラーになる
14 Protocol Buffersを使ったAPI開発
15 Protocol Buffersを使ったAPI開発 sample.pb.ex sample.md
16 Protocol Buffersを使ったAPI開発 • 生成されたモジュールに encode/1, decode/1インタフェースが存在する ◦ Protobuf <->
Struct の変換ができる • リクエストパラメータはplugでデコード処理を共通化 ◦ /sample/ping -> Api.Sample.Ping.Requestの呼び出し ▪ String.to_existing_atom/1 を使うのが重要 ◦ PhoenixControllerのパラメータと同様に扱うことが可能 • レスポンスはパスに対して動的にエンコード ◦ /sample/ping -> Api.Sample.Ping.Responseの呼び出し ◦ templateやviewを使わずPlug.Conn.send_resp/1を使用 • Controller/Routerやテストの自動生成もできると良い
17 Protocol Buffersを使ったAPI開発 • 気になった点 ◦ Protobufのoptionalはnullではなくデフォルト値が入る ▪ boolean型はデフォルトで false
が入ってるので要注意 ◦ 例外が起きたとしてもレスポンス型は変えれないので工夫が必要 ▪ よくある status のフィールドの値によって全体のデータ型が変わるというの が出来ない ▪ 適切なエラーハンドリングをする場合すべてのレスポンスにエラーハンドリ ング用の型を用意するかレンスポンスヘッダなどを活用する必要がある
18 Kubernetes を使ったインフラ
19 Kubernetes を使ったインフラストラクチャ • Kubarnates(k8s)とは ◦ コンテナオーケストレーションツール ◦ Dockerコンテナのクラスタを管理できるツール •
Kubarnates(k8s)とPhoenix umbrellaは相性が良い ◦ 個別ビルドしたアプリケーションをそのまま使える ◦ Dockerfileにはビルドしたアプリケーションをforegroundで実行するだけ ◦ ホットデプロイをPhoenix/Distilleryで頑張らなくても良い
20 Kubernetes を使ったデプロイ環境 EKS/k8s APPサーバ API CS Tool Admin Tool
開発 者 Distillery kubectl docker build & push PR作 成 PRマージ 継続的デプロイ環境 • GitHub ◦ make PR • CircleCI ◦ docker build ◦ docker push ◦ kubectl apply
• Phoenix Umbrella Project ◦ API ◦ CS Tool ◦
Admin Tool • Dockerfile • k8s manifest 21 プロジェクトの構成
22 プロジェクトの構成 Distillery API CS Admin AllInOne (API + CS
+ Admin) • bitwalker/distillery ◦ ビルド/デプロイツール ◦ rel/config.exs に設定を書いて mix release • ENV毎にAPPの構成を分けられる Unstable Production
23 Kubernetes を使ったインフラストラクチャ EKS/k8s APP Pod API CS Tool Admin
Tool mix task Pod mix Scheduled Task Pod (CronJob) mix • Phoenix Applicationのpod • 任意のmixコマンドを叩けるpod • mix taskを定期実行するpod ◦ k8sにはCronJobという定期実行する仕組みがある
24 Kubernetes を使ったインフラストラクチャ 気になった点 • クロスコンパイルできるけどOSに依存してるライブラリも存在する ◦ ビルドした環境とアプリケーションを実行する環境が異なると実行時エラーに なる ◦
本プロダクトではAlpineLinuxを利用 • 開発環境はホストOSで動かしてる ◦ dockerだとelixirビルド/テストが遅い ▪ volumeをhostにマウントしてたとしても ◦ 一応開発用のdocker-composeファイルはある
25 まとめ
26 まとめ • スポーツ事業でのElixir活用例を紹介 • Elixir + Protocol Buffers は生産性が上がる
• Phoenix/Umbrella + Distilleryとk8sは相性が良い 今後やりたいこと • 完全なgRPC化 • Phoenixのコントローラ/テストの自動生成 • LiveView使ってみたい
Thank you 27