$30 off During Our Annual Pro Sale. View Details »
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.6k
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
競輪・オートレース配信を支える画音監視 - 長距離伝送・配信におけるIPベースMultiview活用事例
mixi_engineers
PRO
0
38
インフラ室事例集
mixi_engineers
PRO
2
320
TIPSTARを支えるCloud Spanner
mixi_engineers
PRO
1
38
モンストを支えるインフラ技術
mixi_engineers
PRO
1
740
ルールベースからMLへ みてね写真プリント自動提案の活用事例
mixi_engineers
PRO
1
130
SoccerNet GSRの紹介と技術応用:選手視点映像を提供するサッカー作戦盤ツール
mixi_engineers
PRO
1
330
2つのフロントエンドと状態管理
mixi_engineers
PRO
5
290
月間4億メディアの画像解析を救え!みてね発・オンデバイスMLで挑む圧倒的コストカット作戦
mixi_engineers
PRO
2
330
Google Agentspaceを実際に導入した効果と今後の展望
mixi_engineers
PRO
4
1.8k
Other Decks in Programming
See All in Programming
LLM Çağında Backend Olmak: 10 Milyon Prompt'u Milisaniyede Sorgulamak
selcukusta
0
120
組み合わせ爆発にのまれない - 責務分割 x テスト
halhorn
1
140
新卒エンジニアのプルリクエスト with AI駆動
fukunaga2025
0
200
從冷知識到漏洞,你不懂的 Web,駭客懂 - Huli @ WebConf Taiwan 2025
aszx87410
2
1.8k
JETLS.jl ─ A New Language Server for Julia
abap34
1
340
手軽に積ん読を増やすには?/読みたい本と付き合うには?
o0h
PRO
1
170
tparseでgo testの出力を見やすくする
utgwkk
1
190
愛される翻訳の秘訣
kishikawakatsumi
1
310
宅宅自以為的浪漫:跟 AI 一起為自己辦的研討會寫一個售票系統
eddie
0
500
Full-Cycle Reactivity in Angular: SignalStore mit Signal Forms und Resources
manfredsteyer
PRO
0
120
WebRTC、 綺麗に見るか滑らかに見るか
sublimer
1
160
社内オペレーション改善のためのTypeScript / TSKaigi Hokuriku 2025
dachi023
1
580
Featured
See All Featured
Raft: Consensus for Rubyists
vanstee
141
7.2k
Testing 201, or: Great Expectations
jmmastey
46
7.8k
How STYLIGHT went responsive
nonsquared
100
6k
GitHub's CSS Performance
jonrohan
1032
470k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
1.8k
Context Engineering - Making Every Token Count
addyosmani
9
500
Documentation Writing (for coders)
carmenintech
76
5.2k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
249
1.3M
Into the Great Unknown - MozCon
thekraken
40
2.2k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
253
22k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
122
21k
Art, The Web, and Tiny UX
lynnandtonic
303
21k
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