6K Views
November 13, 23
スライド概要
2023年11月11日(土)に実施されたJJUG CCC 2023 Fallのスポンサーセッションで弊社エンジニアが発表した登壇資料です。
ウェルスナビ株式会社 技術広報チームの公式アカウントです。
持続可能な データアーキテクチャを実現した リアーキテクティング 浦野 勝由 @JJUG CCC Fall 2023 1
⾃⼰紹介 浦野 勝由(Urano Katsuyoshi) ウェルスナビ株式会社 ソフトウェアエンジニアリングチーム / ディレクター ウェルスナビでは ● 2016年にフリーランスとしてウェルスナビに参画 ● 2018年から正社員としてAPI開発および基盤構築を主導 ひとこと ● 身長が183~4cm あります 2 @2023 WealthNavi Inc.
資産運用ロボアドバイザー 「 WealthNavi 」 3 ※⼀般社団法⼈⽇本投資顧問業協会「契約資産状況(最新版)(2023年3⽉末現在)『ラッ プ業務』『投資⼀任業』」を基にネット専業業者を⽐較 ウエルスアドバイザー社調べ (2023年9⽉時点) ※ 画⾯はイメージです。
アジェンダ 1. 本セッションについて(スコープと課題の提示) 2. リアーキテクティング 3. データ移行 4. アプリケーション移行 5. さいごに 4 @2023 WealthNavi Inc.
1. 本セッションについて(スコープと課題の提示) 2. リアーキテクティング 3. データ移行 4. アプリケーション移行 5. さいごに 5 @2023 WealthNavi Inc.
本セッションについて バックエンド開発チームが現在直⾯していること 事業が順調にスケールする過程で、運⽤に必要なデータは指数関数的に増⼤していま す。肥⼤化したデータは運⽤にかかる様々なシステムで性能劣化を引き起こしています。 そのため、継続的に性能改善に取り組んでいます。 このセッションで話すこと 肥⼤化したデータ例としてウェルスナビで最もお客様が⽬にする機会のあるポートフォ リオのデータアーキテクチャをリアーキテクティングした取り組みについて、 DynamoDBのテーブル設計、AWS SDKを使ったバックエンド実装や数億件に及ぶ⼤規模 データ移⾏などのトピックについてお話します。 6 @2023 WealthNavi Inc.
ざっくりデータフロー ⼊出⾦、証券取引、残⾼などのすべてのデータが同じデータベースに格納される 特徴 ● ほとんどのトランザクションデータはユーザー(⼝座)を識別するためのキーを保持する ● 残⾼データは営業⽇単位で作成される ● 市場開場⽇(≒営業⽇)は取引データが作成される (顧客口座) 入出金 取引 主DB 全自動 7 残高 管理 勘定系 @2023 WealthNavi Inc.
ポートフォリオと資産評価額(時価)推移グラフ 円評価額(時価) 円損益額(円損益率) ドル評価額 ドル損益額(円損益率) 公式FAQ: ホーム画面の損益をどう計算しているか教えてください 8 @2023 WealthNavi Inc.
ポートフォリオと資産評価額(時価)推移グラフ 評価額 損益額 元本額 公式FAQ: ホーム画面の損益をどう計算しているか教えてください 9 @2023 WealthNavi Inc.
ポートフォリオ関連のテーブル群 ユーザーIDをキーに各テーブルからデータをSELECTする 特徴 ● 運⽤期間が⻑いユーザーほどデータ量が増える ● ユーザーIDにインデックスが貼られているが、ユニークではないインデックススキャン (Non-Unique Key Lookup)になるため、検索性能はデータ量に反⽐例して劣化する 10 @2023 WealthNavi Inc.
ポートフォリオ関連のテーブル群 11 @2023 WealthNavi Inc.
データエビデンス(証券残⾼レコード数の推移) 12 @2023 WealthNavi Inc.
【再】ざっくりデータフロー 証券残⾼等ポートフォリオを構成するデータを持つテーブルが肥⼤化し、バックエンドの 様々な処理で遅延が発⽣している これまでの対応 ● バッチ処理はサーバーのスケールアウト、処理の多重化などで性能改善を推進 (顧客口座) 入出金 取引 主DB 残高 管理 継続的なバッチ性能改善 今回のスコープ 13 勘定系 @2023 WealthNavi Inc.
現⾏データアーキテクチャの課題 課題 ⽬指す状態 ● スケーラビリティの⽋如 ○ データベースは都度スケールアップ ● ユーザー増加(データ増加)にシステ ム性能が影響を受けないアーキテク チャ ○ スケーラビリティの獲得 ● ポートフォリオのデータ⽣成処理に必 要な関連テーブルが多く、データベー ○ スが⾼負荷 データベース負荷を制御可能 にする ○ アクセスが集中するピーク時間帯に 性能劣化が顕著 14 @2023 WealthNavi Inc.
1. 本セッションについて(スコープと課題の提示) 2. リアーキテクティング 3. データ移行 4. アプリケーション移行 5. さいごに 15 @2023 WealthNavi Inc.
Overview - リアーキテクティング ● 過去データ(履歴)はDynamoDBへ移⾏ ● 最新断⾯(基準⽇〜営業⽇)のみRDSから⽣成 Before:全期間スキャン After :期間指定スキャン+履歴参照(Dynamo) RDS DynamoDB 16 @2023 WealthNavi Inc.
トレードオフ Pros. ● データベースのクエリスキャン範囲がほぼ固定(⼀定)されるため、データベース負荷がユー ザーの運⽤期間に依らずぼぼ⼀定 ○ Non-Unique Key Lookup(複合キー)からIndex Range Scan(基準⽇)になることにより クエリのパフォーマンスが改善 ○ スキャン範囲が限定されることでデータベース負荷も⼤幅低減 ● DynamoDBの特性を活⽤し、全体としてのデータ肥⼤化がユーザー個別のクエリパフォーマ ンスに影響を与えることがないアーキテクチャを実現 Cons. ● システム複雑性の増⼤、管理対象(DynamoDB)の増加による運⽤保守性の低下 17 @2023 WealthNavi Inc.
DynamoDBテーブル設計 DynamoDBテーブル設計 パーティションキー ユーザーID ⽂字列 ソートキー 基準⽇ ⽂字列(YYYY-MM-DD) 値(Attribute) ポートフォリオ JSON 通常、DynamoDBのテーブル設計は難しい ほとんどの場合⼀つまたは少数のテーブルで対応することがベストプラクティス(*1) ユースケースが単純だったため、ベストプラクティスに則ることができた (*1) https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/bp-table-design.html 18 @2023 WealthNavi Inc.
DynamoDBデータ取得アーキテクチャ Javaアプリ テーブル(Portfolio) 複数スレッドで重複しな い期間のデータを取得す ることでレイテンシーを 極⼩化(※) Speed ユーザーIDによるパーティショニング ※スロットリング制約あり(後述) ユーザー増加がスループットに 影響しない設計 ユーザー ユーザー 1 N Scalability 基準⽇で分割 19 @2023 WealthNavi Inc.
AWS SDK for Javaとは? ● ● ● ● ● AWS公式が提供している AWSのサービスを簡単に利⽤できる 開発を簡素化するための⾼度な抽象化をサポートしている v1とv2がある 同⼀プロジェクト内で両⽅のバージョンを使⽤できる(*2) (*2) https://docs.aws.amazon.com/ja_jp/sdk-for-java/latest/developer-guide/migration-side-by-side.html 20 @2023 WealthNavi Inc.
AWS SDK for Javaとは? v1 v2 リリース 2010年 2018年 Javaバージョン Java7 〜 16 Java8、11、17、21 (LTS全て) パッケージ名 com.amazonaws software.amazon.awssdk HTTPクライアント 変更できない デフォルト設定を変更できる ⾮同期クライアント ⼀部対応 完全サポート GraalVM ⾮対応 対応(2.16.1以降) メンテナンス 継続 継続 21 @2023 WealthNavi Inc.
SDKv1版 - DynamoDBのデータを取得する SDKv1のインターフェースは原始的 DynamoDBの操作⾯でv2に劣っている(⾜りていない)部分はない (使いづらいけど)DynamoDBMapperを使えばJPAライクな実装も可能 22 @2023 WealthNavi Inc.
Spring Cloud AWS版 - DynamoDBのデータを取得する SDKv2のインターフェースは洗練されていて、 SpringCloudAWSと組み合わせるといい感じ ただしSpring Cloud AWSによるDynamoDBのサポー トは 3.0.x 〜 (*3) (*3) https://github.com/awspring/spring-cloud-aws#compatibility-with-spring-project-versions 23 @2023 WealthNavi Inc.
Testcontainer+LocalStack TestcontainerのLocalStackModuleを使えば、モックを⽤意しなくてもリアルな依存関係 (エミュレートされたAWS環境≒本番環境に近い条件)を含むテストを簡単に実装でき る build.gradleに以下を追加 testImplementation 'org.testcontainers:localstack:1.19.1' (*4) Testcontainer LocalStack (*4) 2023年11月時点の最新バージョン 24 @2023 WealthNavi Inc.
AWS STS+AssumeRole 必要なアクセス権限が付与されているロールの⼀時的な認証情報をSTSから取得してリア ルなAWS(開発)環境へアクセスする いずれかの認証プロバイダーを使う ● com.amazonaws.auth.profile.internal.securitytoken.STSProfileCredentialsServiceProvider ● software.amazon.awssdk.services.sts.auth.StsAssumeRoleCredentialsProvider ⼀時的な認証情報 Developer ロール IAM DynamoDB 開発端末 25 @2023 WealthNavi Inc.
Scan vs Query ScanではなくQueryを使⽤できるように設計 テーブル テーブル Query Scan Scan ● 常にテーブルまたはセカンダリイン デックス全体をスキャン Query ● パーティションキー条件必須 ● 条件に合致する範囲のみスキャン 26 @2023 WealthNavi Inc.
データベース負荷軽減と持続可能性 After:期間指定スキャン+履歴参照(Dynamo) Before:全期間スキャン DBのスキャン範囲を限定し、返却データ量を少なくすることによりSending data状態の 負荷を⼤幅に軽減 データセットのライフサイクルを設計および開発段階から考慮することが重要 ※パーティショニングやシャーディングによって実現できる場合も アーカイブ※ 27 @2023 WealthNavi Inc.
クエリ実⾏計画の確認 期間(⽇付)の条件を追加したことでクエリの実⾏計画が⼤幅に改善 Query cost: xxx ~ xx,xxx ⼤幅な性能改善 nested loop Single Row (constant) Query cost: x ~ xxx nested loop Non-Unique Key Lookup Single Row (constant) 28 Index Range Scan @2023 WealthNavi Inc.
1. 本セッションについて(スコープと課題の提示) 2. リアーキテクティング 3. データ移行 4. アプリケーション移行 5. さいごに 29 @2023 WealthNavi Inc.
Overview - データ移⾏ 基本情報 2023年10⽉現在 対象ユーザー(⼝座)数 60万〜(※解約⼝座含む) 移⾏アイテム件数 7億〜 処理時間 できるだけ短く(⽇付を跨ぎたくない) 費⽤ できるだけ抑えて 制約 本番環境へ影響を与えない 30 @2023 WealthNavi Inc.
バッチ処理アーキテクチャ StepFunction Publisher (1) Subscriber (N) s3://~ Batch SQS DynamoDB Fanout S3 RDS (Reader Endpoint) 31 @2023 WealthNavi Inc.
Spring Batch ● ● ● Jibでコンテナ化 起動引数で使⽤するリソースやジョブ(ApplicationRunner実装クラス名)を指定 実⾏が終了したらコンテナを終了 ジョブ定義 Batch 環境変数 名前 値 起動引数 (Spring Batch) コンテナ スレッド数 ⼊出⼒リソース 32 @2023 WealthNavi Inc.
Provisioned vs Ondemand プロビジョンドでデータ移⾏を実施し、移⾏完了後にオンデマンドへ移⾏ スロットリング CU(キャパシティユニット) 上限CU デフォCU 費⽤発⽣領域 DynamoDBがCUを管理 ユーザーがCUを管理 Provisioned ● スループット要件を満たすCUを事前確保 Ondemand ● デフォルトのCU設定あり ● ピークトラフィックの最⼤ 2 倍まで瞬時に対応 読み取り(RCU)、書き込み(WCU)それぞれで上限緩和申請可能 デフォルトのクォータは40,000CU (*5) (*5)https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/ServiceQuotas.html#gt-limits-throughput 33 @2023 WealthNavi Inc.
ホットキースロットリング 単⼀のパーティションに対して、上限を超えてアクセスを⾏った場合 スロットリングが発⽣ ホットキースロットリング 書き込み上限(秒)1,000 WCU 読み込み上限(秒)3,000 RCU パーティション パーティション制限に関しては上限緩和申請できません 34 @2023 WealthNavi Inc.
Trial and error history ● (RDS) Too many connections ● Throughput exceeds the current capacity of your table or index. DynamoDB is automatically scaling your table or index so please try again shortly. If exceptions persist, check if you have a hot key ● The level of configured provisioned throughput for the table was exceeded. Consider increasing your provisioning level with the UpdateTable API ● Throughput exceeds the current capacity of your table or index. DynamoDB is automatically scaling your table or index so please try again shortly. If exceptions persist, check if you have a hot key Turnig vCPU‧Memory RDS Java threads 35 Capacity Mode Turnig CU max connections Array size Batch DynamoDB @2023 WealthNavi Inc.
DynamoDBの制約‧はまりポイント ● キャパシティモードの選択 ○ プロビジョンド、オンデマンド ○ モードの切り替えは1⽇1回まで ● スロットリングの存在 ○ テーブル、パーティションキー ● バッチ処理 ○ ⼀度の書き込みリクエストで送信できるアイテム数は25(BatchWriteItem) ● コスト ○ 消費キャパシティーユニットとデータストレージ量で課⾦ ○ データサイズが⼤きいと(とても)費⽤がかさむ 36 @2023 WealthNavi Inc.
ベストプラクティス ● キャパシティプランニングと事前ウォーミング ● 再試⾏ ○ ⼀時的なスロットリングに対して有効 ○ レイテンシーが許容できて、かつエラーレートが増加し続けなければ正常 の動作 ○ SDKで対応可能 ● テーブル設計は慎重に ● データサイズは極⼒⼩さく 37 @2023 WealthNavi Inc.
事前ウォーミング 最⼤CUが⾒積可能であれば、プロビジョンドモードで負荷試験をすることでオンデマン ドの最⼤許容CUを設定することが可能 ③ キャパシティモード切替 プロビジョンド オンデマンド 過去最⼤ Consumed CUの2倍が上限 消 費 キ ャ パ シ テ ィ 消 費 キ ャ パ シ テ ィ ① 必要な最⼤CUの⾒積 ② 負荷試験 時間 ピーク時でも スロットリングが発⽣しない 時間 38 @2023 WealthNavi Inc.
DynamoDBのコスト削減 DynamoDBのアイテムサイズをとにかく縮⼩ ● 消費CUの最⼩化 ● 消費ストレージの削減 (*6) (*6) 弊社環境での検証事例 39 @2023 WealthNavi Inc.
1. 本セッションについて(スコープと課題の提示) 2. リアーキテクティング 3. データ移行 4. アプリケーション移行 5. さいごに 40 @2023 WealthNavi Inc.
ストラングラーパターンによるアプリケーション移⾏ 許可されたネットワークからのみV2へのアクセスを許可 機能の⼀般開放前に⼗分な⽐較検証を実施 WealthNavi ユーザー RDS ⽐較検証 V1 Internet ALB Office V2 41 DynamoDB @2023 WealthNavi Inc.
フューチャートグルによるプロダクト毎の移⾏ DynamoDB利⽤フラグは複数のスイッチにより制御 ● グローバル設定(DB) ● アプリケーション設定(プロパティファイル) ● 環境変数($ENV) DynamoDB利⽤フラグ OFF プロダクトA RDS(Aurora) DynamoDB利⽤フラグ ON プロダクトB RDS(Aurora) DynamoDB 42 @2023 WealthNavi Inc.
Next Future ホットキー制約回避等のため、将来的にはDynamoDB以外のストレージに 履歴データを移⾏ 持続可能な データアーキテクチャを維持 ネイティブアプリ RDS 最新データ のみ取得 端末にキャッシュ DynamoDB Webアプリ ート スポ エク S3にキャッシュ S3 43 @2023 WealthNavi Inc.
1. 本セッションについて(スコープと課題の提示) 2. リアーキテクティング 3. データ移行 4. アプリケーション移行 5. さいごに 44 @2023 WealthNavi Inc.
ソフトウェアエンジニアリングチームの紹介 ミッション‧ロール ● 持続可能な開発を実⾏できる環境‧基盤を構築 ● 技術的負債を管理し適切に対応するための開発戦略、戦術を提供 ● 適切なソフトウェアアーキテクチャを実現するための実⾏部隊 Latency Integration Container Framework Performance SQL Resillience Log Architecture Pub/Sub Cloud Java Security Event-Driven 45 @2023 WealthNavi Inc.
【重要な注意事項】 ● 本資料は、断定的判断を提供するものではなく、情報を提供することのみを⽬的としており、いか なる種類の商品も勧誘するものではありません。最終的な決定は、お客様⾃⾝で判断するものと し、当社はこれに⼀切関与せず、また、⼀切の責任を負いません。 ● 本資料には将来の出来事に関する予想が含まれている場合がありますが、それらは予想であり、ま た、本資料の内容の正確性、信頼性、完全性、適時性等を⼀切保証するものではありません。本資 料に基づいて被ったいかなる損害についても、当社は⼀切の責任を負いません。また、当社は、新 しい情報や将来の出来事その他の情報について、更新⼜は訂正する義務を負いません。 ● 本資料を利⽤することによりお客様に⽣じた直接的損害、間接的損害、派⽣的損害その他いかなる 損害についても、当社は⼀切の責任を負いません。 商号等:ウェルスナビ株式会社 金融商品取引業者 関東財務局長(金商) 第2884号 加入協会:日本証券業協会 一般社団法人日本投資顧問業協会 46 @2023 WealthNavi Inc.
ご清聴ありがとうございました 47 @2023 WealthNavi Inc.
Appendix.Ⅰ ウェルスナビでは複数の開発系ポジションで採⽤を強化しています。 主な採⽤中職種 ● ● ● ● ● バックエンド開発エンジニア エンジニアリングマネージャー モバイルエンジニア(Android) SRE ITサービスマネジメント 採⽤情報詳細 ● 下記URL(QRコード)よりご確認ください。 https://hrmos.co/pages/wealthnavi 採⽤に関する お問い合わせ先 ● ● 「カジュアルに話を聞いてみたい」という温度感でも構いません。 ウェルスナビ採⽤チーム([email protected])までご連 絡お待ちしております。 48 @2023 WealthNavi Inc.
Appendix.Ⅱ 定期的にWealthNavi開発(技術‧組織)に関する情報を発信しています。 開発者ブログ テックイベント 情報 技術広報に関する お問い合わせ先 ● https://tech.wealthnavi.com/ ブックマーク追加や記事への「いいね」していただけると嬉しいです ● ● ● ● connpass上で当社が開催するイベント情報を発信しています。 11/14(⽕)に当社オフィスでバックエンド技術を取り上げる勉 強会 + 懇親会を実施します。(浦野も登壇します。) 本⽇23:59まで応募ページを再掲しますので、ご興味ある⽅は 「WealthNavi」で検索と参加登録をお願いします。 ウェルスナビ技術広報チーム([email protected]) 49 @2023 WealthNavi Inc.