Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Twelve-Factor Appで読み解く、モダンなアプリの理想とレガシーなアプリの現実 /...

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

More Decks by rs_tukki

Other Decks in Programming

Transcript

  1. #RAKUSMeetup ©2020 RAKUS Co., Ltd. ©2020 RAKUS Co., Ltd. Twelve-Factor

    Appで読み解く、 モダンなアプリの理想と レガシーなアプリの現実 開発統括部 第三開発部 楽楽精算開発2課 矢須 健太
  2. #RAKUSMeetup ©2020 RAKUS Co., Ltd. 自己紹介 • 矢須 健太 (25)

    • 楽楽精算の開発を担当 • @rs_tukki • Main : Java(Spring Boot, Seasar2) / Swift / Kotlin • Sub : PHP / Python / C# • Like : 野球観戦 / 旅行 / 読書
  3. #RAKUSMeetup ©2020 RAKUS Co., Ltd. Twelve-Factor App • 今回初めて聞いたという人 •

    言葉だけは聞いたことがある人 • 内容を説明できる人
  4. #RAKUSMeetup ©2020 RAKUS Co., Ltd. Twelve-Factor App • 今回初めて聞いたという人 •

    言葉だけは聞いたことがある人 • 内容を説明できる人
  5. #RAKUSMeetup ©2020 RAKUS Co., Ltd. Twelve-Factor App • 今回初めて聞いたという人 •

    言葉だけは聞いたことがある人 • 内容を説明できる人
  6. #RAKUSMeetup ©2020 RAKUS Co., Ltd. レガシーなアプリとモダンな方法論 • 楽楽精算はTwelve-Factor Appより古い •

    今回のお話 1. Twelve Factor-Appから何点か抜粋して 2. 楽楽精算の開発と比較することで 3. レガシーなアプリをモダンに改善する道を探っていく!
  7. #RAKUSMeetup ©2020 RAKUS Co., Ltd. Twelve-Factor App • 今回説明する内容 •

    III. 設定 • X. 開発/本番一致 • V. ビルド、リリース、実行 • VIII. 並行性
  8. #RAKUSMeetup ©2020 RAKUS Co., Ltd. Twelve-Factor App • 今回説明する内容 •

    III. 設定 • X. 開発/本番一致 • V. ビルド、リリース、実行 • VIII. 並行性
  9. #RAKUSMeetup ©2020 RAKUS Co., Ltd. III. 設定 • 原則:アプリの設定値は環境変数に格納せよ! •

    設定値をコード内部に含めるのはNG • コードは今すぐにでもオープンソース化できる状態であるべき • 外部ファイルを読み取る方式もNG • 言語やフレームワークに依存したファイル形式になる • 環境ごとに異なる設定ファイルが散乱し、管理が煩雑になる
  10. #RAKUSMeetup ©2020 RAKUS Co., Ltd. III. 設定 • 楽楽精算では 開発用リポジトリ

    リリース用リポジトリ ローカル用の 設定ファイル テスト用の 設定ファイル 本番用の 設定ファイル
  11. #RAKUSMeetup ©2020 RAKUS Co., Ltd. III. 設定 • よくある話 •

    ローカルでは動いたのにテスト機上では動かない… ローカル用の 設定ファイル テスト用の 設定ファイル
  12. #RAKUSMeetup ©2020 RAKUS Co., Ltd. III. 設定 • よくある話 •

    ローカルでは動いたのにテスト機上では動かない… ローカル用の 設定ファイル ⇒記入済 テスト用の 設定ファイル ⇒未記入
  13. #RAKUSMeetup ©2020 RAKUS Co., Ltd. III. 設定 • あるかもしれない話 •

    本番リリースでも同じことが起きる…? 開発用リポジトリ リリース用リポジトリ ローカル用の 設定ファイル ⇒記入済 テスト用の 設定ファイル ⇒記入済 本番用の 設定ファイル ⇒未記入…?
  14. #RAKUSMeetup ©2020 RAKUS Co., Ltd. III. 設定 • 何故書き忘れるのか? •

    設定ファイルに書く→この設定を全環境で使えるのでは? • 他環境用のファイルも直さなければという意識が薄くなる • 環境変数なら • 各環境に直接登録される値 • 環境ごとに値を登録するという意識が強まり回避しやすい
  15. #RAKUSMeetup ©2020 RAKUS Co., Ltd. Twelve-Factor App • 今回説明する内容 •

    III. 設定 • X. 開発/本番一致 • V. ビルド、リリース、実行 • VIII. 並行性
  16. #RAKUSMeetup ©2020 RAKUS Co., Ltd. X. 開発/本番一致 • 原則:開発・本番各環境で3つのギャップを最小にせよ! •

    時間のギャップ • 開発⇒本番デプロイを数時間で実現 • 人材のギャップ • 開発した人が運用も行う • ツールのギャップ • 開発と本番で同じツールを使う
  17. #RAKUSMeetup ©2020 RAKUS Co., Ltd. X. 開発/本番一致 • 楽楽精算では/時間のギャップ •

    メジャーリリースは基本年4回 バージョン/月 4月 5月 6月 7月 8月 9月 10月 11月 12月 1月 2月 3月 バージョン1 バージョン2 バージョン3 バージョン4 設計~開発 テスト リリース準備 リリース リリース リリース リリース リリース準備 テスト 設計~開発 リリース準備 テスト リリース準備 設計~開発
  18. #RAKUSMeetup ©2020 RAKUS Co., Ltd. X. 開発/本番一致 • 楽楽精算では/時間のギャップ •

    メジャーリリースは基本年4回 バージョン/月 4月 5月 6月 7月 8月 9月 10月 11月 12月 1月 2月 3月 バージョン1 バージョン2 バージョン3 バージョン4 設計~開発 テスト リリース準備 リリース リリース リリース リリース リリース準備 テスト 設計~開発 リリース準備 テスト リリース準備 設計~開発 実装からリリースまで 半年超えることも…
  19. #RAKUSMeetup ©2020 RAKUS Co., Ltd. X. 開発/本番一致 • 楽楽精算では/人材のギャップ •

    開発担当のチームとリリース担当のチームが分かれている • 原則に則っていないが、分かれていること自体は問題ではない 開発チームと リリースチームが分離
  20. #RAKUSMeetup ©2020 RAKUS Co., Ltd. X. 開発/本番一致 • 本当の問題点 •

    開発担当「◦◦な環境が欲しいんですが何を渡せばいいですか?」 • リリース担当「◦◦が欲しいけど開発側の手順は分からないよ?」 • お互いがお互いの業務に無関心なために起こる弊害 お互いの意思疎通が 上手くいっていない
  21. #RAKUSMeetup ©2020 RAKUS Co., Ltd. X. 開発/本番一致 • 楽楽精算では/ツールのギャップ •

    使用しているツールはほとんど一致している • テスト環境では動いたのに本番環境では動かない、というケース が少ない ツール/環境 ローカル環境 テスト環境 本番環境 OS Windows CentOS CentOS アプリケーションサーバ Tomcat Tomcat Tomcat Webサーバ Apache(Tomcat内蔵) Apache Apache データベース PostgreSQL PostgreSQL PostgreSQL
  22. #RAKUSMeetup ©2020 RAKUS Co., Ltd. Twelve-Factor App • 今回説明する内容 •

    III. 設定 • X. 開発/本番一致 • V. ビルド、リリース、実行 • VIII. 並行性
  23. #RAKUSMeetup ©2020 RAKUS Co., Ltd. V. ビルド、リリース、実行 • 原則:3つのプロセスは明確に区別せよ! •

    実行中のコードを直接変更してはいけない • ≒コードを変更する場合はリリース自体をやり直すべきである • 別環境へリリースするたびにビルドしてはいけない • ≒全ての環境で同じコードを使うべきである • 実行のたびにリリース作業をやり直してはいけない • ≒再起動だけ行う場合は同じ成果物を使いまわす
  24. #RAKUSMeetup ©2020 RAKUS Co., Ltd. V. ビルド、リリース、実行 • 楽楽精算では… 開発担当が勝手に

    ビルドを変更できない (ビルドと実行の 分離) 全環境に対して同じ ビルドでリリースする (ビルドとリリースの 分離) 再起動は必要なサーバ で行うだけ (実行とリリースの 分離)
  25. #RAKUSMeetup ©2020 RAKUS Co., Ltd. Twelve-Factor App • 今回説明する内容 •

    III. 設定 • X. 開発/本番一致 • V. ビルド、リリース、実行 • VIII. 並行性
  26. #RAKUSMeetup ©2020 RAKUS Co., Ltd. VIII. 並行性 • 原則:インスタンス数の増加によって負荷に対応せよ! •

    サーバそのもののスペック増強だと仮想マシンの再起動が必要 • ⇒ユーザが使えない時間が発生してしまう • プロセスが1つのみなのでそれが落ちたらもう対応不可 • プロセスを水平分割し、負荷によって処理を振り分けるべき • 例:ロードバランサ • プロセスが複数あれば1つが落ちても別のプロセスで処理を継続できる
  27. #RAKUSMeetup ©2020 RAKUS Co., Ltd. VIII. 並行性 • 楽楽精算では… •

    ロードバランサ×ユーザ別の複数環境 ・・・ LB LB LB
  28. #RAKUSMeetup ©2020 RAKUS Co., Ltd. VIII. 並行性 • 楽楽精算では… •

    ロードバランサ×ユーザ別の複数環境 ・・・ LB LB LB ユーザごとに環境を 分割して負荷分散 ロードバランサで 処理を振り分けて 負荷分散
  29. #RAKUSMeetup ©2020 RAKUS Co., Ltd. VIII. 並行性 • おまけ •

    リリースを分割してリスクを減らせる場合もある ・・・ LB LB LB 1回目リリース 2回目リリース
  30. #RAKUSMeetup ©2020 RAKUS Co., Ltd. まとめ • Twelve-Factor Appと楽楽精算の比較を行った •

    実現できていない点は実際に運用上苦労しているところ • 今から改善できそうなところも多い • 大事なことは「何故それをすべきなのか?」を考えること • 基本的に「こうするべき」としか書かれていない • 各アプリの特性や目指す形を考えた上で採用するか決める • そもそも今でも役立つとはいえ8年前の話
  31. #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