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

社内での開発コミュニティ活動とモジュラーモノリス標準化事例のご紹介/xPalette and ...

社内での開発コミュニティ活動とモジュラーモノリス標準化事例のご紹介/xPalette and Introduction of Modular monolith standardization

JJUG CCC 2025 Spring
https://jjug.doorkeeper.jp/events/183483

#jjug_ccc #jjug_ccc_c

野村総合研究所(NRI)は「コンサルティング」「金融ITソリューション」「産業ITソリューション」「IT基盤サービス」の4事業を通じて、国内外の企業・行政の活動や、社会・暮らしを支えています。

NRIではxPaletteという開発コミュニティ活動を行っています。
現在、この活動でどのようなことを行っているのか、何を目指しているのかをご紹介させていただきます。

また、プロジェクトにおけるモジュラーモノリスの標準化事例についてご紹介させていただきます。
モジュラーモノリスの開発標準化・方式設計を行ううえで特に気を付けたこと、実際にやったことについて記載します。

Avatar for Mitsuharu Maruyama

Mitsuharu Maruyama

June 09, 2025
Tweet

Other Decks in Programming

Transcript

  1. 1 Copyright (C) Nomura Research Institute, Ltd. All rights reserved.

    NRIについて 01 開発コミュニティ活動(xPalette)のご紹介 モジュラーモノリス標準化 最後に 02 04 05 xPaletteの現場での活用事例 03
  2. 2 Copyright (C) Nomura Research Institute, Ltd. All rights reserved.

    自己紹介 JJUG CCC Spring 2025 氏名: 丸山 光晴 所属: 野村総合研究所 生産革新センター プラットフォームサービス開発一部 本日の意気込み: 社会人歴10年目にして初のセッション登壇となります! 恐らくとても緊張していますが、やさしい眼差しでご覧いただけるとありがたいです。 皆さんと意見交換して色々持ち帰れたらと思います!
  3. 3 Copyright (C) Nomura Research Institute, Ltd. All rights reserved.

    入社からプロジェクトへの技術支援業務に従事 JJUG CCC Spring 2025 NRIは幅広い業界の顧客がいるため、様々なプロジェクトに技術支援として参画できた プロジェクト種別凡例 :R&D・施策, :金融ITソリューション, :産業ITソリューション 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 R&D 大規模 システム統合 システム 構築 大規模 フロントシステム 再構築 技術施策 大規模 システム 再構築 大規模基幹システム再構築 (マイクロサービス) R&D フロントシステム 構築 証券 金融 流通 通信 産業 金融
  4. 4 Copyright (C) Nomura Research Institute, Ltd. All rights reserved.

    入社からプロジェクトへの技術支援業務に従事 JJUG CCC Spring 2025 NRIは幅広い業界の顧客がいるため、様々なプロジェクトに技術支援として参画できた プロジェクト種別凡例 :R&D・施策, :金融ITソリューション, :産業ITソリューション 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 R&D 大規模 システム統合 システム 構築 大規模 フロントシステム 再構築 技術施策 大規模 システム 再構築 大規模基幹システム再構築 (マイクロサービス) R&D フロントシステム 構築 証券 金融 流通 通信 産業 金融 システム開発における技術的課題の解決を実施 • アーキテクチャの検討 • アプリケーション処理方式の検討 • アプリケーション標準化ルール整備 • 共通部品の作成
  5. 6 Copyright (C) Nomura Research Institute, Ltd. All rights reserved.

    NRIは売上の約9割をITソリューションが占める企業 NRIについて
  6. 7 Copyright (C) Nomura Research Institute, Ltd. All rights reserved.

    NRIの事業領域 NRIについて コンサルティング 金融ITソリューション 産業ITソリューション IT基盤サービス マネジメントとシステム分野において あらゆる産業のコンサルティング 金融分野でのシステム開発や ソリューションを提供 産業分野でのシステム開発や ソリューションを提供 企業のIT基盤の構想・設計・ 構築・運用などのサービスや ソリューションを提供
  7. 8 Copyright (C) Nomura Research Institute, Ltd. All rights reserved.

    NRIの事業領域 NRIについて コンサルティング 金融ITソリューション 産業ITソリューション IT基盤サービス マネジメントとシステム分野において あらゆる産業のコンサルティング 金融分野でのシステム開発や ソリューションを提供 産業分野でのシステム開発や ソリューションを提供 企業のIT基盤の構想・設計・ 構築・運用などのサービスや ソリューションを提供
  8. 9 Copyright (C) Nomura Research Institute, Ltd. All rights reserved.

    IT基盤サービスのソリューション紹介:OpenStandia NRIについて OpenStandiaとは… NRIが提供するOSSに対するサポート&サービスの総称です。 https://openstandia.jp/oss_info/ サービスライナップ • オープンソース年間サポートサービス • オープンソース導入サービス • プロフェッショナルサービス(技術相談)
  9. 10 Copyright (C) Nomura Research Institute, Ltd. All rights reserved.

    サポート対象OSSは137 NRIについて 機能 オープンソース インフラ OS Red Hat Enterprise Linux コンテナ仮想化 Kubernetes, Docker, Rancher, Argo CD, Helm, Argo Rollouts, Kustomize, containerd, CRI-O サービスメッシュ Istio, Envoy, Linkerd, Cilium クラスタリング Heartbeat, Corosync, Pacemaker, DRBD, Keepalived , Apache Zookeeper RDBMS MySQL, MySQL Cluster, MariaDB, PostgreSQL NoSQL MongoDB, Redis, etcd, Valkey, Traefik オブジェクトストレージ MinIO Webサーバ Apache HTTP Server, Nginx, OpenResty プロキシサーバ Squid, OpenIG メールサーバ Postfix, sendmail, Mailman POP3/IMAP Dovecot, Courier-IMAP SPF/DKIM/DMARC OpenDKIM, OpenDMARC DNS BIND, PowerDNS, unbound ファイルサーバ Samba ディレクトリサーバ OpenLDAP, OpenDJ (ForgeRock DS), 389 Directory Server ビッグデータ集積 Apache Kafka, Apache Hadoop, Apache Spark ワークフロー Argo Workflows, Argo Events, Apache Airflow APIゲートウェイ Gloo Gateway, Kong Gateway, Tyk メッセージ ActiveMQ 機能 オープンソース 開発 APサーバ Apache Tomcat, JBoss AS/Wildfly, JBoss EAP, JBoss EWS, Red Hat Runtimes フレームワーク Apache Struts, Spring Framework, Spring Boot, Spring Batch, Spring Security, Spring Session, Spring Modulith, HikariCP,Spring for Apache Kafka, Spring Data Redis, Spring Data JPA, Spring Cloud Azure, Spring Cloud GCP, Spring Cloud Function, Echo, TailwindCSS フロントエンドフレームワーク Angular, React, Vue.js, Bootstrap, NgRx, NgBootstrap, Next.js, Nuxt テンプレートエンジン Thymeleaf ORマッピング Hibernate, MyBatis SOAP Apache Axis2 全文検索 Apache Solr, Apache ManifoldCF, Elasticsearch Java OpenJDK Javaライブラリ Log4j, Jackson, Logback, Netty, Micrometer, MapStruct, Dozer, Lombok, gRPC-Java, Java JWT, Gson, Redisson Goライブラリ gRPC-Go, gRPC-Gateway ポリシーエンジン Open Policy Agent, Casbin ツール バージョン管理 Apache Subversion, Git チケット管理 Redmine 運用管理 Tripwire テレメトリー管理 Vector 運用監視 Zabbix, Prometheus, Thanos, Jaeger, OpenTelemetry ログ管理 Fluentd, Fluent Bit, Grafana Loki トレース管理 Grafana Tempo メトリクス管理 Grafana Mimir ダッシュボード Grafana アンチウイルス Clam AntiVirus 暗号化 OpenSSL アプリ シングルサインオン Keycloak, Red Hat SSO, OpenAM (ForgeRock AM), OAuth2 Proxy ID管理 midPoint, OpenIDM (ForgeRock IDM) BI・ETL・レポート作成 Jaspersoft, Pentaho ※2025年5月現在 ⇒ ピンクの文字は直近1年間で追加したOSS
  10. 11 Copyright (C) Nomura Research Institute, Ltd. All rights reserved.

    開発コミュニティ活動(xPalette)のご紹介
  11. 12 Copyright (C) Nomura Research Institute, Ltd. All rights reserved.

    開発コミュニティ活動(xPalette) xPaletteのご紹介 xPalette(クロスパレット)とは?
  12. 13 Copyright (C) Nomura Research Institute, Ltd. All rights reserved.

    xPaletteが提供するモノ xPaletteのご紹介 ガイドライン ライブラリ サンプル/テンプレート Prj 開発手順や方式の説明 開発に利用可能な部品群 開発の雛形/実装例 各処理方式についての設計考慮 事項を記載。設計ガイドラインの内 容に沿ってアプリケーションを実装す る際の実装方式や実装例を参照 することで高品質なアプリケーション 開発が可能となる。 ガイドラインに記載した部品をライブ ラリとして提供。テンプレートプロジェ クトに組み込むことで素早いアプリ ケーション開発が可能となる。 ガイドラインに記載した実装例を実 際に動くサンプルコードとして提供。 テンプレートは開発開始時にプロ ジェクトの雛形として利用する。
  13. 14 Copyright (C) Nomura Research Institute, Ltd. All rights reserved.

    開発コミュニティ活動(xPalette)の構想 xPaletteのご紹介 (開発ベースライン) フィードバック 社外のエンジニア/企業 NRIのお客様 開発/エンハンス xPalette開発コミュニティ 社内開発PJ 公開/利用 プロダクト開発 公開/利用 フィードバック 構想
  14. 15 Copyright (C) Nomura Research Institute, Ltd. All rights reserved.

    開発コミュニティ活動(xPalette)の構想 xPaletteのご紹介 (開発ベースライン) フィードバック 社外のエンジニア/企業 NRIのお客様 開発/エンハンス xPalette開発コミュニティ 社内開発PJ 公開/利用 プロダクト開発 公開/利用 フィードバック 構想 現時点では一部を除き社内での利用にとどまっています 本日は社内でのxPalette開発コミュニティと その活動内容についてお話します
  15. 16 Copyright (C) Nomura Research Institute, Ltd. All rights reserved.

    開発コミュニティ活動のきっかけ xPaletteのご紹介 開発現場のトレンド ◼ 利用技術のオープン化 OSSなどオープンな開発技術の採用 が求められる。 ◼ 技術の多様化と高度化 クラウドネイティブ、マイクロサービスなど を中心に技術が多様化している。 開発現場の課題 ◼ 技術適用の準備が不十分 スピーディーな開発が求められており、 開発の準備に労力を要する。 ◼ 高度技術エンジニアの不足 最適な技術選定・適用方法を検討 することができる高度なエンジニアの確 保が難しい。 全社としての課題 ◼ ノウハウ・ナレッジの点在 技術的なノウハウやナレッジが各事業 部、開発部隊内部に閉じている、また ノウハウ共有の場(リポジトリ)がな いため、全社的な技術情報の共有が 効率的にできていない。 多様な技術から選択できる半セルフの開発ベースラインが必要。 さまざまな案件で得たナレッジで継続的にブラッシュアップする場としてxPaletteを提供する。
  16. 17 Copyright (C) Nomura Research Institute, Ltd. All rights reserved.

    xPaletteの活動領域 xPaletteのご紹介 バックエンド領域 アプリ実行基盤領域 フロントエンド領域 アプリケーションレイヤー インフラレイヤー APP
  17. 18 Copyright (C) Nomura Research Institute, Ltd. All rights reserved.

    xPaletteの利用イメージ xPaletteのご紹介 フロントエンド領域 バックエンド領域 アプリ実行基盤領域 開発に必要となる技術要素を 組み合わせて素早いアプリ開発をサポート 開発 エンジニア
  18. 19 Copyright (C) Nomura Research Institute, Ltd. All rights reserved.

    公開事例1(Next.js 公式ドキュメント和訳版) xPaletteのご紹介 xPaletteの活動として作成したNext.js 公式ドキュメントの和訳版を公開
  19. 20 Copyright (C) Nomura Research Institute, Ltd. All rights reserved.

    公開事例2(AILERON Gateway) xPaletteのご紹介 トラフィック・API管理 リバースプロキシ 負荷分散 流量制御 タイムアウト/リトライ プロトコル変換 … セキュリティ 認証(OIDC) 認可(OAuth2,OPA) FAPI ネットワークセキュリティ Webセキュリティ セッション管理 … 運用 オブザーバビリティ (OpenTelemetry, Jaeger, Prometheus) … https://aileron-gateway.github.io/ ◼ AILERON Gateway (エルロンゲートウェイ) はNRI発のシンプルな汎用ゲートウェイOSSです(Go言語製)。 ◼ ゲートウェイに求められる基本機能に加え、プロトコル変換や認証・認可など、アプリケーション側での実装が敬遠されがちな処理 をAILERON Gatewayに切り出すことができます。
  20. 21 Copyright (C) Nomura Research Institute, Ltd. All rights reserved.

    バックエンド領域の活動 xPaletteのご紹介 バッチアプリケーション オンラインアプリケーション 非同期アプリケーション バックエンド領域では「バッチ」「オンライン」「非同期」の3軸で活動中 特定の時刻やイベントで起動し、 特定の処理を実行する アプリケーション クライアントからのリクエストに 応じた処理を実行し、 即時に処理結果を応答する アプリケーション 処理要求に対して、 処理結果を即時に応答せず、別の サーバーで処理を実行するアプリ ケーション
  21. 22 Copyright (C) Nomura Research Institute, Ltd. All rights reserved.

    バックエンド領域の活動 xPaletteのご紹介 バッチアプリケーション オンラインアプリケーション 非同期アプリケーション バックエンド領域では「バッチ」「オンライン」「非同期」の3軸で活動中 特定の時刻やイベントで起動し、 特定の処理を実行する アプリケーション クライアントからのリクエストに 応じた処理を実行し、 即時に処理結果を応答する アプリケーション 処理要求に対して、 処理結果を即時に応答せず、別の サーバーで処理を実行するアプリ ケーション
  22. 23 Copyright (C) Nomura Research Institute, Ltd. All rights reserved.

    xPaletteにおけるオンラインの取組み xPaletteのご紹介 開発ガイドライン Springの実装に必要なノウハウを 集約したガイドライン 共通部品作成ガイドライン Spring前提で利用頻度の高い共通部品 の作成方法を記載したガイドライン サンプルプロジェクト 各ガイドラインに記載している 実装例のコード セキュリティガイドライン Spring Securityを用いた際に社内の セキュリティルールに準拠するためのガイドライン
  23. 24 Copyright (C) Nomura Research Institute, Ltd. All rights reserved.

    xPaletteの現場での活用事例と モジュラーモノリス標準化
  24. 25 Copyright (C) Nomura Research Institute, Ltd. All rights reserved.

    あるプロジェクトでアーキテクチャとしてモジュラーモノリスを選択 xPaletteの現場での活用事例とモジュラーモノリス標準化 顧客からのアーキテクチャ要望は下記。 1. 厳密なデータ整合性 2. コードの再利用性 3. マルチベンダ開発 ⇒ 開発体制・コスト・要望を勘案した結果、モジュラーモノリスを選択。 ⇒ 将来的なサービス分割も視野に方式設計を実施。 円が業務の 実装単位 1つのプロセスに まとめて実行 四角が業務の 実装単位 業務それぞれで プロセスを実行 呼び出し関係 凡例 プロセス単位 モノリス モジュラーモノリス マイクロサービス こちらを採用 当初の顧客要望
  25. 26 Copyright (C) Nomura Research Institute, Ltd. All rights reserved.

    プロジェクト成果物の一部はxPaletteを用いて省力化可能 xPaletteの現場での活用事例とモジュラーモノリス標準化 プロジェクト特化 xPalette未取込 プロジェクト共通 xPalette利用可 アプリケーション処理方式 標準化 共通部品 サンプル 開発ガイドライン セキュリティガイドライン 共通部品作成ガイドライン サンプルプロジェクト xPalette成果物 • モジュラーモノリス関連 • プロジェクト特化 • xPaletteにまだないもの は別途検討・作成。 プロジェクト成果物(の一部)
  26. 27 Copyright (C) Nomura Research Institute, Ltd. All rights reserved.

    プロジェクト成果物の一部はxPaletteを用いて省力化可能 xPaletteの現場での活用事例とモジュラーモノリス標準化 プロジェクト特化 xPalette未取込 プロジェクト共通 xPalette利用可 アプリケーション処理方式 標準化 共通部品 サンプル 開発ガイドライン セキュリティガイドライン 共通部品作成ガイドライン サンプルプロジェクト xPalette成果物 • モジュラーモノリス関連 • プロジェクト特化 • xPaletteにまだないもの は別途検討・作成。 プロジェクト成果物(の一部) xPalette成果物の適用事例と、 プロジェクトでのモジュラーモノリス標準化、 それぞれお話します。
  27. 28 Copyright (C) Nomura Research Institute, Ltd. All rights reserved.

    プロジェクト成果物の一部はxPaletteを用いて省力化可能 xPaletteの現場での活用事例とモジュラーモノリス標準化 プロジェクト特化 xPalette未取込 プロジェクト共通 xPalette利用可 アプリケーション処理方式 標準化 共通部品 サンプル 開発ガイドライン セキュリティガイドライン 共通部品作成ガイドライン サンプルプロジェクト xPalette成果物 • モジュラーモノリス関連 • プロジェクト特化 • xPaletteにまだないもの は別途検討・作成。 プロジェクト成果物(の一部) xPalette成果物の適用事例と、 プロジェクトでのモジュラーモノリス標準化、 それぞれお話します。 技術方式的な内容を中心にお話します。 ※特定顧客がいるプロジェクトなので業務設計などは話しません
  28. 30 Copyright (C) Nomura Research Institute, Ltd. All rights reserved.

    プロジェクト成果物の一部はxPaletteを用いて省力化可能 xPaletteの現場での活用事例とモジュラーモノリス標準化 プロジェクト特化 xPalette未取込 プロジェクト共通 xPalette利用可 アプリケーション処理方式 標準化 共通部品 サンプル 開発ガイドライン セキュリティガイドライン 共通部品作成ガイドライン サンプルプロジェクト xPalette成果物 • モジュラーモノリス関連 • プロジェクト特化 • xPaletteにまだないもの は別途検討・作成。 プロジェクト成果物(の一部) 再掲
  29. 31 Copyright (C) Nomura Research Institute, Ltd. All rights reserved.

    xPaletteを利用したプロジェクト共通処理の省力化 xPaletteの現場での活用事例 JSON変換設定 DB日時取得 業務日時取得 冪等性管理 メッセージ管理(プロパティ) REST-APIサーバ 例外ハンドリングフィルタ エラーハンドラ 共通例外 セキュリティ関連 共通コンテキスト REST-APIクライアント設定 JSONログ出力設定 SQLログ出力 メッセージロガー REST-APIクライアントジャーナル ログマスク アクセスログ ログ出力共通項目設定 ヘルスチェック 閉塞制御 アプリケーションモジュール分割 方式設計・標準化などを経て、アプリ設定や共通部品開発が待ち受ける プロジェクトにおける設定・実装すべき項目の一例 などなど…
  30. 32 Copyright (C) Nomura Research Institute, Ltd. All rights reserved.

    xPaletteを利用したプロジェクト共通処理の省力化 xPaletteの現場での活用事例 JSON変換設定 DB日時取得 業務日時取得 冪等性管理 メッセージ管理(プロパティ) REST-APIサーバ 例外ハンドリングフィルタ エラーハンドラ 共通例外 セキュリティ関連 共通コンテキスト REST-APIクライアント設定 JSONログ出力設定 SQLログ出力 メッセージロガー REST-APIクライアントジャーナル ログマスク アクセスログ ログ出力共通項目設定 ヘルスチェック 閉塞制御 アプリケーションモジュール分割 方式設計・標準化などを経て、アプリ設定や共通部品開発が待ち受ける プロジェクトにおける設定・実装すべき項目の一例 などなど… xPaletteを用いると上記の設定・開発を省力化することが可能
  31. 33 Copyright (C) Nomura Research Institute, Ltd. All rights reserved.

    xPaletteバックエンドのラインナップ xPaletteの現場での活用事例 開発環境構築 ビルド ログ出力 エラーハンドリング ファイルダウンロード ファイルアップロード セッション管理 RDBアクセス O/Rマッパー 設定値管理 Beanマッパー メッセージ管理 REST通信 ヘルスチェック アクセスログ エラーハンドリング SQLログ RESTクライアントログ ログメッセージ管理 入力値 データ送受信 セッション管理 ユーザー認証 画面表示・ブラウザ リリース・運用 開発ガイドライン 共通部品作成 ガイドライン セキュリティ ガイドライン サンプルプロジェクト
  32. 34 Copyright (C) Nomura Research Institute, Ltd. All rights reserved.

    開発ガイドラインとは… xPaletteの現場での活用事例 ◼よく利用するところだと… ⚫ Spring Boot + コンテナを利用した際の設定値管理のベストプラクティス ⚫ よく出力するログ一覧やログ標準化設定例 など、NRIの技術支援で得られたノウハウをxPaletteにフィードバックしています。 Spring Bootをベースとした開発ノウハウを記載したガイドを作成
  33. 35 Copyright (C) Nomura Research Institute, Ltd. All rights reserved.

    セキュリティガイドラインとは… xPaletteの現場での活用事例 ◼NRIでは全社標準のセキュリティガイドラインが存在しており、 Spring Boot + Spring Securityの開発においてそのガイドラインに準拠するための実装や 設定について網羅的に記載しています。 NRI標準のセキュリティガイドラインに準拠するためのガイドを作成
  34. 36 Copyright (C) Nomura Research Institute, Ltd. All rights reserved.

    共通部品作成ガイドラインとは… xPaletteの現場での活用事例 ◼共通部品をそのまま提供するのではなく、 どのような意図で共通部品を作成すべきかなどを示したガイドラインです。 ◼ガイドライン以外に下記も提供しているので、プロジェクト利用でもスムーズに導入できます。 ⚫ 共通部品サンプルコード ⚫ 共通部品利用サンプル 共通部品を作成するためのノウハウを記載したガイドを作成
  35. 37 Copyright (C) Nomura Research Institute, Ltd. All rights reserved.

    xPaletteを利用したプロジェクト共通処理の省力化 xPaletteの現場での活用事例 JSON変換設定 DB日時取得 業務日時取得 冪等性管理 メッセージ管理(プロパティ) REST-APIサーバ 例外ハンドリングフィルタ エラーハンドラ 共通例外 セキュリティ関連 共通コンテキスト REST-APIクライアント設定 JSONログ出力設定 SQLログ出力 メッセージロガー REST-APIクライアントジャーナル ログマスク アクセスログ ログ出力共通項目設定 ヘルスチェック 閉塞制御 アプリケーションモジュール分割 方式設計・標準化などを経て、アプリ設定や共通部品開発が待ち受ける プロジェクトにおける設定・実装すべき項目の一例 などなど… xPaletteを用いると上記の設定・開発を省力化することが可能 こちらを例として共通部品作成 ガイドラインについて紹介
  36. 38 Copyright (C) Nomura Research Institute, Ltd. All rights reserved.

    共通部品作成ガイドライン xPaletteの現場での活用事例 ◼SQLログ出力部品をガイドライン化した背景… ⚫ NRIではO/R MapperとしてMyBatisを利用することがよくある。 ⚫ 開発・テスト時に実行したSQLをログ出力しておくと、デバッグ時に便利。 ⚫ Mybatisの機能としてSQLログ出力機能はあるが、出力フォーマット変更などの柔軟性に欠ける。 ◼MybatisのSQLログ出力部品を作成することにより、柔軟なログ出力を可能にする。 2025-06-01 14:19:04 [application] INFO j.c.n.p.l.c.m.l.i.SqlLoggingInterceptor – [SQL_JOURNAL] sqlId=jp.co.nri.palette.example.rest.db.mybatis.mapper.SampleTableMapper.insert sql={INSERT INTO sample_table (id, point, type_id, chars, insert_date, insert_timestamp) VALUES (?, ?, ?, ?, ?, ?)} parameters={id=11125, point=11111, typeId=11111, chars=11111, insertDate=20250101000000.000, insertTimestamp=20250101134556.000} (elapsed time: 19 ms) SQL実行ごとのログ出力 SQL実行時間の計測 ログ出力フォーマットや出力項目のカスタマイズ
  37. 39 Copyright (C) Nomura Research Institute, Ltd. All rights reserved.

    共通部品作成ガイドライン xPaletteの現場での活用事例 ◼SQLログ出力ガイドラインの「実装クラス一覧と役割」として下記のようなクラス図を記載。
  38. 40 Copyright (C) Nomura Research Institute, Ltd. All rights reserved.

    共通部品作成ガイドライン xPaletteの現場での活用事例 ◼SQLログ出力ガイドラインの「拡張ポイントについて」にはどのように拡張するのかを記載。
  39. 41 Copyright (C) Nomura Research Institute, Ltd. All rights reserved.

    共通部品作成ガイドライン xPaletteの現場での活用事例 ◼SQLログ出力ガイドラインの「利用方法」には利用のための設定を記載。
  40. 43 Copyright (C) Nomura Research Institute, Ltd. All rights reserved.

    プロジェクト成果物の一部はxPaletteを用いて省力化可能 xPaletteの現場での活用事例とモジュラーモノリス標準化 プロジェクト特化 xPalette未取込 プロジェクト共通 xPalette利用可 アプリケーション処理方式 標準化 共通部品 サンプル 開発ガイドライン セキュリティガイドライン 共通部品作成ガイドライン サンプルプロジェクト xPalette成果物 • モジュラーモノリス関連 • プロジェクト特化 • xPaletteにまだないもの は別途検討・作成。 プロジェクト成果物(の一部) 再掲
  41. 44 Copyright (C) Nomura Research Institute, Ltd. All rights reserved.

    アーキテクチャ概観 モジュラーモノリス標準化 非同期処理 イベント駆動などを実現するため非同期処理方式を導入。 モジュラーモノリス Spring Modulith導入でモジュールの疎結合化を実現。 トランザクションアウトボックス 業務的なDB更新とメッセージ更新を同一のDBトランザクションで 実現する設計パターン。TxOutBox自体もSpringで実装。 アーキテクチャとしての主な特徴 REST REST REST REST 非同期 TxOutBox Queue Module A Module B Module A Module B BFF 方式設計・標準化担当範囲 メッセージ管理 業務テーブル DB フロントエンド
  42. 45 Copyright (C) Nomura Research Institute, Ltd. All rights reserved.

    あるプロジェクトでアーキテクチャとしてモジュラーモノリスを選択 xPaletteの現場での活用事例とモジュラーモノリス標準化 顧客からのアーキテクチャ要望は下記。 1. 厳密なデータ整合性 2. コードの再利用性 3. マルチベンダ開発 ⇒ 開発体制・コスト・要望を勘案した結果、モジュラーモノリスを選択。 ⇒ 将来的なサービス分割も視野に方式設計を実施。 円が業務の 実装単位 1つのプロセスに まとめて実行 四角が業務の 実装単位 業務それぞれで プロセスを実行 呼び出し関係 凡例 プロセス単位 モノリス モジュラーモノリス マイクロサービス こちらを採用 当初の顧客要望 再掲
  43. 46 Copyright (C) Nomura Research Institute, Ltd. All rights reserved.

    モジュラーモノリスのサービス分割を見据えた設計のポイント モジュラーモノリス標準化 ① モジュールを疎結合に保つ仕組み モジュラーモノリスの根幹となるモジュールを疎結合に保つための仕組み。 今回はSpring Modulithの機能を利用する。 ② モジュール間呼び出しIF 隣のモジュールを呼び出す際のインターフェースの考慮。 あるモジュールをサービス分割した際にどれだけ簡単に呼び出し箇所を切り替えできるか。 ③ 非同期処理方式の用意 サービスの疎結合化や時間のかかる処理をバックグラウンドで処理するため、 非同期処理方式を用意。
  44. 47 Copyright (C) Nomura Research Institute, Ltd. All rights reserved.

    モジュラーモノリスのサービス分割を見据えた設計のポイント モジュラーモノリス標準化 ① モジュールを疎結合に保つ仕組み モジュラーモノリスの根幹となるモジュールを疎結合に保つための仕組み。 今回はSpring Modulithの機能を利用する。 ② モジュール間呼び出しIF 隣のモジュールを呼び出す際のインターフェースの考慮。 あるモジュールをサービス分割した際にどれだけ簡単に呼び出し箇所を切り替えできるか。 ③ 非同期処理方式の用意 サービスの疎結合化や時間のかかる処理をバックグラウンドで処理するため、 非同期処理方式を用意。
  45. 48 Copyright (C) Nomura Research Institute, Ltd. All rights reserved.

    Spring Modulith機能でパッケージ境界を規定 モジュラーモノリス標準化 ◼Application.Java(mainクラス)のパッケージをベースパッケージとみなす。 ⚫ 例の場合、ベースパッケージは「example」(①)。 ◼ベースパッケージ直下のパッケージをそれぞれモジュールと認識する。 ⚫ 例の場合、 「inventory」「order」をそれぞれモジュールとして認識する(②)。 ◼他のモジュールを呼び出したい場合、明示的にどのモジュールを呼び出すのかを定義する 。 ⚫ 下記はinventoryのpackage-info.javaにApplicationModuleでorderへの依存を許可させている(③)。 ② ① ③ ⇒ 詳細は下記URLを参照。 https://spring.pleiades.io/spring-modulith/reference/fundamentals.html ① モジュールを疎結合に保つ仕組み ② モジュール間呼び出しIF ③ 非同期処理方式の用意
  46. 49 Copyright (C) Nomura Research Institute, Ltd. All rights reserved.

    Spring Modulith機能でパッケージ境界を規定 モジュラーモノリス標準化 ◼モジュール構造チェックを実施する。 ⚫ サブドメインごとに分割したモジュールが、規定した依存先にのみ依存しているかチェック ⚫ チェックするためのコードは下記。 @SpringBootTest class ModularMonolithSampleApplicationTests { @Test void test() { var modules = ApplicationModules.of(Application.class); modules.forEach(System.out::println); // モジュール情報の出力 modules.verify(); // モジュール構造チェック } } モジュール inventory モジュール order inventoryはorderに依存するが、 orderはinventoryに依存してはならない ① モジュールを疎結合に保つ仕組み ② モジュール間呼び出しIF ③ 非同期処理方式の用意
  47. 50 Copyright (C) Nomura Research Institute, Ltd. All rights reserved.

    Spring Modulith機能でパッケージ境界を規定 モジュラーモノリス標準化 ◼モジュール構造チェックの実行結果が下記。 # Inventory > Logical name: inventory > Base package: example.inventory > Spring beans: o ….controller.InventoryController o ….core.service.InventoryApplicationServiceImpl # Order > Logical name: order > Base package: example.order > Spring beans: o ….controller.OrderController o ….core.service.OrderApplicationServiceImpl - Module 'order' depends on non-exposed type example.inventory.core.service.InventoryApplicationService within module 'inventory'! OrderApplicationService declares constructor OrderApplicationService(OrderRepository, InventoryApplicationService) in (OrderApplicationService.java:0) - Module 'order' depends on non-exposed type example.inventory.core.entity.Inventory within module 'inventory'! Method <example.order.core.service.OrderApplicationService.findById(java.lang.String)> calls method <example.inventory.core.entity.Inventory.getInventory()> in (OrderApplicationService.java:41) - Module 'order' depends on non-exposed type example.inventory.core.service.InventoryApplicationService within module 'inventory’! (以下略) ---モジュール情報の出力結果--- ---モジュール構造チェック結果--- ① モジュールを疎結合に保つ仕組み ② モジュール間呼び出しIF ③ 非同期処理方式の用意 許可されていないモジュールを呼び出している場合、 エラーが発生する
  48. 51 Copyright (C) Nomura Research Institute, Ltd. All rights reserved.

    独自ツールで正しいテーブルを参照しているか確認 モジュラーモノリス標準化 ◼あるサブドメインから別のサブドメインのテーブルを参照していないかどうかのチェックも導入。 ⚫ 前提として、テーブル名のプレフィックスにサブドメイン名を入れるような標準化を実施。 Module A Module B サブドメインA サブドメインB テーブル テーブル Module A Module B サブドメインA サブドメインB テーブル テーブル サブドメイン間でテーブルの参照がされている良くない状態 お手製チェックツールを用いてサブドメイン間のテーブル参照を検知 CIを実施してチェックツールを実行 ① モジュールを疎結合に保つ仕組み ② モジュール間呼び出しIF ③ 非同期処理方式の用意
  49. 52 Copyright (C) Nomura Research Institute, Ltd. All rights reserved.

    モジュラーモノリスのサービス分割を見据えた設計のポイント モジュラーモノリス標準化 ① モジュールを疎結合に保つ仕組み モジュラーモノリスの根幹となるモジュールを疎結合に保つための仕組み。 今回はSpring Modulithの機能を利用する。 ② モジュール間呼び出しIF 隣のモジュールを呼び出す際のインターフェースの考慮。 あるモジュールをサービス分割した際にどれだけ簡単に呼び出し箇所を切り替えできるか。 ③ 非同期処理方式の用意 サービスの疎結合化や時間のかかる処理をバックグラウンドで処理するため、 非同期処理方式を用意。
  50. 53 Copyright (C) Nomura Research Institute, Ltd. All rights reserved.

    モジュール呼び出しインターフェースを考慮する必要性 モジュラーモノリス標準化 ◼モジュラーモノリスは将来的なサービス分割を考慮する必要がある。 もし考慮していない場合… public List<Products> getProduct(List<Integer> productIds) { List<Product> products = productsService.getProducts(); /* 直接対象モジュールのメソッドを呼び出す */ return products; } public List<Products> getProduct(List<Integer> productIds) { List<ProductResponse> productResponses = restClient.get() .uri("https://service-d/products") .retrieve() .body(new ParameterizedTypeReference<>() {}); // Java Bean変換処理など… return products; inventory order cart product inventory order cart product 一部の業務で分割が必要になった場合、 別のサービスとして切り出す。 モジュラーモノリス 一部のマイクロサービス化 サービス サービス 変更前: 変更後: すべての箇所でメソッド呼び出しからREST クライアント呼び出しに変更する必要がある ① モジュールを疎結合に保つ仕組み ② モジュール間呼び出しIF ③ 非同期処理方式の用意 HTTP
  51. 54 Copyright (C) Nomura Research Institute, Ltd. All rights reserved.

    モジュール/サービス呼び出しの切り替えを検討 モジュラーモノリス標準化 アプリ処理 REST Client モジュール呼出 別モジュール サービス Client切替部品 HTTP通信 メソッド呼出 アプリ処理 Client(REST) REST Client Client(Module) モジュール呼出 別モジュール サービス HTTP通信 メソッド呼出 設定によって 切り替え DIで切り替え Client切替部品を用意 アプリ処理からはClient切替部品を呼び出すだけ。 ただ、 Client切替部品の実装自体に時間がかかる。 DIでClientを切り替え アプリでは通信先にあわせて実装を作成する。 サービス統合/分割する場合、Client実装追加が必要。 こちらを採用 今回はわかりやすさや開発体制を考慮して DIでのクライアント切り替えを採用。 ① モジュールを疎結合に保つ仕組み ② モジュール間呼び出しIF ③ 非同期処理方式の用意
  52. 55 Copyright (C) Nomura Research Institute, Ltd. All rights reserved.

    ClientからControllerを呼び出すような標準化を実施 モジュラーモノリス標準化 ① モジュールを疎結合に保つ仕組み ② モジュール間呼び出しIF ③ 非同期処理方式の用意 Client(REST) REST Client Client(Module) モジュール呼出 Service Controller モジュールB モジュールA モジュラーモノリスY モジュラーモノリスX Service Controller HTTP通信 モジュールA モジュラーモノリスX Service Controller Service Controller モジュールB メソッド呼出 サービス呼び出し: モジュール呼び出し: Controllerをそれぞれのインターフェースにすることにより、 設計や実装の省力化を図る。 両方ともControllerを呼び出している
  53. 56 Copyright (C) Nomura Research Institute, Ltd. All rights reserved.

    ClientからControllerを呼び出すような標準化を実施 モジュラーモノリス標準化 @Service @RequiredArgsConstructor public class ProductAppilcationService { // Clientのインタフェース。 private final ProductClient productClient; @Override public Products getProduct(List<Integer> productIds) { // Clientを呼び出す。 List<ProductClientOutDto> getProductResponses = productClient.getProduct(productIds); (以下略) @Repository @RequiredArgsConstructor public class DefaultProductClient implements ProductClient { // APIのインタフェース。ここに実装クラス(Controller)がインジェクトされる。 private final GetProductApi getProductApi; @Override public List<ProductClientOutDto> getProduct(List<Integer> productIds) { // Controllerを通常メソッドとして呼び出す。 List<GetProductResponse> getProductResponses = getProductApi.getProducts(productIds).getBody(); return OrderClientDtoMapper.INSTANCE.mapToProductClientOutDtos(getProductResponses); } } Client - モジュール呼び出し実装 Client - サービス呼び出し実装 @Repository @RequiredArgsConstructor public class RestProductClient implements ProductClient { // RestClient private final RestClient restClient; @Override public List<ProductClientOutDto> getProduct(List<Integer> productIds) { // REST呼び出し実行 List<ProductResponse> getProductResponses = restClient.get() .uri("https://service-d/products") .retrieve() .body(new ParameterizedTypeReference<>() {}); return OrderClientDtoMapper.INSTANCE.mapToProductClientOutDtos(getProductResponses); } } アプリ処理 DIで切り替え ① モジュールを疎結合に保つ仕組み ② モジュール間呼び出しIF ③ 非同期処理方式の用意
  54. 57 Copyright (C) Nomura Research Institute, Ltd. All rights reserved.

    モジュラーモノリスのサービス分割を見据えた設計のポイント モジュラーモノリス標準化 ① モジュールを疎結合に保つ仕組み モジュラーモノリスの根幹となるモジュールを疎結合に保つための仕組み。 今回はSpring Modulithの機能を利用する。 ② モジュール間呼び出しIF 隣のモジュールを呼び出す際のインターフェースの考慮。 あるモジュールをサービス分割した際にどれだけ簡単に呼び出し箇所を切り替えできるか。 ③ 非同期処理方式の用意 サービスの疎結合化や時間のかかる処理をバックグラウンドで処理するため、 非同期処理方式を用意。
  55. 58 Copyright (C) Nomura Research Institute, Ltd. All rights reserved.

    非同期処理で実現しようとした方式はふたつ モジュラーモノリス標準化 コマンド処理 イベント処理 イベント処理ではクライアントは事象を送信する。 • ユーザが作成された。 • 注文が確定した。 コンシューマは関心のあるイベントを受信して処理を実施。 • ユーザが作成された旨のメールを送信。 • 在庫引き当ての実施。 イベント処理では事象発生の順序を保つ。 ⇒ 順序入替があるとサービス間で整合性が保てない コマンド処理ではクライアントは指示を送信する。 • 帳票の作成の指示。 • 集計処理実施の指示。 コンシューマはコマンドを受信して処理を実施。 • 帳票作成の実施。 • 集計処理の実施。 コマンド処理では順序制御が不要な処理のみ実施。 ⇒ 単発の重い処理を実施するだけにする サービス間を疎結合にするための方式 時間のかかる処理を非同期に流す方式 REST TxOut Box Topic REST Command Consumer TxOut Box Queue Event Consumer A B A A ※これはサブドメイン ① モジュールを疎結合に保つ仕組み ② モジュール間呼び出しIF ③ 非同期処理方式の用意 Event Consumer Event Consumer C D Sub Sub
  56. 59 Copyright (C) Nomura Research Institute, Ltd. All rights reserved.

    非同期処理で実現しようとした方式はふたつ モジュラーモノリス標準化 コマンド処理 イベント処理 イベント処理ではクライアントは事象を送信する。 • ユーザが作成された。 • 注文が確定した。 コンシューマは関心のあるイベントを受信して処理を実施。 • ユーザが作成された旨のメールを送信。 • 在庫引き当ての実施。 イベント処理では事象発生の順序が保つ。 ⇒ 順序入替があるとサービス間で整合性が保てない コマンド処理ではクライアントは指示を送信する。 • 帳票の作成の指示。 • 集計処理実施の指示。 コンシューマはコマンドを受信して処理を実施。 • 帳票作成の実施。 • 集計処理の実施。 コマンド処理では順序が不要な処理のみ実施。 ⇒ 単発の重い処理を実施するだけにする サービス間を疎結合にするための方式 時間のかかる処理を非同期に流す方式 REST TxOut Box Topic REST Command Consumer TxOut Box Queue Event Consumer A B A A ※これはサブドメイン ① モジュールを疎結合に保つ仕組み ② モジュール間呼び出しIF ③ 非同期処理方式の用意 Event Consumer Event Consumer C D Sub Sub 方式を実現するためにAzure Service Busを採用 • セッション機能によって順序制御が可能。 • トピック・サブスクリプション機能により複数コンシューマに配信可能。 • 利用実績も考慮。
  57. 60 Copyright (C) Nomura Research Institute, Ltd. All rights reserved.

    非同期コンシューマライブラリの決定 モジュラーモノリス標準化 ◼Azure Service Busの機能をそのまま利用できるライブラリを採用する必要があった。 ⚫ JMSなどを利用すると、順序制御機能が利用できないなど制約あり。 ⚫ メッセージ受信時の処理をカスタマイズしたい要望があった。 Consumer Topic・Queue メッセージID:BBB メッセージID:AAA ライブラリ メッセージハンドラ AAA メッセージハンドラ BBB Spring Cloud Azure Service Bus Starterを採用 • Azure Service Busと組み合わせたときの順序制御・カスタマイズ性を優先 ① モジュールを疎結合に保つ仕組み ② モジュール間呼び出しIF ③ 非同期処理方式の用意
  58. 61 Copyright (C) Nomura Research Institute, Ltd. All rights reserved.

    トランザクションアウトボックス方式の決定 モジュラーモノリス標準化 方式 説明と検討 DB製品のCDC DB製品ごとに機能として提供しているCDC。 SQL Databaseにも機能はあるが、Debeziumなどと連携が必要。 サードパーティーのCDC DebeziumなどのOSSが存在する。 やりたいことに対してtoo muchかつ、障害発生時の対応が難しい。 定期処理の自作 定期的にテーブルをくるくるしてService Busにメッセージを送信する機能を自作。 そこまで難しくなく、カスタマイズもしやすい。 ※CDC: Change Data Capture…DBの変更更新を検知する方式 REST Event Consumer TxOut Box Topic Event Consumer Event Consumer トランザクションアウトボックスは自作を採用 ① モジュールを疎結合に保つ仕組み ② モジュール間呼び出しIF ③ 非同期処理方式の用意 こちらを採用 Sub Sub
  59. 62 Copyright (C) Nomura Research Institute, Ltd. All rights reserved.

    本日お話したことのまとめ モジュラーモノリス標準化 今回のモジュラーモノリス標準化では下記を実施。 1. モジュールを疎結合に保つ仕組み • SpringModulith機能でパッケージ境界を規定 • ツールなどを用いて正しいテーブルを参照しているかチェック 2. モジュール間呼び出しIFの考慮 • モジュラーモノリスからサービス分割した際に、モジュール呼出からサービス呼出に切替 3. 非同期処理方式の用意 • イベント処理,コマンド処理の利用 • トランザクションアウトボックスパターンの利用 ⇒ これらのポイントを抑えることで、サービス分割を考慮したモジュラーモノリスを実現
  60. 64 Copyright (C) Nomura Research Institute, Ltd. All rights reserved.

    NRIではブログ発信や交流会開催もしてます! 最後に ◼NRIでは atlax blogs を通じて様々な情報を発信しております! 去年のJJUG CCC 2024 Fallの参加レポートなども公開させていただきました。 ◼また、定期的に Netadashi Meetup という交流会も実施しております。 直近の開催は未定ですが、開催時は是非気軽に足を運んでいただければと思います! JJUG CCC 2024 Fall で発表してきました! - atlax blogs Netadashi Meetup - connpass