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

決済システムの内製化への旅- SpringとTASで作るクラウドネイティブなシステム開発

決済システムの内製化への旅- SpringとTASで作るクラウドネイティブなシステム開発

Spring Fest 2018登壇資料をベースに一部追加したもの
(2021-11-02 Springフレームワーク徹底解説セミナー)

suzukij

June 21, 2022
Tweet

More Decks by suzukij

Other Decks in Programming

Transcript

  1. ソフトバンク携帯ユーザー向けの 「ソフトバンクカード」のカード発行・ 運営をしています。 ソフトバンクカードは、 Visa加盟店 で利用できるプリペイドカードです。 ご利用金額に応じて Tポイントが貯 まります。 カード発行業務

    決済代行 EC運営事業者さま向けにオンライン決済 事業を運営しています。豊富な決済手段 をまとめてご提供しています。 カード加盟店業務 Visa、Mastercard、UnionPay(銀聯)のメン バーシップライセンスを保有しており、各ブラ ンドのアクワイアラー(クレジットカード加盟 店契約会社)としての加盟店審査や管理事 業、端末決済サービスを提供しています。 ソフトバンクと共同で、ソフトバンク 携帯ユーザー向けの通話料合算 請求「ソフトバンクまとめて支払い」 の開発・運営をしています。 キャリア決済 EC/ネット店舗 実店舗/訪問販売 決済代行からカード事業まで幅広く展開 SBペイメントサービスの事業内容
  2. ソフトバンク携帯ユーザー向けの 「ソフトバンクカード」のカード発行・ 運営をしています。 ソフトバンクカードは、 Visa加盟店 で利用できるプリペイドカードです。 ご利用金額に応じて Tポイントが貯 まります。 カード発行業務

    決済代行 EC運営事業者さま向けにオンライン決済 事業を運営しています。豊富な決済手段 をまとめてご提供しています。 カード加盟店業務 Visa、Mastercard、UnionPay(銀聯)のメン バーシップライセンスを保有しており、各ブラ ンドのアクワイアラー(クレジットカード加盟 店契約会社)としての加盟店審査や管理事 業、端末決済サービスを提供しています。 ソフトバンクと共同で、ソフトバンク 携帯ユーザー向けの通話料合算 請求「ソフトバンクまとめて支払い」 の開発・運営をしています。 キャリア決済 EC/ネット店舗 実店舗/訪問販売 決済代行からカード事業まで幅広く展開 SBペイメントサービスの事業内容
  3. 2016年: システム運用の効率化を自分たちで Spring Boot Selenium / Selenide 課題 支援ツールを内製 導入したもの

    運用の手作業が多い 手作業ゆえのミス 運用作業を自動化 開発に必要な環境を整える 体制
  4. 2016年: システム運用の効率化を自分たちで 課題 導入したもの 運用の手作業が多い 手作業ゆえのミス Spring Boot Selenium /

    Selenide 支援ツールを内製 運用作業を自動化 体制 3名のエンジニアがJoin チームとして改善活動も加速
  5. 2017年: ②開発プロジェクトの支援を開始 課題 アーキテクチャをSpringベースに 導入したもの モダンな開発 / 運用  Spring Boot

     Spring Cloud 古いアーキテクチャ 開発/リリースが高コスト システム監視が困難 CIをきちんと回す支援 体制
  6. 2017年: ②開発プロジェクトの支援を開始 課題 導入したもの アーキテクチャをSpringベースに モダンな開発 / 運用  Spring Boot

     Spring Cloud 古いアーキテクチャ 開発/リリースが高コスト システム監視が困難 体制 さらに1名のエンジニアがJoin
  7. 加盟店 決済機関 通販サイト ゲーム 教育 不動産 その他 電子書籍/動画 決済サービス 全て一本化

    チケット ECサイト向けに様々な決済手段を提供 加盟店に決済APIを提供するシステム クレジット 携帯キャリア決済 コンビニ支払い プリペイドカード 口座振替 ポイント支払い アカウント連携決済 当社 当社 API型 開発対象 オンライン決済サービス
  8. 加盟店 決済機関 通販サイト ゲーム 教育 不動産 その他 電子書籍/動画 決済サービス 全て一本化

    チケット クレジット 携帯キャリア決済 コンビニ支払い プリペイドカード 口座振替 ポイント支払い アカウント連携決済 当社 当社 API型 導入実績 141,212 店舗 (2020年6月実績) ECサイト向けに様々な決済手段を提供 加盟店に決済APIを提供するシステム 開発対象 オンライン決済サービス 取扱高 4兆0,347億円 (2020年実績)
  9. 加盟店 決済機関 通販サイト ゲーム 教育 不動産 その他 電子書籍/動画 決済サービス 全て一本化

    チケット クレジット 携帯キャリア決済 コンビニ支払い プリペイドカード 口座振替 ポイント支払い アカウント連携決済 当社 当社 API型 決済手段 40 種以上に対応 ECサイト向けに様々な決済手段を提供 加盟店に決済APIを提供するシステム 開発対象 オンライン決済サービス
  10. 開発対象 オンライン決済サービス 加盟店 決済機関 通販サイト ゲーム 教育 不動産 その他 電子書籍/動画

    決済サービス 全て一本化 チケット クレジット 携帯キャリア決済 コンビニ支払い プリペイドカード 口座振替 ポイント支払い アカウント連携決済 当社 当社 加盟店システムと決済機関システムの間に位置す る自社だけでは完結しない Webシステム API型
  11. 2018年: 決済システムの内製へ 新システムに求めるモノ • スピード感のある開発/リリース • 継続的な改善のサイクル • 監視が容易で障害に強いシステム 今までは…

    案件毎に開発ベンダさんのチカラを借りて構築 (見積もり/要件定義から検収まで長い道のり) 開発ベンダに頼りきっていてはスピード感のある開 発、小さな改善のサイクルが作れない。
  12. 2018年: 決済システムの内製へ 新システムに求めるモノ • スピード感のある開発/リリース • 継続的な改善のサイクル • 監視が容易で障害に強いシステム 今までは…

    案件毎に開発ベンダさんのチカラを借りて構築 (見積もり/要件定義から検収) 内製化によるスピード感のある開発 内製化による継続的な改善
  13. 最終的に選んだのは… • Java/Spring アプリケーションとの親和性 • プラットフォームの導入/運用のサポート • cf push コマンドによるアプリリリース

    PaaS Tanzu Application Service Buildpack という仕組みでソースコードからコンテナイメージを作 成してくれる 開発者は Dockerfile を書く必要なし。 cf push と Buildpackにおまかせ。
  14. 開発プロジェクトのチーム体制と責任分界 Networking Storage Servers Virtualization O/S Middleware Runtime Data Application

    アプリケーション開発者 Dev 4名 プラットフォーム運用者 Ops 2名 Tanzu Application Service
  15. 開発プロジェクトのチーム体制と責任分界 Networking Storage Servers Virtualization O/S Middleware Runtime Data Application

    アプリケーション開発者 Dev 4名 プラットフォーム運用者 Ops 2名 プラットフォームの構築 / 管 理 に専念 Tanzu Application Service
  16. 開発プロジェクトのチーム体制と責任分界 Networking Storage Servers Virtualization O/S Middleware Runtime Data Application

    業務の設計 / 実装に集中 プラットフォーム運用者 Ops アプリケーション開発者 Dev 4名 Tanzu Application Service
  17. 開発プロジェクトのチーム体制と責任分界 Networking Storage Servers Virtualization O/S Middleware Runtime Data Application

    12 Factor App AppをPaaSに載せる制約は 12 Factor App のみ ベンダーロックインはなし プラットフォーム運用者 Ops 2名 アプリケーション開発者 Dev 4名 Tanzu Application Service
  18. 開発プロジェクトのチーム体制と責任分界 Networking Storage Servers Virtualization O/S Middleware Runtime Data Application

    プラットフォーム運用者 Ops 2名 アプリケーション開発者 Dev 4名 Tanzu Application Service 技術支援(週1)
  19. syslog+TLS Logstash Elasticsearch Kibana cf push Concourse Prometheus Grafana git

    push 全体のアーキテクチャ cf create-service cf bind-service Tanzu Application Service
  20. アプリケーション構成(同期 加盟店 ➡ 決済機関) API Gateway Service A Service B

    Service C 加盟店 X 加盟店 Y 加盟店 Z 決済機関 A 決済機関 B 決済機関 C Tanzu Application Service
  21. API Gateway Service A Service B Service C 加盟店 X

    加盟店 Y 加盟店 Z 決済機関 A 決済機関 B 決済機関 C オンラインショッピングサイト 通販サイト、ゲーム、電子書籍、 チケット、不動産、その他 アプリケーション構成(同期 加盟店 ➡ 決済機関)
  22. API Gateway Service A Service B Service C 加盟店 X

    加盟店 Y 加盟店 Z 決済機関 A 決済機関 B 決済機関 C 当社 決済システム アプリケーション構成(同期 加盟店 ➡ 決済機関) Tanzu Application Service
  23. API Gateway Service A Service B Service C 加盟店 X

    加盟店 Y 加盟店 Z 決済機関 A 決済機関 B 決済機関 C 決済機関システム クレジット、コンビニ支払い、キャリア決済、 プリペイドカード、その他 アプリケーション構成(同期 加盟店 ➡ 決済機関)
  24. API Gateway Service A Service B Service C 加盟店 X

    加盟店 Y 加盟店 Z 決済機関 A 決済機関 B 決済機関 C Appはマイクロサービスの構成です べてTAS上に配置 アプリケーション構成(同期 加盟店 ➡ 決済機関) Tanzu Application Service
  25. API Gateway Service A Service B Service C 加盟店 A

    加盟店 Y 加盟店 Z 決済機関 A 決済機関 B 決済機関 C すべてのAppは Java/Spring Boot で実装 アプリケーション構成(同期 加盟店 ➡ 決済機関) Tanzu Application Service
  26. API Gateway Service A Service B Service C 加盟店 X

    加盟店 Y 加盟店 Z 決済機関 A 決済機関 B 決済機関 C アプリケーション構成(同期 加盟店 ➡ 決済機関) Tanzu Application Service API Gateway 決済機関毎のビジネスロジックが実装さ れているServiceへルーティング
  27. API Gateway Service A Service B Service C 加盟店 X

    加盟店 Y 加盟店 Z 決済機関 A 決済機関 B 決済機関 C アプリケーション構成(同期 加盟店 ➡ 決済機関) Tanzu Application Service
  28. API Gateway Service A Service B Service C 加盟店 X

    加盟店 Y 加盟店 Z 決済機関 A 決済機関 B 決済機関 C 加盟店や決済機関は当然、コントロール範囲外 アプリケーション構成(同期 加盟店 ➡ 決済機関)
  29. API Gateway Service A Service B Service C 加盟店 A

    加盟店 Y 加盟店 Z 決済機関 A 決済機関 B 決済機関 C アプリケーション構成(同期 加盟店 ➡ 決済機関) Tanzu Application Service システム間通信には Resilience4j という Circuit Breakerを導入 Resilience4j Resilience4j Resilience4j Resilience4j
  30. API Gateway Service A Service B Service C 加盟店 X

    加盟店 Y 加盟店 Z 決済機関 A 決済機関 B 決済機関 C アプリケーション構成(同期 加盟店 ➡ 決済機関) Tanzu Application Service Circuit Breakerがない状態で 決済機関Aで障害が発生した場合…
  31. API Gateway Service A Service B Service C 加盟店 X

    加盟店 Y 加盟店 Z 決済機関 A 決済機関 B 決済機関 C アプリケーション構成(同期 加盟店 ➡ 決済機関) Tanzu Application Service レスポンス遅延、タイムアウト
  32. アプリケーション構成(同期 加盟店 ➡ 決済機関) API Gateway Service A Service B

    Service C 加盟店 X 加盟店 Y 加盟店 Z 決済機関 A 決済機関 B 決済機関 C Tanzu Application Service Service A に障害が伝播 処理のブロック、スレッド枯渇
  33. API Gateway Service A Service B Service C 加盟店 X

    加盟店 Y 加盟店 Z 決済機関 A 決済機関 B 決済機関 C アプリケーション構成(同期 加盟店 ➡ 決済機関) Tanzu Application Service API Gateway に障害が伝播 処理のブロック、スレッド枯渇
  34. API Gateway Service A Service B Service C 加盟店 X

    加盟店 Y 加盟店 Z 決済機関 A 決済機関 B 決済機関 C アプリケーション構成(同期 加盟店 ➡ 決済機関) Tanzu Application Service API Gateway に障害が伝播 処理のブロック、スレッド枯渇
  35. API Gateway Service A Service B Service C 加盟店 X

    加盟店 Y 加盟店 Z 決済機関 A 決済機関 B 決済機関 C 決済機関A起因の障害にも関わらず 関係のない決済機関BCへ影響が出てしまう アプリケーション構成(同期 加盟店 ➡ 決済機関) Tanzu Application Service
  36. API Gateway Service A Service B Service C 加盟店 X

    加盟店 Y 加盟店 Z 決済機関 A 決済機関 B 決済機関 C アプリケーション構成(同期 加盟店 ➡ 決済機関) Tanzu Application Service Circuit Breaker があれば 特定の決済機関で障害が発生しても Resilience4j Resilience4j Resilience4j Resilience4j
  37. API Gateway Service A Service B Service C 加盟店 X

    加盟店 Y 加盟店 Z 決済機関 A 決済機関 B 決済機関 C 障害の伝播を防いでくれるため 他の決済機関へ影響を及ぼす心配がない アプリケーション構成(同期 加盟店 ➡ 決済機関) Resilience4j Resilience4j Resilience4j Resilience4j
  38. API Gateway Service A Service B Service C 加盟店 X

    加盟店 Y 加盟店 Z 決済機関 A 決済機関 B 決済機関 C アプリケーション構成(同期 加盟店 ➡ 決済機関) Resilience4j Resilience4j Resilience4j Resilience4j Circuit Brakerにより耐障害性に優 れたアプリケーションを実現
  39. アプリケーション構成(非同期 決済機関 ➡ 加盟店) Notification Gateway Receiver A Receiver B

    Receiver C Hystrix Hystrix Hystrix Hystrix Tanzu Application Service 加盟店 A 加盟店 Y 加盟店 Z 決済機関 A 決済機関 B 決済機関 C
  40. アプリケーション構成(非同期 決済機関 ➡ 加盟店) Notification Gateway Receiver A Receiver B

    Receiver C Hystrix Hystrix Hystrix Hystrix Tanzu Application Service 加盟店 A 加盟店 Y 加盟店 Z 決済機関 A 決済機関 B 決済機関 C
  41. アプリケーション構成(非同期 決済機関 ➡ 加盟店) Notification Gateway Receiver A Receiver B

    Receiver C Hystrix Hystrix Hystrix Hystrix Tanzu Application Service 加盟店 A 加盟店 Y 加盟店 Z 決済機関 A 決済機関 B 決済機関 C
  42. アプリケーション構成(非同期 決済機関 ➡ 加盟店) Notification Gateway Receiver A Receiver B

    Receiver C Hystrix Hystrix Hystrix Hystrix Tanzu Application Service 加盟店 A 加盟店 Y 加盟店 Z 決済機関 A 決済機関 B 決済機関 C 非同期を実現するために RabbitMQ + Spring Cloud Stream を使用
  43. アプリケーション構成(非同期 決済機関 ➡ 加盟店) Notification Gateway Receiver A Receiver B

    Receiver C Hystrix Hystrix Hystrix Hystrix Tanzu Application Service 加盟店 A 加盟店 Y 加盟店 Z 決済機関 A 決済機関 B 決済機関 C
  44. アプリケーション構成(非同期 決済機関 ➡ 加盟店) Notification Gateway Receiver A Receiver B

    Receiver C Hystrix Hystrix Hystrix Hystrix Tanzu Application Service 加盟店 A 加盟店 Y 加盟店 Z 決済機関 A 決済機関 B 決済機関 C 特定の加盟店で障害が発生した場合
  45. アプリケーション構成(非同期 決済機関 ➡ 加盟店) Notification Gateway Receiver A Receiver B

    Receiver C Hystrix Hystrix Hystrix Hystrix Tanzu Application Service 加盟店 A 加盟店 Y 加盟店 Z 決済機関 A 決済機関 B 決済機関 C Dead Letter Queue と呼ばれるキューに 退避して、後に再送
  46. アプリケーション構成(非同期 決済機関 ➡ 加盟店) Notification Gateway Receiver A Receiver B

    Receiver C Hystrix Hystrix Hystrix Tanzu Application Service 加盟店 A 加盟店 Y 加盟店 Z 決済機関 A 決済機関 B 決済機関 C Circuit Breakerにより、他の加盟店に影響を 及ぼさない Hystrix
  47. パイプライン全体のジョブ構成 ジョブ設定は YAMLファイル で管理 Concourse - パイプライン画面 - task: mvn-test

    config: platform: linux image_resource: type: registry-image source: repository: maven tag: 3-jdk-11 inputs: - name: repo caches: - path: repo/m2 run: path: bash args: - -c - | set -e cd repo rm -rf ~/.m2 ln -fs $(pwd)/m2 ~/.m2 mvn test
  48. Platformの監視 • 全VMのメトリクス • 全コンテナのメトリクス • Cloud Foundryの各コンポーネントのメトリクス • ミドルウェアのメトリクス

    ◦ RabbitMQ / MySQL / Concourse / Elastic Stack Applicationの監視 • 全Spring Bootアプリ(Micrometer)のメトリクス Grafanaでの監視対象 Metrics 30種以上のダッシュボード
  49. サービス目線のモニタリング 決済数 取扱高 前日比・傾向 内訳 分類 xx,xxx xxx,xxx xx,xxx,xxx,xxx x,xxx,xxx,xxx

    アプリをリリースするだけで プラットフォームが自動で監視対象に Metrics Logging Tracing + Biz
  50. プラットフォーム導入の効果 Before After Release リリース作業 手作業 ワンクリック リリース品質 人為的なミスの可能性あり 自動化によりミスなし

    リリース時間 45分 5分 Observability ログ調査 ログファイルから調査 Kibanaダッシュボード サーバメトリクス調査 ログファイルから調査 Grafanaダッシュボード トレース調査 なし Zipkinダッシュボード Resilience 障害時の自動復旧 なし 自動再起動 スケールアウト 手作業 管理画面から数クリック
  51. アーキテクチャのアップデート サービス開始時 3年経った現在 PaaS Platform Java Java 8 Java 11

    Spring Boot v2.1.2 v2.5.4 Spring Cloud Greenwich. RELEASE 2020.0.3 ライブラリ Http Client RestTemplate WebClient ライブラリ CircuitBreaker Hystrix Resilience4J
  52. サービスの広がり サービス開始時 3年経った現在 システム数 1システム 4システム ⤴ App数 12アプリケーション 36アプリケーション

    ⤴ Appインスタンス数 45インスタンス 80インスタンス ⤴ プラットフォーム運用者数 2名 3名 ➝ アプリケーション開発者数 4名 15名(開発ベンダ2社 6名含む) ⤴ このシステムの障害件数 - 0件
  53. ここまでの歩み • 開発チームの立ち上げ • 運用業務の改善活動 • PCFを中心としたプラットフォームの導入 / 構築 •

    決済システム内製 ◦ 耐障害性に優れたシステム ◦ 監視の容易なシステム ◦ 継続的なビルド/リリース が可能なシステム
  54. SpringFest 2020 登壇資料 CloudNativeな決済サービスの開発と 2年間の歩み https://www.slideshare.net/JunyaSuzuki1/cloudnative2-sfa4 関連資料 Pivotal.IO 2019 登壇資料

    決済システム内製化に向けた プラットフォーム構築 PCF・BOSHによるオブザーバブルプラットフォーム https://www.slideshare.net/DaichiKimura3/pcfbosh-156082821 アプリケーション開発チーム プラットフォームチーム