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
Twelve-Factor Appで読み解く、モダンなアプリの理想とレガシーなアプリの現実 /...
Search
rs_tukki
June 24, 2020
Programming
4
1.8k
Twelve-Factor Appで読み解く、モダンなアプリの理想とレガシーなアプリの現実 / Rakus Meetup Tokyo 5 Twelve Factor App
Rakus Meetup Tokyo #5 「SaaSを支える開発原則」の登壇資料です。
https://rakus.connpass.com/event/178046/
rs_tukki
June 24, 2020
Tweet
Share
More Decks by rs_tukki
See All by rs_tukki
設計初心者のための「伝わる」フロー図 / How to draw a communicative flow diagram for beginners
rs_tukki
1
720
はじめてのTypeScript × はじめてのChrome拡張 / frontend_lt typescript and chrome-extension
rs_tukki
0
810
Other Decks in Programming
See All in Programming
3rd party scriptでもReactを使いたい! Preact + Reactのハイブリッド開発
righttouch
PRO
1
610
レガシーシステムにどう立ち向かうか 複雑さと理想と現実/vs-legacy
suzukihoge
14
2.2k
色々なIaCツールを実際に触って比較してみる
iriikeita
0
330
TypeScriptでライブラリとの依存を限定的にする方法
tutinoko
3
690
CSC509 Lecture 12
javiergs
PRO
0
160
C++でシェーダを書く
fadis
6
4.1k
見せてあげますよ、「本物のLaravel批判」ってやつを。
77web
7
7.8k
「今のプロジェクトいろいろ大変なんですよ、app/services とかもあって……」/After Kaigi on Rails 2024 LT Night
junk0612
5
2.2k
イベント駆動で成長して委員会
happymana
1
340
NSOutlineView何もわからん:( 前編 / I Don't Understand About NSOutlineView :( Pt. 1
usagimaru
0
340
flutterkaigi_2024.pdf
kyoheig3
0
150
エンジニアとして関わる要件と仕様(公開用)
murabayashi
0
300
Featured
See All Featured
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
6
430
jQuery: Nuts, Bolts and Bling
dougneiner
61
7.5k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
169
50k
Testing 201, or: Great Expectations
jmmastey
38
7.1k
Site-Speed That Sticks
csswizardry
0
28
Into the Great Unknown - MozCon
thekraken
32
1.5k
Designing for humans not robots
tammielis
250
25k
How To Stay Up To Date on Web Technology
chriscoyier
788
250k
Imperfection Machines: The Place of Print at Facebook
scottboms
265
13k
A Tale of Four Properties
chriscoyier
156
23k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
250
21k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
26
2.1k
Transcript
#RAKUSMeetup ©2020 RAKUS Co., Ltd. ©2020 RAKUS Co., Ltd. Twelve-Factor
Appで読み解く、 モダンなアプリの理想と レガシーなアプリの現実 開発統括部 第三開発部 楽楽精算開発2課 矢須 健太
#RAKUSMeetup ©2020 RAKUS Co., Ltd. 自己紹介 • 矢須 健太 (25)
• 楽楽精算の開発を担当 • @rs_tukki • Main : Java(Spring Boot, Seasar2) / Swift / Kotlin • Sub : PHP / Python / C# • Like : 野球観戦 / 旅行 / 読書
#RAKUSMeetup ©2020 RAKUS Co., Ltd. 楽楽精算
#RAKUSMeetup ©2020 RAKUS Co., Ltd. 楽楽精算 • 交通費・出張費・経費・交際費など、お金にまつわる全ての処理を一元管理できるクラウドシステムです。 • 2009年リリース
/ 導入社数6,000社突破!
#RAKUSMeetup ©2020 RAKUS Co., Ltd. ©2020 RAKUS Co., Ltd. Twelve-Factor
App
#RAKUSMeetup ©2020 RAKUS Co., Ltd. Twelve-Factor App • 今回初めて聞いたという人 •
言葉だけは聞いたことがある人 • 内容を説明できる人
#RAKUSMeetup ©2020 RAKUS Co., Ltd. Twelve-Factor App • 今回初めて聞いたという人 •
言葉だけは聞いたことがある人 • 内容を説明できる人
#RAKUSMeetup ©2020 RAKUS Co., Ltd. Twelve-Factor App • 今回初めて聞いたという人 •
言葉だけは聞いたことがある人 • 内容を説明できる人
#RAKUSMeetup ©2020 RAKUS Co., Ltd. Twelve-Factor App • クラウド上で動くアプリケーション(=SaaS)が守るべき 原則を12個にまとめた方法論
• 提唱されたのは2012年
#RAKUSMeetup ©2020 RAKUS Co., Ltd. 楽楽精算 • 交通費・出張費・経費・交際費など、お金にまつわる全ての処理を一元管理できるクラウドシステムです。 • 2009年リリース
/ 導入社数6,000社突破!
#RAKUSMeetup ©2020 RAKUS Co., Ltd. レガシーなアプリとモダンな方法論 • 楽楽精算はTwelve-Factor Appより古い •
今回のお話 1. Twelve Factor-Appから何点か抜粋して 2. 楽楽精算の開発と比較することで 3. レガシーなアプリをモダンに改善する道を探っていく!
#RAKUSMeetup ©2020 RAKUS Co., Ltd. Twelve-Factor App • 今回説明する内容 •
III. 設定 • X. 開発/本番一致 • V. ビルド、リリース、実行 • VIII. 並行性
#RAKUSMeetup ©2020 RAKUS Co., Ltd. Twelve-Factor App • 今回説明する内容 •
III. 設定 • X. 開発/本番一致 • V. ビルド、リリース、実行 • VIII. 並行性
#RAKUSMeetup ©2020 RAKUS Co., Ltd. III. 設定 • 原則:アプリの設定値は環境変数に格納せよ! •
設定値をコード内部に含めるのはNG • コードは今すぐにでもオープンソース化できる状態であるべき • 外部ファイルを読み取る方式もNG • 言語やフレームワークに依存したファイル形式になる • 環境ごとに異なる設定ファイルが散乱し、管理が煩雑になる
#RAKUSMeetup ©2020 RAKUS Co., Ltd. III. 設定 • 楽楽精算では 開発用リポジトリ
リリース用リポジトリ ローカル用の 設定ファイル テスト用の 設定ファイル 本番用の 設定ファイル
#RAKUSMeetup ©2020 RAKUS Co., Ltd. III. 設定 • よくある話 •
ローカルでは動いたのにテスト機上では動かない… ローカル用の 設定ファイル テスト用の 設定ファイル
#RAKUSMeetup ©2020 RAKUS Co., Ltd. III. 設定 • よくある話 •
ローカルでは動いたのにテスト機上では動かない… ローカル用の 設定ファイル ⇒記入済 テスト用の 設定ファイル ⇒未記入
#RAKUSMeetup ©2020 RAKUS Co., Ltd. III. 設定 • あるかもしれない話 •
本番リリースでも同じことが起きる…? 開発用リポジトリ リリース用リポジトリ ローカル用の 設定ファイル ⇒記入済 テスト用の 設定ファイル ⇒記入済 本番用の 設定ファイル ⇒未記入…?
#RAKUSMeetup ©2020 RAKUS Co., Ltd. III. 設定 • 何故書き忘れるのか? •
設定ファイルに書く→この設定を全環境で使えるのでは? • 他環境用のファイルも直さなければという意識が薄くなる • 環境変数なら • 各環境に直接登録される値 • 環境ごとに値を登録するという意識が強まり回避しやすい
#RAKUSMeetup ©2020 RAKUS Co., Ltd. Twelve-Factor App • 今回説明する内容 •
III. 設定 • X. 開発/本番一致 • V. ビルド、リリース、実行 • VIII. 並行性
#RAKUSMeetup ©2020 RAKUS Co., Ltd. X. 開発/本番一致 • 原則:開発・本番各環境で3つのギャップを最小にせよ! •
時間のギャップ • 開発⇒本番デプロイを数時間で実現 • 人材のギャップ • 開発した人が運用も行う • ツールのギャップ • 開発と本番で同じツールを使う
#RAKUSMeetup ©2020 RAKUS Co., Ltd. X. 開発/本番一致 • 楽楽精算では/時間のギャップ •
メジャーリリースは基本年4回 バージョン/月 4月 5月 6月 7月 8月 9月 10月 11月 12月 1月 2月 3月 バージョン1 バージョン2 バージョン3 バージョン4 設計~開発 テスト リリース準備 リリース リリース リリース リリース リリース準備 テスト 設計~開発 リリース準備 テスト リリース準備 設計~開発
#RAKUSMeetup ©2020 RAKUS Co., Ltd. X. 開発/本番一致 • 楽楽精算では/時間のギャップ •
メジャーリリースは基本年4回 バージョン/月 4月 5月 6月 7月 8月 9月 10月 11月 12月 1月 2月 3月 バージョン1 バージョン2 バージョン3 バージョン4 設計~開発 テスト リリース準備 リリース リリース リリース リリース リリース準備 テスト 設計~開発 リリース準備 テスト リリース準備 設計~開発 実装からリリースまで 半年超えることも…
#RAKUSMeetup ©2020 RAKUS Co., Ltd. X. 開発/本番一致 • 楽楽精算では/人材のギャップ •
開発担当のチームとリリース担当のチームが分かれている • 原則に則っていないが、分かれていること自体は問題ではない 開発チームと リリースチームが分離
#RAKUSMeetup ©2020 RAKUS Co., Ltd. X. 開発/本番一致 • 本当の問題点 •
開発担当「◦◦な環境が欲しいんですが何を渡せばいいですか?」 • リリース担当「◦◦が欲しいけど開発側の手順は分からないよ?」 • お互いがお互いの業務に無関心なために起こる弊害 お互いの意思疎通が 上手くいっていない
#RAKUSMeetup ©2020 RAKUS Co., Ltd. X. 開発/本番一致 • 楽楽精算では/ツールのギャップ •
使用しているツールはほとんど一致している • テスト環境では動いたのに本番環境では動かない、というケース が少ない ツール/環境 ローカル環境 テスト環境 本番環境 OS Windows CentOS CentOS アプリケーションサーバ Tomcat Tomcat Tomcat Webサーバ Apache(Tomcat内蔵) Apache Apache データベース PostgreSQL PostgreSQL PostgreSQL
#RAKUSMeetup ©2020 RAKUS Co., Ltd. Twelve-Factor App • 今回説明する内容 •
III. 設定 • X. 開発/本番一致 • V. ビルド、リリース、実行 • VIII. 並行性
#RAKUSMeetup ©2020 RAKUS Co., Ltd. V. ビルド、リリース、実行 • 原則:3つのプロセスは明確に区別せよ! •
実行中のコードを直接変更してはいけない • ≒コードを変更する場合はリリース自体をやり直すべきである • 別環境へリリースするたびにビルドしてはいけない • ≒全ての環境で同じコードを使うべきである • 実行のたびにリリース作業をやり直してはいけない • ≒再起動だけ行う場合は同じ成果物を使いまわす
#RAKUSMeetup ©2020 RAKUS Co., Ltd. V. ビルド、リリース、実行 • 楽楽精算では… 開発の完了したコード
をビルドしてリリース 担当に受け渡す
#RAKUSMeetup ©2020 RAKUS Co., Ltd. V. ビルド、リリース、実行 • 楽楽精算では… リリース担当はビルド
されたアプリを 各サーバに配置する
#RAKUSMeetup ©2020 RAKUS Co., Ltd. V. ビルド、リリース、実行 • 楽楽精算では… 各サーバ上で配置
されたアプリを起動
#RAKUSMeetup ©2020 RAKUS Co., Ltd. V. ビルド、リリース、実行 • 楽楽精算では… 開発担当が勝手に
ビルドを変更できない (ビルドと実行の 分離) 全環境に対して同じ ビルドでリリースする (ビルドとリリースの 分離) 再起動は必要なサーバ で行うだけ (実行とリリースの 分離)
#RAKUSMeetup ©2020 RAKUS Co., Ltd. Twelve-Factor App • 今回説明する内容 •
III. 設定 • X. 開発/本番一致 • V. ビルド、リリース、実行 • VIII. 並行性
#RAKUSMeetup ©2020 RAKUS Co., Ltd. VIII. 並行性 • 原則:インスタンス数の増加によって負荷に対応せよ! •
サーバそのもののスペック増強だと仮想マシンの再起動が必要 • ⇒ユーザが使えない時間が発生してしまう • プロセスが1つのみなのでそれが落ちたらもう対応不可 • プロセスを水平分割し、負荷によって処理を振り分けるべき • 例:ロードバランサ • プロセスが複数あれば1つが落ちても別のプロセスで処理を継続できる
#RAKUSMeetup ©2020 RAKUS Co., Ltd. VIII. 並行性 • 楽楽精算では… •
ロードバランサ×ユーザ別の複数環境 ・・・ LB LB LB
#RAKUSMeetup ©2020 RAKUS Co., Ltd. VIII. 並行性 • 楽楽精算では… •
ロードバランサ×ユーザ別の複数環境 ・・・ LB LB LB ユーザごとに環境を 分割して負荷分散 ロードバランサで 処理を振り分けて 負荷分散
#RAKUSMeetup ©2020 RAKUS Co., Ltd. VIII. 並行性 • おまけ •
リリースを分割してリスクを減らせる場合もある ・・・ LB LB LB 1回目リリース 2回目リリース
#RAKUSMeetup ©2020 RAKUS Co., Ltd. まとめ • Twelve-Factor Appと楽楽精算の比較を行った •
実現できていない点は実際に運用上苦労しているところ • 今から改善できそうなところも多い • 大事なことは「何故それをすべきなのか?」を考えること • 基本的に「こうするべき」としか書かれていない • 各アプリの特性や目指す形を考えた上で採用するか決める • そもそも今でも役立つとはいえ8年前の話
#RAKUSMeetup ©2020 RAKUS Co., Ltd. ご清聴ありがとうございました。 • 参考 • The
Twelve-Factor App (日本語訳) • https://12factor.net/ja/ • とにかく分かりづらいTwelve-Factor Appの解説を試みる • https://www.slideshare.net/masatoshitada7/twelvefactor-app • Javaでやってみる The Twelve Factor App JJUG-CCC 2014 Fall 講演資料 • https://www.slideshare.net/nabedge/java-the-twelve-factor-app