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
Elixir/PhoenixによるWeb開発の現場から
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
ohr486
June 22, 2023
Technology
650
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Elixir/PhoenixによるWeb開発の現場から
ohr486
June 22, 2023
More Decks by ohr486
See All by ohr486
負荷試験Night#1 負荷試験2023年トレンド
ohr486
17
4.9k
Hacking Phoenix Performance
ohr486
1
410
Plug & WAF
ohr486
2
550
elixirをプロダクションに導入する
ohr486
1
730
IEx maniacs
ohr486
4
660
Hack and Read Elixir
ohr486
2
810
Running App on AppRunner
ohr486
0
860
sponsor-talk-drecom-heisei-ruby-kaigi
ohr486
0
910
ex-app-on-k8s
ohr486
0
270
Other Decks in Technology
See All in Technology
フロンティアAIのゲート化と地政学リスク
nagatsu
0
120
AI Engineering Summit Tokyo 2026 AIの前に、やることがある 〜医療データ企業の4フェーズ〜
dtaniwaki
0
2.5k
あなたの AI ワークスペースに、 専門コーダーを連れてくる - Amazon Quick Desktop 最新情報
kawaji_scratch
1
130
DevOps Agentで始めるAWS運用 〜フロンティアエージェントが変える運用の現場〜
nyankotaro
1
380
新しいVibe Codingと”自走”について
watany
5
290
Djangoユーザが知っ得なPostgreSQL機能 - 設計の選択肢を増やす / Djang-use-PostgreSQL
soudai
PRO
1
230
小さくはじめるSLI/SLO ~育てながら組織に定着させる実践知~ / Starting Small with SLI/SLOs: Building Adoption Through Continuous Growth
nari_ex
4
1.6k
SONiC Scale-Up Working Group から探る Scale-UpやUltraEthernet機能の実装方法
ebiken
PRO
0
110
2026TECHFRESH畢業分享會 - Lightning Talk - E起 See See : 電商推薦讀心術? 數據說了算
line_developers_tw
PRO
0
750
AGENTS.mdとSkillsで始めるAIエージェント活用
sonoda_mj
2
190
AIの性能が向上しても未解決な組織の重大問題は何か?/An Unsolved Organizational Problem in the Age of AI
moriyuya
3
610
AIっぽい文章を採点して人間らしく直すアプリを作ってみた
yama3133
2
120
Featured
See All Featured
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
200
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
2.9k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8.2k
Visualization
eitanlees
152
17k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
DevOps and Value Stream Thinking: Enabling flow, efficiency and business value
helenjbeal
1
230
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
210
We Have a Design System, Now What?
morganepeng
55
8.2k
WCS-LA-2024
lcolladotor
0
630
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2.3k
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
0
1.7k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
Transcript
Elixir/Phoenixによる Web開発の現場から Elixirで宇宙衛星/エッジコンピューティング/Web @マネーフォワードオフィス 2023/06/22 @ohr486
About Me • おーはら / Twitter: @ohrdev / Github: ohr486
• 株式会社ドリコム SREソリューション部 部長 ◦ Work: ▪ エンジニアマネージャ ▪ サーバー/インフラエンジニア ▪ 新規事業/ディレクター • 負荷試験支援サービス • DevOps推進支援/負荷試験/設計コンサル • 月1くらいで社内外のシステムの負荷試験をしている ◦ Background: ▪ Basic / C / Lisp / Java / Ruby / Erlang / Infra / Elixir / Python ◦ ProductionでのElixir利用歴: 10年 ▪ Elixirアプリ: 9サービス( 3サービス現在稼働中、 1サービスリリース予定 ) • Community ◦ tokyo.ex / Japan Elixir Association / Erlang&Elixir Fest ◦ 7/19: tokyo.ex&piyopiyo.ex 合同ハンズオン / HTTPサーバーをスクラッチで作成 (仮) ▪ https://piyopiyoex.connpass.com/event/287674/ • Hobby ◦ 仏像制作, 写経, 寺社仏閣, 自転車, ダイエット ◦ お金/Web3界隈( 長年MoneyTreeを使っていましたが、仮想通貨管理ができないので、 MoneyForwardへ移行 ) ◦ Nerves & Gadget, 自作キーボード ◦ FF11,FF14(光の戦士/白魔道士)
agenda • Goal • Web開発とは? • 昨今のWeb開発の傾向 • Webアプリのライフサイクル •
Webアプリのアーキテクチャの推移 • SPA or Hotwire • Why Elixir/Phoenix ? • Webアプリのアーキテクチャと開発チームの構造 • まとめ
Goal • ターゲット ◦ Webアプリの技術選定の指針が欲しい エンジニアマネージャーとプロダクトオーナー ◦ Webアプリを作りたいエンジニア • 今日のゴール
◦ Web開発を始める際の技術選定の観点が増えている ◦ Webアプリのライフサイクルを理解する ◦ Elixir/Phoenixを採用した時のメリット/デメリットを把握する ◦ Elixir/Phoenixでサービス開発をしている中での 気づきの共有 • 話さないこと ◦ Elixir/PhoenixによるWebアプリの設計/実装の詳細 ◦ クラウド/インフラの各種マネージドサービスの詳細
Web開発とは? • Web上(ブラウザ上)で動作するシステム /サービスの開発 • これらのシステムの 運用保守 • Web開発に必要な技術 ◦
プログラミング言語 ▪ フロント • ex) HTML, css, JavaScript, etc ▪ バックエンド • ex) Elixir, Ruby, Go, PHP, Python, Java, etc ◦ Webアプリケーションフレームワーク ▪ よっぽどの事がない限り、フレームワークを利用してサービスを開発する ▪ 開発言語によって異なる • ex) ElixirならPhoenix, RubyならRails, JavaScript/TypeScriptならVue.js, React, etc ◦ データベース ▪ RDB • ex) PostgreSQL, MySQL, etc ▪ KVS • ex) Redis, Memcached, etc ◦ インフラ ▪ クラウド • ex) AWS, GCP, Azure, etc ▪ コンテナ/オーケストレーション • ex) k8s, CloudRun, ECS, AppRunner, ACA, etc
昨今のWeb開発の傾向 • 開発期間が短い ◦ 数ヶ月である程度のクオリティのサービスをゼロから作る事が求められる • 小規模なチーム開発 ◦ インフラ、サーバー、クライアントをある程度兼任 ◦
少人数チームで短期に開発 • リッチなクライアント ◦ SPAから徐々にHotwireに • インタラクティブ/リアルタイムWeb ◦ WebSocket • トラフィックがピーキー ◦ トラフィックのスパイク(通常の数倍〜数十倍)に耐えられる • 開発/運用フェーズによってスケールイン/アウト ◦ スケールイン/アウト、スケールアップ/ダウン可能な構成 • DevOps/自動化による効率的な運用 ◦ CI/Deploymentの自動化 ◦ インフラやクラウドに依存しがち
Webアプリのライフサイクル • 企画 ◦ デザイン/モックのみ • プロトタイプ版(MVP/β) ◦ 数人〜程度のユーザー ◦
サーバー1台に全部載せ • リリース版(ローンチ) ◦ サーバーは冗長化/スケーリング構成 ◦ ローンチ直後のスパイクを見込んでサーバーリソースは過剰気味、ローンチ終了後に縮退 • リリース版(成長期) ◦ サービスの成長に合わせて、サーバーリソースを拡充 ◦ 負荷的な問題が発生し、作りが悪いとリアーキテクチャを強いられる • リリース版(縮退期) ◦ ユーザー数や売上の減少に伴い、コスト圧縮が強いられる ◦ 通信費の見直し、売上の5%程度が一般的な適正値だが、カット対象になりうる • クローズ ◦ サービスの継続性が担保できなくなれば、サービス終了 ◦ データをバックアップしクローズ
Webアプリのアーキテクチャの推移(企画) モック ユーザー ブラウザ
Webアプリのアーキテクチャの推移(プロトタイプ) Linuxサーバー ユーザー ブラウザ HTTP サーバー DB Webアプリ
オートスケール/オーケストレーション Webアプリのアーキテクチャの推移(ローンチ) Linuxサーバー/コンテナ ユーザー ブラウザ HTTP サーバー DBサーバー Webアプリ ロードバランサー
オートスケール/オーケストレーション Webアプリのアーキテクチャの推移(機能拡充) Linuxサーバー/コンテナ ユーザー ブラウザ HTTP サーバー DBサーバー Webアプリ ロードバランサー
Linuxサーバー/コ ンテナ Job SPA Hotwire RT-Web
オートスケール/オーケストレーション Webアプリのアーキテクチャの推移(成長期) Linuxサーバー/コンテナ ユーザー ブラウザ HTTP サーバー DBサーバー (Primary) Webアプリ
ロードバランサー DBサーバー (Replica) write read KVS/Cache cache Linuxサーバー/コ ンテナ Job SPA Hotwire RT-Web
オートスケール/オーケストレーション Webアプリのアーキテクチャの推移(縮退期) Linuxサーバー/コンテナ ユーザー ブラウザ HTTP サーバー DBサーバー (Primary) Webアプリ
ロードバランサー read/write Linuxサーバー/コ ンテナ Job SPA Hotwire RT-Web
Webアプリのアーキテクチャの推移 • Webアプリのアーキテクチャの技術要素/コンポーネント ◦ HTTPサーバー / Appサーバー / DBサーバーの分離 ◦
ロードバランサによるトラフィック分散 ◦ 非同期処理(Job)のミドルウェア ◦ キャッシュの機構 ◦ DBの分散(参照分散) ◦ スケーリング機構(スケールアウト/イン、スケールアップ /ダウン) • それぞれのフェーズで、上記の技術的要件が変動する ◦ これらの技術要件を担保できなければ、リアーキテクチャ(作り直し)が強いられる ◦ なるべく基本構成を変えずに 、これらの要件に対応したい ⇨Elixir/Phoenixを採用する事で、比較的少ない変更で対応できる
SPA or Hotwire • (従来の)SPA(Single Page Application) ◦ アプリをクライアントサイドとサーバーサイドに分離 ◦
サーバーサイドはクライアントから利用できる JSONを返却するAPIを提供 ◦ クライアントサイドは JavaScriptで上記APIを使って画面を描画 クライアントサイド フロントエンドアプリケーション サーバーサイド JSON 受け取ったJSONでDOMを JavaScriptで構築 ※ 状態管理やバリデーションはクラ イアント側で行う必要がある ※ バックエンドとフロントエンドで 2つ のアプリを作る事になる
SPA or Hotwire • Hotwire(HTML Over The Wire) ◦ サーバーサイドのみで
SPA風のアプリケーション開発が可能 ◦ サーバーサイドから JSONの代わりにHTMLをクライアントに返却 ◦ クライアントサイドは Hotwireのライブラリがクライアントから HTMLを受け取り現在のページの要素 を差し替える クライアントサイド Hotwireライブラリ サーバーサイド HTML 受け取ったHTMLで画面の要素を差 し替える(JavaScript実装不要) ※ 状態管理やバリデーションはサー バーだけで良い
SPA or Hotwire • チーム構成 ◦ SPAの開発にはwebフロントに関する技術スタックが必要 ◦ バックエンドとフロントエンドの技術は毛色がかなり異なるので少人数のチームほど Hotwireのメリッ
トが出やすい • 開発効率 ◦ SPAの場合、フロント/バックエンド、2つのアプリを開発する事になる ◦ ただし、Hotwireに比べてSPAのほうが柔軟に画面を実装できる • 結局どっちが良いの? ◦ Hotwireはまだ比較的新しい技術なので十分枯れてるわけではない、一方 React/Vue.js等の従来 のSPAアーキテクチャは関連情報が多く安心感がある ◦ webフロントエンジニアがチームに居れば (従来の)SPA、いなければHotwireに(我々は)している ⇨Phoenix/LiveViewを採用する事でHotwireを実現できる
Why Elixir/Phoenix? • パフォーマンス観点 ◦ スケールアップ(サーバー/コンテナのspecアップ)時に性能が線形に近い形で向上する ◦ キャッシュを外部のRedisやMemcachedに頼らなくてもets(ErlangVMのインメモリDB)で代用できる (こともある) •
アーキテクチャ観点 ◦ HTTPサーバー、APPサーバー、非同期処理 (Job)機構、簡易KVS、全てがErlangVM上のプロセス (※OSのプロセスではない )として同じレベルで動作する為、管理対象のミドルウェアは ErlangVMの みでよい ◦ Hotwire(Phoenix LiveView)を採用すれば、サーバーサイドで状態管理 が完結する ◦ WebSocket(Phoenix Channel)を採用すれば、高性能なリアルタイムWebがFWレベルで担保 • 組織設計観点 ◦ Webフロントエンド領域のエンジニアの負荷が Hotwire/LiveViewを利用する事で下がる (ただし、高 度な画面の状態管理ができない等の制約もある ) ◦ サーバー/コンテナ構成がシンプル (ErlangVMだけ)になるのでインフラ領域のエンジニア負荷が下 がる
Why Elixir/Phoenix? / スケールアップ時の特性 Linuxサーバー/コンテナ カーネル/OS/ハードウェア ErlangVM scheduler … Linuxサーバー/コンテナ
カーネル/OS/ハードウェア ErlangVM scheduler … スケールアップ (サーバーspec up) CPUコア数に応じて増加 スケジューラーを跨いでプロセスは適切 に分散配置/マイグレーション プロセス(OSのプロ セスではない) VM内のプロセスス ケジューラー 性能は比較的線形 に近い形で向上す る Rails/Spring/LaravelでLinuxサー バー/コンテナのspecを倍にするケース を考えてみる ⇨ 適切なプロセス/スレッド数、メモリ、そ の他設定の最適値は? ⇨ 最適な性能を出すには、なんだかんだ でプランニング/計測をやり直す必要があ る
Why Elixir/Phoenix? / Elixirアプリの実体(プロセス群) ErlangVM Application Controller Application Application Master
Phoenix サブシスA Elixir … ErlangVM上のアプリ(のプロセス群)は同 レベルでクラスタリングされている Elixir(言語ランタイム)もErlangVM上では (ただの)アプリとして存在する Erlang/Elixirで実装されているサブシスで あれば、ErlangVM内で拡張可能 (Elixirアプリとして追加すれば良い ) ErlangVM内で完結するので、アーキテク チャに変更を加えず機能拡張ができる
Why Elixir/Phoenix? / Phoenixの実体(プロセス群) Application Application Master HTTPサーバー モジュール (Cowboy)
Jobシステム (Exq) Phoenixアプリに 組み組んでいるモ ジュール (Lib単位で管理) Phoenixアプリの機能はプロセス treeの一 部としてアプリに組み込まれる ex) HTTPサーバー、Jobシステム、etc Elixirのライブラリ/パッケージとして管理さ れていれば、Phoenixアプリの関連パッ ケージとして設定するだけで、組み込み / 拡張できる ErlangVM内/Phoenixアプリ内で完結す るので、アーキテクチャに変更を加えず機 能拡張ができる
Webアプリのアーキテクチャと開発チームの構造 • コンウェイの法則 ◦ システム設計/アーキテクチャは、組織構造を反映させたものになる • コンウェイの法則の逆転現象 ◦ システム設計/アーキテクチャを変更する方が組織構造を変更するより難しい場合、組織の構造は システム設計/アーキテクチャの構造に影響をうける(その結果組織構造が変容する
) • 少人数チーム、短納期で開発したい場合、組織構造を複雑にしたくない(OHを増や したくない) ⇨Elixir/Phoenixを採用する事で、Webアプリのライフサイクルを通して、比較的シ ンプルなアーキテクチャに収める事がやりやすくなる ⇨組織構造をシンプルに比較的保ちやすくなる(※維持するには言語/技術スタック によらずある程度のコストは当然かかる)
まとめ • Webアプリのライフサイクルと各フェーズにおけるアーキテクチャの一般的な推移 について紹介しました • Elixir/Phoenixを利用する事で、Webアプリのライフサイクルを通して、比較的楽に アーキテクチャをシンプルに保つ事ができる理由を紹介しました • コンウェイの法則により、開発チームの組織構造がどう影響されるかについて紹介 しました
• 以上から、我々の開発チーム、短期かつ小規模でWebアプリを開発する際に、 Elixir/Phoenixを採用しています • 技術採用の判断材料になれば幸いです
おわり