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
Architecture of enza
Search
ohr486
July 14, 2018
Programming
3
840
Architecture of enza
we love enza!
ohr486
July 14, 2018
Tweet
Share
More Decks by ohr486
See All by ohr486
負荷試験Night#1 負荷試験2023年トレンド
ohr486
17
4.7k
Elixir/PhoenixによるWeb開発の現場から
ohr486
1
510
Hacking Phoenix Performance
ohr486
1
350
Plug & WAF
ohr486
2
500
elixirをプロダクションに導入する
ohr486
1
650
IEx maniacs
ohr486
4
610
Hack and Read Elixir
ohr486
2
730
Running App on AppRunner
ohr486
0
800
sponsor-talk-drecom-heisei-ruby-kaigi
ohr486
0
850
Other Decks in Programming
See All in Programming
ワープロって実は計算機で
pepepper
2
1.4k
AI OCR API on Lambdaを Datadogで可視化してみた
nealle
0
160
State of CSS 2025
benjaminkott
1
110
The State of Fluid (2025)
s2b
0
190
UbieのAIパートナーを支えるコンテキストエンジニアリング実践
syucream
2
660
LLMOpsのパフォーマンスを支える技術と現場で実践した改善
po3rin
8
970
サイトを作ったらNFCタグキーホルダーを爆速で作れ!
yuukis
0
420
TDD 実践ミニトーク
contour_gara
0
130
Scale out your Claude Code ~自社専用Agentで10xする開発プロセス~
yukukotani
9
2.5k
AI時代のドメイン駆動設計-DDD実践におけるAI活用のあり方 / ddd-in-ai-era
minodriven
22
8.8k
GitHub Copilotの全体像と活用のヒント AI駆動開発の最初の一歩
74th
8
3.1k
未来を拓くAI技術〜エージェント開発とAI駆動開発〜
leveragestech
2
170
Featured
See All Featured
Java REST API Framework Comparison - PWX 2021
mraible
33
8.8k
Scaling GitHub
holman
462
140k
The Straight Up "How To Draw Better" Workshop
denniskardys
236
140k
Making the Leap to Tech Lead
cromwellryan
134
9.5k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
139
34k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
251
21k
Being A Developer After 40
akosma
90
590k
Visualization
eitanlees
146
16k
The Cost Of JavaScript in 2023
addyosmani
53
8.8k
Designing for humans not robots
tammielis
253
25k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
283
13k
Producing Creativity
orderedlist
PRO
347
40k
Transcript
Architecture of enza.fun おーはら @ drecom
agenda • About me • Goal of this talk •
About enza • Architecture of service • Development • Operation • Conclusion
About me • Tsunenori Ohara/おーはら ◦ Twitter : @ohrdev ◦
Github : ohr486 • Community ◦ tokyo.ex, ElixirConfJapan, Erlang&ElixirFest, JEA ◦ meguro.rb, meguro.es • Work ◦ プラットフォーム開発部@Drecom ◦ Ruby / Elixir programmer / Architect • Hobby ◦ 仏像制作
Goal of this talk • 事例紹介が中心 ◦ サービスアーキテクチャの紹介 ◦ 技術選定
◦ 開発運用の紹介 • 立ち上げ〜開発〜運用フェーズにおける気づき • ソースコードはほぼありません • 「Webサービス」の「運用」「構成」の紹介 Caution!!
About enza • enza ◦ HTML5 Game Platform ◦ ©BXD
Inc. • HTML5 Game Platform ◦ スマホ向け ◦ ブラウザゲーム ◦ プラットフォーム
https://bxd.co.jp
https://enza.fun
enza Architecture of service frontend API WS serverless backend Infra
GAME 外部機能/サービス ココ SDK
Architecture of service • 発表のスコープ ◦ ポータル(サイト)領域について話します ▪ Webサービス ◦
ゲームについての話はしません ◦ 開発・運用のフローについて話します • 技術スタック ◦ React+Redux/TypeScript ◦ Rails/Ruby ◦ Phoenix/Elixir ◦ ServerlessFramework/Python
Architecture of service • Q: 技術スタック、Railsだけで十分なのでは? • A: Railsだけで全てを満たすことはできなかった ◦
HTML5, SPA ◦ リアルタイムコミュニケーション ▪ チャット、バッジ、通知、etc ◦ マネージドサービス ▪ Lambda、Kinesis、SQS、ApiGateway、etc ◦ API, 管理機能, デベロッパー向け機能 ◦ 分析ツール・DSL・テスティング
Architecture of service • アーキテクチャ/技術選定の視点 ◦ 性能観点(重視する) ▪ 規模・コスト ◦
保守観点(考慮する) ▪ テスト ▪ デプロイメント ▪ 自社運用実績 ◦ 採用観点(あまり考えない、自分達が最初にやってやるという意思) ▪ 他社利用実績 ▪ エンジニア市場 ▪ 転向させれば良い
Architecture of service • API ◦ Rails • 管理画面/DevCenter ◦
Rails • フロント/SDK ◦ TypeScript ◦ React/Redux • WS/コミュニケーション ◦ Phoenix ◦ 性能的な要件 ▪ 同時接続数 ▪ F/W • AWS managedサービス ◦ lambda/Python ◦ api-gateway ◦ ServerlessFramework
Architecture of service : Rails / Phoenix • 類似 ◦
MVC WAF ◦ 標準のディレクトリ構造 ◦ テスティング、セキュリティ、etc • 相違 ◦ ライブラリ数 ▪ gem >> hex ◦ (言語としての)平行性・可用性 ◦ WebSocket ▪ ActionCable ▪ PhoenixChannel
Architecture of service : WebSocket Backend • 技術選定 ◦ 同時接続数
◦ CPU/Mem/etc ◦ WAFの有無 • 同接比較 ◦ Rails : △ + 運用知見あり ◦ Phoenix : ◯ + 運用知見あり ◦ Golang : ◎ + 運用知見なし ◦ Node.js : △ ◦ Clojure/C++ : ---
Architecture of service : WebSocket Backend Elixir 1.4.0 / Erlang19.1
/ Phoenix 1.3.0 サーバー1台のWebSocket(Channel)1つのtopicにws接続しpubsubが成功 EC2 r3.xlarge 4core 36Gmem EC2 m4.4xlarge 16core 64Gmem
Architecture of service : 再掲 • API ◦ Rails •
管理画面/DevCenter ◦ Rails • フロント/SDK ◦ TypeScript ◦ React/Redux • WS/コミュニケーション ◦ Phoenix ◦ 性能的な要件 ▪ 同時接続数 ▪ F/W • AWS managedサービス ◦ lambda/Python ◦ api-gateway ◦ ServerlessFramework
Architecture of service : AWS Managed • モチベーション ◦ サーバーを管理したくない
◦ スケールアウト、アップのオペレーションを簡単にしたい ◦ コストの最適化 ▪ 使ったぶんだけ支払いたい • マネージドサービス ◦ Lambda ◦ ApiGateway ◦ Kinesis ◦ SQS ◦ DynamoDB、etc
Architecture of service : AWS Managed • 管理ツール ◦ Webコンソール
+ 手動 : しんどい ◦ ServerlessFramework : 運用知見あり ◦ Apex : 運用知見なし ◦ SAM : 運用知見なし • 必要な要件 ◦ バージョニング、Lambdaのコード管理 • Lambdaのランタイム言語 : (宗教) ◦ Python : 社内実績、方針 ◦ Node.js : 悪くないが、混在を避けた ◦ Java ◦ Golang : 選定時まだ無かった
hex gem Architecture of service React+Redux SPA Rails API Phoenix
WS backend Terraform/HCL Infra Rails Admin Rails DevCenter TypeScript SDK Lambda/Python Serverless 1サブシス1リポジトリで管理 gem gem Gatling 各種 tools hex hex
Development • ワークフロー ◦ 設計 ◦ 開発 ◦ テスト ◦
QA試験 ◦ 負荷試験 ◦ デプロイメント
Development : 設計 • API(Rails)、WS(Phoenix)のI/Fは全てswaggerを定義 ◦ ruby-swagger ◦ phoenix-swagger •
CIでswaggerに対する検証・更新を実施 • 関連サブシスが多いのでI/F定義ドリブン
Development : 設計 • 立ち上げフェーズ ◦ モックのみ • 開発フェーズ ◦
swagger ◦ サブシス間の結合のバランス ▪ I/Fを壊さず通信 • 運用フェーズ ◦ swagger + 性能テスト + セキュリティテスト ◦ 性能が悪い = バグ ◦ コストが高い = バグ ◦ 危険 = バグ ・「バグ」の認識が広がった ・初期フェーズからswaggerを導入した 事で開発がドライブできた
Development : 開発・テスト • 開発時のサブシスを繋ぐのはswagger React+Redux SPA Rails API Phoenix
WS backend swagger GameServer SDK I/Fが変わるとまずい ここを変えずに開発を行うため、 外部提供APIのswagger/schemaを テスト
Development : 開発・テスト • 立ち上げフェーズ ◦ モックのみ • 開発フェーズ ◦
スクラムチーム ◦ SREチーム ◦ QAチーム • 運用フェーズ ◦ + デベロッパー対応チーム ▪ ゲームプラットフォーム ・複数チームでもswaggerがハブになる ・外部提供APIの「仕様」をテストすると 安心できる
Development : QA試験・負荷試験 • QA試験 ◦ リリース前 ◦ QAチームが実施 ◦
テストシナリオは開発チームと一緒にレビュー • 負荷試験 ◦ 新機能追加前 ◦ 定期的に実施(毎晩負荷試験を回すよう開発) ◦ 負荷試験環境を常時メンテ ◦ 負荷試験用のRailsEnv、MixEnvをコードベースに組み込んでメンテ ▪ 負荷試験の実施を前提としたコードベース
Development : QA試験・負荷試験 • 立ち上げフェーズ ◦ なし • 開発フェーズ ◦
QA: リリース前に実施 ◦ 負荷: リリース前に実施 • 運用フェーズ ◦ QA: 本番適用前に実施 ◦ 負荷: 定期的に実施 ▪ AWSの事前申請は2week ・負荷テストを前提としたコードベースにして、 テストの敷居を下げた ・でも負荷テスト、お高いんでしょう? - テスト実施タイミングでのみサーバーを 立てれば安くできる(見込) - インフラ構成のコード化が前提
Development : デプロイメント • frontend ◦ TSコンパイル、webpack、S3upload • Rails ◦
cap deploy • Phoenix ◦ edeliver build & release • serverlessframework : AWS lambda, API-Gateway, etcのデプロイメント ◦ sls deploy • Terraform : AWSの構成管理の更新 ◦ terraform plan & apply
Development : デプロイメント : Rails deploy target deploy host checkout
Development : デプロイメント : Phoenix build server deploy host deploy
target checkout xxx.tar.gz copy release 同じOS/環境/アーキでなければならない
Development : デプロイメント • CircleCIを利用してデプロイ ◦ frontend ◦ rails ◦
phoenix ◦ serverlessframework ◦ terraform それぞれdeployの方法・思想が全く違う 運用上、違いを意識したくない 同じI/Fで適用
Development : デプロイメント • 立ち上げフェーズ ◦ なし • 開発フェーズ ◦
手動 • 運用フェーズ ◦ CI/半自動化 ・言語、F/Wによってdeploy方法が全く違う ・deployの(心理的、オペレーション的)コストは非常 に高い、特に本番への更新 ・自動化することで、並列実行が可能になり deploy 時間の短縮ができる
Operation • インフラ運用 ◦ 構成管理 ◦ サーバーのスケールアップ・ダウン・アウト・イン ◦ サービス監視 •
デプロイメント ◦ 開発環境 • 負荷試験
Operation : 構成管理 • Terraform ◦ IAM、Role、EC2、serverless以外の全てをコード化 ◦ 行数: 12000行
▪ planに5分程度 ◦ サーバーの増減を手早く行いたいので、EC2は管理していない • serverlessframework ◦ Lambda、ApiGateway等のサーバーレスリソースをコード化 ◦ Terraformと分けているのはバージョン管理の頻度が異なるから
Operation : サービス監視 • エラー ◦ sentryに集約 ▪ Rails ▪
Phoenix ▪ Lambda • APM ◦ newrelic : Rails ◦ appsignal : Phoenix • サービスメトリクス ◦ CloudWatch ◦ prometheus
開発1 Operation : デプロイ/環境 本番 サンドボッ クス ステージン グ(安定 版)
負荷試験 セキュア診 断 開発1 開発1 Rails/Env production Rails/Env staging Rails/Env staging Rails/Env staging Rails/Env production Rails/Env stress ステージン グ(次期 ver) Rails/Env staging ローカル Rails/Env develop 常時維持
Operation : 負荷試験 • 定期的に実行 ◦ 新機能/APIが追加される時 ◦ 毎晩(開発中) •
Gatling ◦ APIとWebSocket通信 • アプリコードベース ◦ 負荷テスト用のコードをmasterブランチに組み込み ◦ テストユーザー作成・ハンドルAPI • インフラ ◦ 負荷テスト用データのメンテ ◦ terraformで必要なリソースを立ち上げ ◦ mockサーバー/proxyの維持
Development team • エンジニア規模 ◦ 20名程度 ◦ 管理対象リポジトリ : 27
• 構成 ◦ フェーズが変わるにつれ構造変わる ◦ アーキテクチャが変わるにつれ構造が変わる • アーキテクチャ・サービス構成に対応したチーム・構成 ◦ 少しずつ変化してきた
Development team • 機能開発 ◦ スクラムチーム x 2 • インフラ・SRE
◦ タスクベースのチーム • 品質保証 ◦ タスク(チケット)ベースのチーム ◦ スクラムチームと足並みを揃えて進行 • 運用チーム ◦ GameDeveloperとの折衝 ◦ サービス運用
Conclusion • enzaのポータル領域のアーキテクチャを紹介しました • 複数のF/W、言語のアーキテクチャのサービスの事例紹介を行いました • 立ち上げ、開発、リリース、運用を通しての気づきを紹介しました • 運用やチーミングの紹介をしました •
古くもなく新しくもなくいまどきの開発