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
710
Architecture of enza
we love enza!
ohr486
July 14, 2018
Tweet
Share
More Decks by ohr486
See All by ohr486
負荷試験Night#1 負荷試験2023年トレンド
ohr486
14
4.1k
Elixir/PhoenixによるWeb開発の現場から
ohr486
1
250
Hacking Phoenix Performance
ohr486
1
200
Plug & WAF
ohr486
2
340
elixirをプロダクションに導入する
ohr486
1
470
IEx maniacs
ohr486
4
450
Hack and Read Elixir
ohr486
2
560
Running App on AppRunner
ohr486
0
570
sponsor-talk-drecom-heisei-ruby-kaigi
ohr486
0
660
Other Decks in Programming
See All in Programming
Ruby Pattern Matching
bkuhlmann
0
930
ADRを一年運用してみた/adr_after_a_year
hanhan1978
7
2.4k
Ruby GitHub Packages
bkuhlmann
0
630
AWS CDKコントリビュートTIPS / aws-cdk-contribution-tips
gotok365
2
200
Komplexe Oberflächen mit SVG und der Web Animation API
joergneumann
0
670
はてなにおける CSS Modules、及び CSS Modules に足りないもの / CSS Modules in Hatena, and CSS Modules missing parts
mizdra
7
940
デフォルトにして至高、RubyMineの大好きな所
ruzia
0
420
Micro Frontends for Java Microservices - Devnexus 2024
mraible
PRO
0
500
0→1と1→10の狭間で Javaという技術選定を振り返る/Reflecting on the Decision to Choose Java Between Scaling from 0 to 1 and 1 to 10
jaguar_imo
2
380
Random\Randomizer クラスで日常のあれこれを解決しよう! / Random\Randomizer class solves familiar trouble
cocoeyes02
0
250
#phpcon_odawara オープン・クローズドなテストフィクスチャを求めて / open closed test fixtures
77web
3
230
dbtのドメイン分割による データ基盤の改善とDigdagとの連携
sakama
0
360
Featured
See All Featured
ReactJS: Keep Simple. Everything can be a component!
pedronauck
659
120k
Designing the Hi-DPI Web
ddemaree
276
33k
Scaling GitHub
holman
457
140k
Adopting Sorbet at Scale
ufuk
68
8.6k
Typedesign – Prime Four
hannesfritz
36
2.1k
GraphQLとの向き合い方2022年版
quramy
32
12k
Six Lessons from altMBA
skipperchong
21
3k
The Straight Up "How To Draw Better" Workshop
denniskardys
227
130k
A Modern Web Designer's Workflow
chriscoyier
689
190k
How to Ace a Technical Interview
jacobian
272
22k
Build your cross-platform service in a week with App Engine
jlugia
225
17k
Making the Leap to Tech Lead
cromwellryan
124
8.5k
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、言語のアーキテクチャのサービスの事例紹介を行いました • 立ち上げ、開発、リリース、運用を通しての気づきを紹介しました • 運用やチーミングの紹介をしました •
古くもなく新しくもなくいまどきの開発