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.9k
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
830
Other Decks in Programming
See All in Programming
テスト自動化失敗から再挑戦しチームにオーナーシップを委譲した話/STAC2024 macho
ma_cho29
1
1.3k
フロントエンドのディレクトリ構成どうしてる? Feature-Sliced Design 導入体験談
osakatechlab
8
4.1k
Keeping it Ruby: Why Your Product Needs a Ruby SDK - RubyWorld 2024
envek
0
190
20年もののレガシープロダクトに 0からPHPStanを入れるまで / phpcon2024
hirobe1999
0
500
Stackless и stackful? Корутины и асинхронность в Go
lamodatech
0
800
アクターシステムに頼らずEvent Sourcingする方法について
j5ik2o
4
280
生成AIでGitHubソースコード取得して仕様書を作成
shukob
0
460
採用事例の少ないSvelteを選んだ理由と それを正解にするためにやっていること
oekazuma
2
1k
Go の GC の不得意な部分を克服したい
taiyow
3
790
Scalaから始めるOpenFeature入門 / Scalaわいわい勉強会 #4
arthur1
1
330
선언형 UI에서의 상태관리
l2hyunwoo
0
170
Асинхронность неизбежна: как мы проектировали сервис уведомлений
lamodatech
0
810
Featured
See All Featured
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
28
4.4k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
8
1.2k
Measuring & Analyzing Core Web Vitals
bluesmoon
4
170
Reflections from 52 weeks, 52 projects
jeffersonlam
347
20k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
280
13k
Rebuilding a faster, lazier Slack
samanthasiow
79
8.7k
Optimizing for Happiness
mojombo
376
70k
Being A Developer After 40
akosma
87
590k
Building Flexible Design Systems
yeseniaperezcruz
327
38k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
28
9.1k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
44
9.3k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
6
520
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