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
790
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.6k
Elixir/PhoenixによるWeb開発の現場から
ohr486
1
430
Hacking Phoenix Performance
ohr486
1
310
Plug & WAF
ohr486
2
460
elixirをプロダクションに導入する
ohr486
1
600
IEx maniacs
ohr486
4
560
Hack and Read Elixir
ohr486
2
680
Running App on AppRunner
ohr486
0
720
sponsor-talk-drecom-heisei-ruby-kaigi
ohr486
0
800
Other Decks in Programming
See All in Programming
生成AIで加速するテスト実装 - ロリポップ for Gamersの事例と 生成AIエディタの活用
kinosuke01
0
110
CloudNativePGを布教したい
nnaka2992
0
110
負債になりにくいCSSをデザイナとつくるには?
fsubal
10
2.6k
苦しいTiDBへの移行を乗り越えて快適な運用を目指す
leveragestech
0
1k
Rubyと自由とAIと
yotii23
6
1.7k
How mixi2 Uses TiDB for SNS Scalability and Performance
kanmo
40
16k
もう僕は OpenAPI を書きたくない
sgash708
5
1.9k
Ruby on cygwin 2025-02
fd0
0
180
CSS Linter による Baseline サポートの仕組み
ryo_manba
1
150
仕様変更に耐えるための"今の"DRY原則を考える
mkmk884
9
3.1k
AIの力でお手軽Chrome拡張機能作り
taiseiue
0
190
Jakarta EE meets AI
ivargrimstad
0
350
Featured
See All Featured
GraphQLの誤解/rethinking-graphql
sonatard
68
10k
Fashionably flexible responsive web design (full day workshop)
malarkey
406
66k
YesSQL, Process and Tooling at Scale
rocio
172
14k
KATA
mclloyd
29
14k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
10
1.3k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
4
430
XXLCSS - How to scale CSS and keep your sanity
sugarenia
248
1.3M
Typedesign – Prime Four
hannesfritz
40
2.5k
Agile that works and the tools we love
rasmusluckow
328
21k
How STYLIGHT went responsive
nonsquared
98
5.4k
Building an army of robots
kneath
303
45k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
27
1.9k
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、言語のアーキテクチャのサービスの事例紹介を行いました • 立ち上げ、開発、リリース、運用を通しての気づきを紹介しました • 運用やチーミングの紹介をしました •
古くもなく新しくもなくいまどきの開発