1.3K Views
August 26, 22
スライド概要
バックエンドエンジニア
基盤システムを リニューアルした話 株式会社U-NEXT 富田 宙
自己紹介 富田 宙(とみた そら/@sora083) BOS(Back Office System)チーム所属(2018/10〜) サーバサイドシステムの開発・運用の担当エンジニア
今日話すこと BOSについて なぜリニューアルしたのか リニューアルで出てきた課題と対応 まとめ
BOSとは? サブスクリプション管理と決済処理(オーソリや請求など)を担当するシステムの総称 名前から何をやっているのか分かってもらいづらいのが大きな課題 サービス開始時から稼働していた基盤システムをリニューアル 2020年3月から稼働 マイクロサービスを採用し、APIとバッチを中心に構成されている アプリケーションの開発・設計にDDD(ドメイン駆動設計)を採用 ドメインや用語を整理、定義しながら開発を進めた
なぜリニューアルをしたのか? モバイルサービスを始めるにあたって既存システムでは対応できそうになかったため サービスの全体像が把握しづらく既存のシステムの運用や機能追加が追いつかなくなった 以前からある映像サービスには良くも悪くもスマートに対応していた そのため異なるドメインのサービスへの対応は相当困難と判断された FWもバラバラ 環境構築むずかしくて 分担できない Aに修正を入れるとBにも影響出る だからCを作って対応しよう どのコンポーネントに この機能があるんだったっけ・・
リニューアルでどう変わったか? BEFORE Java + “数種類”のフレームワーク ORマッパーはDB Flute マイクロサービス 参入障壁が高い AFTER サービス境界が曖昧 フレームワークに沿った開発・構成 フレームワークの活用による開発方針の共通化 これがコピペを生んだりもしていた Java/Kotlin + Spring 情報も多く参入しやすい ORマッパーはJPA(hibernate) マイクロサービス ドメイン境界ごとに分割 DDD(ドメイン駆動設計)を採用 コードの再利用性やメンテナンス性を高めた
リニューアルの進め方 リニューアルは下記のように段階的に実施 この時点では大きな問題も出ず リリース出来た達成感が大きかった 1. モバイルサービス対応のリリース 最初はモバイルサービスのみ対応 映像サービスは既存システムで対応という並行稼働 新規のサービスであったこともあり数万規模のユーザー数だった 2. 既存システムから新システムへのマイグレーション 映像サービスも新システムに切り替え 少ない件数から段階的に移行 最終的には数百万件以上のユーザーを移行 この段階で色々と課題が出てきて このまま移行できるのかという不安との 戦いが始まる・・
今回は”パフォーマンス”について リニューアルに際して色々な取り組みをしましたが、今回は”パフォーマンス”についての内容を扱います。 1.開発時に実施したこと 2.移行中に実施したこと 3.移行後に実施したこと 4.今後やっていきたいこと など、 各フェーズで出てきた課題とその対応についてお話していきます
1.開発時に実施したこと バッチ処理が多く、データが増えてくるにつれてパフォーマンス問題が出てきそう DB周りのパフォーマンス懸念の解消 SQLの見直しやキャッシュの利用によるDBへのアクセス回数の削減 テーブルへのインデックス追加 JPAのLAZYフェッチの活用 http接続のオーバーヘッドの削減 バルク処理APIの用意と利用 メッセージングサービスやAPIの非同期呼び出しの利用
2.移行中に実施したこと N+1問題や不要なDBアクセスによる処理時間の増加が予想より大きかった JPAの設定や記述の見直しによるDBアクセスの改善 JPQLの活用や不要なカラムの参照の削除 JPAのマッピングやFetchモードの見直し saveAllの利用やチャンクの調整など 非同期処理や並列処理の積極的採用 メッセージングや非同期連携で対応出来る箇所は原則、切り替え 処理対象データの取得でParallelStreamによる並列処理 APIの並列処理数が上がらない問題の解消 RestTemplate + apache http componentsを利用していたサービスでのみ発生 setMaxPerRouteの設定で解消 1日経っても バッチ処理が 終わらないのでは ・・・
3.移行後に実施したこと ユーザー数やトランザクションは増えていくのでさらなる改善を実施 不要なデータの参照・やり取りの削減 これだけで処理時間が1/10以下になったものも JPAからの脱却 JPAだからこそ発生している問題に苦しめられた もっとSQLライクに書いて細かい調整をしたい だけどORマッパーである程度は抽象化していて欲しい 新たな試みとしてjOOQを試してみている API呼び出しをノンブロッキングに変更 WebClientを利用して一部のAPI呼び出しをノンブロッキング化 JPAを引き続き使う 別のORマッパーに 切り替える
4.今後やっていきたいこと 引き続き目の前の課題解決もしつつ、もうちょっと大きめの改善・対応をやっていく バッチ開発手法の見直し 現在はspring-batchを利用しているがあまりうまく活用できていない 他のバッチ用フレームワークやKubernetesの機能を利用するなども検討していきたい モニタリング環境の整備 クラウドサービスのモニタリングツールなども活用していきたい 外部API接続の改善 外部APIの接続調整などを自前でやっている Resillience4jを利用すればもっと効率的に処理できそう
リニューアルしてみてどうなった? 開発・運用がしやすくなった 属人性が低くなり参入しやすくなった結果、チームのメンバーが増えた 新規開発や機能追加の対応が進めやすくなった メンバーが増えたことと、開発に関する環境の整備や疎結合化などが大きな要因だと思われる 決済手段の追加! アプリ内課金の マイクロサービスで デバッグ開始! 非同期連携に切り替えて パフォーマンス改善! プロジェクト進行、 ガンガンいこうぜ!
まとめ BOSの開発では 外部サービス、システムとの連携(セットプランでの他社連携、決済での連携 etc.) 規模の大きいユーザーやトランザクションの処理 マイクロサービスやDDDを活用した開発 コンテナやクラウドを活用した基盤システムの設計 一緒にサービスを成長させてくれる 仲間を絶賛、募集中です!! などなど、やりがいのある課題とやっていきたいことがたくさんあります!
THANK YOU ご清聴ありがとうございました!