Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

CloudNativeな決済サービスの開発と2年間の歩み #sf_A4

3,272 views

Published on

Spring Fest 2020 CloudNativeな決済サービスの開発と2年間の歩み

SBペイメントサービスではSpringとTanzu Application Serviceを使用して、決済システムを運用、開発しております。
以前SpringFest2018で登壇した際は、プロダクション環境で稼働するまでのストーリーをご紹介しましたが、今回はその後の運用や開発についてお伝えしたいと思っています。
本セッションでは導入の背景や、Spring Boot/Cloudを利用したアーキテクチャの説明、CI/CDやロギング・モニタリング、高レジリエンスへの取り組み内容を改めてご紹介します。 またプラットフォームの導入が開発や運用にどのような効果をもたらしたのか、プロダクションでの運用を安定化させるために行ってきた施策や、運用/開発する中で発生した事象とその対処についてもご紹介する予定です。
#jsug #sf_A4

Published in: Technology
  • Be the first to comment

CloudNativeな決済サービスの開発と2年間の歩み #sf_A4

  1. 1. な決済サービスの 開発と 年間の歩み
  2. 2. ペイメントサービス株式会社 シニアアーキテクト 鈴木順也 自己紹介 主な業務 ・新規サービスの開発 ・運用の効率化 改善 システムの開発に従事 元々は のプログラマ フリーランスを経て 年前に現在の会社に転職
  3. 3. ソフトバンク携帯ユーザー向けの 「ソフトバンクカード」のカード発行・ 運営をしています。 ソフトバンクカードは、 Visa加盟店 で利用できるプリペイドカード機能 を有しております。 ご利用金額に応じて Tポイントが貯 まります。 カード発行業務 決済代行 EC運営事業者さま向けにオンライン決済 事業を運営しています。豊富な決済手段 をまとめてご提供しています。 カード加盟店業務 Visa、Mastercard、UnionPay(銀聯)のメン バーシップライセンスを保有しており、各ブラ ンドのアクワイアラー(クレジットカード加盟 店契約会社)としての加盟店審査や管理事 業、端末決済サービスを提供しています。 ソフトバンクと共同で、ソフトバンク 携帯ユーザー向けの通話料合算 請求「ソフトバンクまとめて支払い」 の開発・運営をしています。 キャリア決済 EC/ネット店舗 実店舗/訪問販売 決済代行からカード事業まで幅広く展開 ペイメントサービスの事業内容
  4. 4. ソフトバンク携帯ユーザー向けの 「ソフトバンクカード」のカード発行・ 運営をしています。 ソフトバンクカードは、 Visa加盟店 で利用できるプリペイドカード機能 を有しております。 ご利用金額に応じて Tポイントが貯 まります。 カード発行業務 決済代行 EC運営事業者さま向けにオンライン決済 事業を運営しています。豊富な決済手段 をまとめてご提供しています。 カード加盟店業務 Visa、Mastercard、UnionPay(銀聯)のメン バーシップライセンスを保有しており、各ブラ ンドのアクワイアラー(クレジットカード加盟 店契約会社)としての加盟店審査や管理事 業、端末決済サービスを提供しています。 ソフトバンクと共同で、ソフトバンク 携帯ユーザー向けの通話料合算 請求「ソフトバンクまとめて支払い」 の開発・運営をしています。 キャリア決済 EC/ネット店舗 実店舗/訪問販売 決済代行からカード事業まで幅広く展開 ペイメントサービスの事業内容
  5. 5. 今日お話すること ● 決済サービス システム概要 ● 安定した開発 運用を支える取り組み ○ プラットフォーム 全体のアーキテクチャ ○ アーキテクチャ ○ パイプライン ○ ● これまでの歩み
  6. 6. SpringFest 2018 登壇資料 決済システムの内製化への旅 SpringとPCFで作るクラウドネイティブなシステム開発 https://www.slideshare.net/makingx/springpcf-jsug-sfh1 関連資料 Pivotal.IO 2019 登壇資料 決済システム内製化に向けた プラットフォーム構築 PCF・BOSHによるオブザーバブルプラットフォーム https://www.slideshare.net/DaichiKimura3/pcfbosh-156082821 アプリケーション開発チーム プラットフォームチーム
  7. 7. 今日お話すること ● 決済サービス システム概要
  8. 8. 加盟店 決済機関 通販サイト ゲーム 教育 不動産 その他 電子書籍/動画 チケット ECサイト向けに様々な決済手段を提供 加盟店に決済APIを提供するシステム クレジット 携帯キャリア決済 コンビニ支払い プリペイドカード 口座振替 ポイント支払い アカウント連携決済 システム概要 オンライン決済サービス 決済サービス 全て一本化 当社当社 API型
  9. 9. 決済サービス 全て一本化 当社当社 API型 加盟店 決済機関 通販サイト ゲーム 教育 不動産 その他 電子書籍/動画 チケット ECサイト向けに様々な決済手段を提供 加盟店に決済画面や決済 APIを提供するシステム クレジット 携帯キャリア決済 コンビニ支払い プリペイドカード 口座振替 ポイント支払い アカウント連携決済 システム概要 オンライン決済サービス 多彩な決済手段を一括で導入可能 加盟店の手続きコスト、開発コストを削減
  10. 10. 決済サービス 全て一本化 当社当社 API型 加盟店 決済機関 通販サイト ゲーム 教育 不動産 その他 電子書籍/動画 チケット ECサイト向けに様々な決済手段を提供 加盟店に決済APIを提供するシステム クレジット 携帯キャリア決済 コンビニ支払い プリペイドカード 口座振替 ポイント支払い アカウント連携決済 導入実績 約 120,000 店舗 (2019年12月実績) システム概要 オンライン決済サービス
  11. 11. 加盟店 決済機関 通販サイト ゲーム 教育 不動産 その他 電子書籍/動画 チケット ECサイト向けに様々な決済手段を提供 加盟店に決済APIを提供するシステム クレジット 携帯キャリア決済 コンビニ支払い プリペイドカード 口座振替 ポイント支払い アカウント連携決済 当社 システム概要 オンライン決済サービス 決済サービス 全て一本化 当社当社 API型 決済手段 40 種以上に対応
  12. 12. 加盟店 決済機関 通販サイト ゲーム 教育 不動産 その他 電子書籍/動画 チケット ECサイト向けに様々な決済手段を提供 加盟店に決済APIを提供するシステム クレジット 携帯キャリア決済 コンビニ支払い プリペイドカード 口座振替 ポイント支払い アカウント連携決済 取扱高 3兆5,361 億円 (2019年実績) システム概要 オンライン決済サービス 決済サービス 全て一本化 当社当社 API型
  13. 13. 加盟店 決済機関 通販サイト ゲーム 教育 不動産 その他 電子書籍/動画 決済サービス 全て一本化 チケット ECサイト向けに様々な決済手段を提供 加盟店に決済APIを提供するシステム クレジット 携帯キャリア決済 コンビニ支払い プリペイドカード 口座振替 ポイント支払い アカウント連携決済 当社当社 API型 加盟店と決済機関の間に位置する 自社だけでは完結しない Webシステム システム概要 オンライン決済サービス
  14. 14. ● 安定した開発 運用を支える取り組み ➢ プラットフォーム 全体のアーキテクチャ ➢ アーキテクチャ ➢ パイプライン ➢
  15. 15. syslog+TLS Logstash Elasticsearch Kibana cf push Concourse PrometheusGrafana git push 全体のアーキテクチャ cf create-service cf bind-service Tanzu Application Service
  16. 16. 決済システムの内製化への旅 と で作るクラウドネイティブなシステム開発 ● 安定した開発 運用を支える取り組み ➢ プラットフォーム 全体のアーキテクチャ ➢ アーキテクチャ ➢ パイプライン ➢
  17. 17. アプリケーション構成(同期 加盟店 ➡ 決済機関) API Gateway Service A Service B Service C 加盟店 X 加盟店 Y 加盟店 Z 決済機関 A 決済機関 B 決済機関 C Tanzu Application Service
  18. 18. API Gateway Service A Service B Service C 加盟店 X 加盟店 Y 加盟店 Z 決済機関 A 決済機関 B 決済機関 C オンラインショッピングサイト 通販サイト、ゲーム、電子書籍、 チケット、不動産、その他 アプリケーション構成(同期 加盟店 ➡ 決済機関)
  19. 19. API Gateway Service A Service B Service C 加盟店 X 加盟店 Y 加盟店 Z 決済機関 A 決済機関 B 決済機関 C 当社 決済システム アプリケーション構成(同期 加盟店 ➡ 決済機関) Tanzu Application Service
  20. 20. API Gateway Service A Service B Service C 加盟店 X 加盟店 Y 加盟店 Z 決済機関 A 決済機関 B 決済機関 C 決済機関システム クレジット、コンビニ支払い、キャリア決済、 プリペイドカード、その他 アプリケーション構成(同期 加盟店 ➡ 決済機関)
  21. 21. API Gateway Service A Service B Service C 加盟店 X 加盟店 Y 加盟店 Z 決済機関 A 決済機関 B 決済機関 C Appはマイクロサービスの構成です べてTAS上に配置 アプリケーション構成(同期 加盟店 ➡ 決済機関) Tanzu Application Service
  22. 22. API Gateway Service A Service B Service C 加盟店 A 加盟店 Y 加盟店 Z 決済機関 A 決済機関 B 決済機関 C すべてのAppは Java/Spring Boot で実装 アプリケーション構成(同期 加盟店 ➡ 決済機関) Tanzu Application Service
  23. 23. API Gateway Service A Service B Service C 加盟店 X 加盟店 Y 加盟店 Z 決済機関 A 決済機関 B 決済機関 C アプリケーション構成(同期 加盟店 ➡ 決済機関) Tanzu Application Service 決済機関毎のビジネスロジックが実装さ れている へルーティング
  24. 24. API Gateway Service A Service B Service C 加盟店 X 加盟店 Y 加盟店 Z 決済機関 A 決済機関 B 決済機関 C アプリケーション構成(同期 加盟店 ➡ 決済機関) Tanzu Application Service
  25. 25. API Gateway Service A Service B Service C 加盟店 X 加盟店 Y 加盟店 Z 決済機関 A 決済機関 B 決済機関 C 加盟店や決済機関は当然、コントロール範囲外 アプリケーション構成(同期 加盟店 ➡ 決済機関)
  26. 26. Hystrix API Gateway Service A Service B Service C 加盟店 A 加盟店 Y 加盟店 Z 決済機関 A 決済機関 B 決済機関 C Hystrix Hystrix Hystrix アプリケーション構成(同期 加盟店 ➡ 決済機関) Tanzu Application Service システム間通信には Hystrix という Circuit Breakerを導入
  27. 27. API Gateway Service A Service B Service C 加盟店 X 加盟店 Y 加盟店 Z 決済機関 A 決済機関 B 決済機関 C アプリケーション構成(同期 加盟店 ➡ 決済機関) Tanzu Application Service Circuit Breakerがない状態で 決済機関Aで障害が発生した場合…
  28. 28. API Gateway Service A Service B Service C 加盟店 X 加盟店 Y 加盟店 Z 決済機関 A 決済機関 B 決済機関 C アプリケーション構成(同期 加盟店 ➡ 決済機関) Tanzu Application Service レスポンス遅延、タイムアウト
  29. 29. アプリケーション構成(同期 加盟店 ➡ 決済機関) API Gateway Service A Service B Service C 加盟店 X 加盟店 Y 加盟店 Z 決済機関 A 決済機関 B 決済機関 C Tanzu Application Service Service A に障害が伝播 処理のブロック、スレッド枯渇
  30. 30. API Gateway Service A Service B Service C 加盟店 X 加盟店 Y 加盟店 Z 決済機関 A 決済機関 B 決済機関 C アプリケーション構成(同期 加盟店 ➡ 決済機関) Tanzu Application ServiceAPI Gateway に障害が伝播 処理のブロック、スレッド枯渇
  31. 31. API Gateway Service A Service B Service C 加盟店 X 加盟店 Y 加盟店 Z 決済機関 A 決済機関 B 決済機関 C アプリケーション構成(同期 加盟店 ➡ 決済機関) Tanzu Application ServiceAPI Gateway に障害が伝播 処理のブロック、スレッド枯渇
  32. 32. API Gateway Service A Service B Service C 加盟店 X 加盟店 Y 加盟店 Z 決済機関 A 決済機関 B 決済機関 C 決済機関A起因の障害にも関わらず 関係のない決済機関BCへ影響が出てしまう アプリケーション構成(同期 加盟店 ➡ 決済機関) Tanzu Application Service
  33. 33. API Gateway Service A Service B Service C 加盟店 X 加盟店 Y 加盟店 Z 決済機関 A 決済機関 B 決済機関 C Hystrix Hystrix Hystrix Hystrix アプリケーション構成(同期 加盟店 ➡ 決済機関) Tanzu Application Service Circuit Breaker があれば 特定の決済機関で障害が発生しても
  34. 34. API Gateway Service A Service B Service C 加盟店 X 加盟店 Y 加盟店 Z 決済機関 A 決済機関 B 決済機関 C Hystrix Hystrix Hystrix 障害の伝播を防いでくれるため 他の決済機関へ影響を及ぼす心配がない アプリケーション構成(同期 加盟店 ➡ 決済機関)
  35. 35. API Gateway Service A Service B Service C 加盟店 X 加盟店 Y 加盟店 Z 決済機関 A 決済機関 B 決済機関 C Hystrix Hystrix Hystrix Circuit Brakerにより耐障害性に優 れたアプリケーションを実現 アプリケーション構成(同期 加盟店 ➡ 決済機関) Tanzu Application Service
  36. 36. アプリケーション構成(非同期 決済機関 ➡ 加盟店) Notification Gateway Receiver A Receiver B Receiver C Hystrix Hystrix Hystrix Hystrix Tanzu Application Service 加盟店 A 加盟店 Y 加盟店 Z 決済機関 A 決済機関 B 決済機関 C
  37. 37. アプリケーション構成(非同期 決済機関 ➡ 加盟店) Notification Gateway Receiver A Receiver B Receiver C Hystrix Hystrix Hystrix Hystrix Tanzu Application Service 加盟店 A 加盟店 Y 加盟店 Z 決済機関 A 決済機関 B 決済機関 C
  38. 38. アプリケーション構成(非同期 決済機関 ➡ 加盟店) Notification Gateway Receiver A Receiver B Receiver C Hystrix Hystrix Hystrix Hystrix Tanzu Application Service 加盟店 A 加盟店 Y 加盟店 Z 決済機関 A 決済機関 B 決済機関 C
  39. 39. アプリケーション構成(非同期 決済機関 ➡ 加盟店) 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 を使用
  40. 40. アプリケーション構成(非同期 決済機関 ➡ 加盟店) Notification Gateway Receiver A Receiver B Receiver C Hystrix Hystrix Hystrix Hystrix Tanzu Application Service 加盟店 A 加盟店 Y 加盟店 Z 決済機関 A 決済機関 B 決済機関 C
  41. 41. アプリケーション構成(非同期 決済機関 ➡ 加盟店) Notification Gateway Receiver A Receiver B Receiver C Hystrix Hystrix Hystrix Hystrix Tanzu Application Service 加盟店 A 加盟店 Y 加盟店 Z 決済機関 A 決済機関 B 決済機関 C 特定の加盟店で障害が発生した場合
  42. 42. アプリケーション構成(非同期 決済機関 ➡ 加盟店) Notification Gateway Receiver A Receiver B Receiver C Hystrix Hystrix Hystrix Hystrix Tanzu Application Service 加盟店 A 加盟店 Y 加盟店 Z 決済機関 A 決済機関 B 決済機関 C Dead Letter Queue と呼ばれるキューに 退避して、後に再送
  43. 43. アプリケーション構成(非同期 決済機関 ➡ 加盟店) Notification Gateway Receiver A Receiver B Receiver C Hystrix Hystrix Hystrix Tanzu Application Service 加盟店 A 加盟店 Y 加盟店 Z 決済機関 A 決済機関 B 決済機関 C Circuit Breakerにより、他の加盟店に影響を 及ぼさない Hystrix
  44. 44. アプリケーション構成(非同期 決済機関 ➡ 加盟店) Notification Gateway Receiver A Receiver B Receiver C Hystrix Hystrix Hystrix Tanzu Application Service 加盟店 A 加盟店 Y 加盟店 Z 決済機関 A 決済機関 B 決済機関 C Hystrix 2年間の運用後 年に数回DLQ行きが発生 対象メッセージのケース毎に何をしなければいけないか 運用を固めていなかったため対応が煩雑に。 頻度が低いとはいえ再送の自動化対応等を事前にして おけばよかったと反省…
  45. 45. アプリケーション構成(非同期 決済機関 ➡ 加盟店) Notification Gateway Receiver A Receiver B Receiver C Hystrix Hystrix Hystrix Tanzu Application Service 加盟店 A 加盟店 Y 加盟店 Z 決済機関 A 決済機関 B 決済機関 C Hystrix RabbitMQの運用は初だったが2年間トラブルゼロ ノードダウンやメッセージパブリッシュの停止等は全く発生せず安定して 稼働している。 2年間の運用後
  46. 46. ライブラリの移行について
  47. 47. 2018/11から maintenance mode Resilience4JHystrix ● CircuitBreaker ● Bulkhead ● RateLimiter
  48. 48. API Gateway Service A Service B Service C 加盟店 A 加盟店 Y 加盟店 Z 決済機関 A 決済機関 B 決済機関 C Tanzu Application Service CircuitBreaker 決済機関のシステムエラー率が100%の 状態で2分継続したらサーキットオープン
  49. 49. API Gateway Service A Service B Service C 加盟店 A 加盟店 Y 加盟店 Z 決済機関 A 決済機関 B 決済機関 C Tanzu Application Service
  50. 50. API Gateway Service A Service B Service C 加盟店 A 加盟店 Y 加盟店 Z 決済機関 A 決済機関 B 決済機関 C Tanzu Application Service エラーしきい値がデフォルト50%だが弊社 は100%に設定
  51. 51. どうしてエラー率50%でサーキットオープンではダメなのか? ※サーキットオープンになりにくい設定 たとえば以下のエラー率が60%の状態の場合 ◆決済完了 ◆決済機関システムエラー 決済機関障害発生
  52. 52. どうしてエラー率50%でサーキットオープンではダメなのか? ※サーキットオープンになりにくい設定 たとえば以下のエラー率が60%の状態の場合 ◆決済完了 ◆決済機関システムエラー  ◆サーキットオープンによるトランザクションエラー 決済機関障害発生 サーキットオープン サーキットオープンによる 機会損失が発生
  53. 53. 決済サービスでは1件でも正常に取引されているトランザクションがある限りサーキッ トオープンにはしたくない ◆決済完了 ◆決済機関システムエラー 決済機関障害発生
  54. 54. 決済サービスでは1件でも正常に取引されているトランザクションがある場合はサー キットオープンしたくないとはいえ最悪の状態(100%システムエラー、レスポンスタイムアウト)では当社へ の障害の伝播を防ぎたい 決済機関障害発生 ◆決済完了 ◆決済機関システムエラー  タイムアウトやレスポンス遅延に よる障害伝播の恐れ
  55. 55. 決済サービスでは1件でも正常に取引されているトランザクションがある場合はサー キットオープンしたくないとはいえ最悪の状態(100%システムエラー、レスポンスタイムアウト)では当社へ の障害の伝播を防ぎたい ◆決済完了 ◆決済機関システムエラー  ◆サーキットオープンによるトランザクションエラー 決済機関障害発生 サーキットオープンにより即エラーを 返すことで障害伝播を防ぐ
  56. 56. API Gateway Service A Service B Service C 加盟店 A 加盟店 Y 加盟店 Z 決済機関 A 決済機関 B 決済機関 C Tanzu Application Service Bulkhead(並列処理数の制限) 同時接続数が設定値を超過したらリジェクト
  57. 57. API Gateway Service A Service B Service C 加盟店 A 加盟店 Y 加盟店 Z 決済機関 A 決済機関 B 決済機関 C Tanzu Application Service Bulkhead 同時接続数が設定値を超過したらリジェクト
  58. 58. Tanzu Application Service Service A 決済機関 A 1 2 3 4 5
  59. 59. Tanzu Application Service Service A 決済機関 A 1 2 3 4 5 ウチのシステムは負荷に弱いので 同時接続数 5 でお願いします
  60. 60. Tanzu Application Service Service A 決済機関 A Bulkhead Bulkheadの並列実行数に5を設定した場合、 決済機関Aへの同時接続数 5本が上限となる 同時接続数が5以上はリジェクトとして扱われる 1 2 3 4 5
  61. 61. Tanzu Application Service Service A 決済機関 A 1 2 3 4 5 Bulkheadの設定を導入し 決済機関に限界以上の負荷を与えないように
  62. 62. 追加開発の新規アプリケーションから WebClientで実装、リリース済 RestTemplateのJavadoc 「メンテナンスモードのためWebClientの使 用を検討してください」 ※RestTemplateはまだ非推奨とはなっていない
  63. 63. 移行で発生した問題1 ● 接続タイムアウト、Read/Writeタイムアウトの設定 ○ reactor-nettyのTcpClientにそれぞれタイムアウトを設定
  64. 64. 移行で発生した問題2 ● レスポンスのサイズが256KBを超過すると例外が発生 ○ codecsのmaxInMemorySizeを設定 org.springframework.core.io.buffer.DataBufferLimitException: Exceeded limit on max bytes to buffer
  65. 65. 移行で発生した問題3 ● ファイルディスクリプタのリークが発生 ○ Spring Boot v2.2.8 / v2.3.1の問題(Reactor Netty v0.9.8の不具合) ⇒ Spring Bootのv2.2.9 / v2.3.2のアップデートで解消 https://github.com/spring-projects/spring-boot/issues/21923 Caused by: io.netty.channel.ChannelException: io.netty.channel.unix.Errors$NativeIoException: newSocketStream(..) failed: Too many open files 2.3.2 2.3.1
  66. 66. WebFluxは一切使用しておらずWebClientはブロッキングして使 用しているものの RestTemplate と同等のパフォーマンスが出て いることが確認できたため移行した。 2020/8から現在まで本番環境で稼働しているが 問題は一切発生していない状態。 Spring MVCを使っている場合、並行リクエストが多用されていな いのであれば移行の恩恵はあまりないためRestTemplateが非推 奨にならない限りは急ぐ必要はない印象。
  67. 67. 開発体制 API Gateway Service A Service B 加盟店 X 加盟店 Y 加盟店 Z 決済機関 A 決済機関 B Tanzu Application Service 新規機能は方式検討から 実装、テストまで内製
  68. 68. 開発体制 API Gateway Service A Service B 加盟店 X 加盟店 Y 加盟店 Z 決済機関 A 決済機関 B Tanzu Application Service Service C 決済機関 C
  69. 69. 開発体制 API Gateway Service A Service B 加盟店 X 加盟店 Y 加盟店 Z 決済機関 A 決済機関 B Tanzu Application Service Service C 決済機関 C 似た機能の展開は 外部ベンダさんに依頼
  70. 70. 開発体制 API Gateway Service A Service B 加盟店 X 加盟店 Y 加盟店 Z 決済機関 A 決済機関 B Tanzu Application Service Service C 決済機関 C 似た機能の展開は 外部ベンダさんに依頼 Service D 決済機関 D
  71. 71. 開発体制 API Gateway Service A Service B 加盟店 X 加盟店 Y 加盟店 Z 決済機関 A 決済機関 B Tanzu Application Service Service C 決済機関 C Service D 決済機関 D 外部ベンダさんの協力を得ながらサービスを横展開す ることができた。 自分達は新規技術や新方式を採用したアプリケーショ ンの検証/開発に注力することができた。
  72. 72. 決済システムの内製化への旅 と で作るクラウドネイティブなシステム開発 ● 安定した開発 運用を支える取り組み ➢ プラットフォーム 全体のアーキテクチャ ➢ アーキテクチャ ➢ パイプライン ➢
  73. 73. パイプライン Concourse https://concourse-ci.org/
  74. 74. https://concourse-ci.org/ Concourse パイプライン
  75. 75. ジョブ一覧画面
  76. 76. パイプライン画面
  77. 77. パイプライン全体のジョブ構成 ジョブ設定は YAMLファイル で管理 パイプライン画面 - 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
  78. 78. リポジトリの更新がトリガ パイプライン画面
  79. 79. パイプライン画面
  80. 80. パイプライン画面
  81. 81. 開発から本番リリースまでのパイプライン テスト環境 開発環境 本番環境
  82. 82. 開発から本番リリースまでのパイプライン テスト環境 開発環境 本番環境 各種ブランチへの更新がトリガ
  83. 83. 開発から本番リリースまでのパイプライン テスト環境 開発環境 本番環境 Javaの各種バージョンでテスト アップデートの弊害を早めに検知
  84. 84. 開発から本番リリースまでのパイプライン テスト環境 開発環境 本番環境 SonarQubeによるコード解析 コードの品質をいつでも確認できるようにしておく
  85. 85. 開発から本番リリースまでのパイプライン 開発環境 本番環境 テスト環境
  86. 86. 開発から本番リリースまでのパイプライン 開発環境 本番環境 テスト環境
  87. 87. 開発から本番リリースまでのパイプライン 開発環境 本番環境 テスト環境 CIによる開発サイクル
  88. 88. 開発から本番リリースまでのパイプライン 開発環境 本番環境 テスト環境 masterブランチへのマージで Nexus RELEASEリポジトリへデプロイ 本番環境リリースへの準備が完了
  89. 89. 開発から本番リリースまでのパイプライン 本番環境 ワンクリックリリースによるCD Nexusのリリースリポジトリの成果物が本番環境に適用される Blue-Green Deployによってサービスへの影響なくリリースが可能
  90. 90. 開発から本番リリースまでのパイプライン 本番環境 トラブル時の切り戻しの際も数クリックのみの対応 ※幸いにも まだやったことないです
  91. 91. 開発から本番リリースまでのパイプライン 本番環境 リリースや切り戻し手順がシンプルなため テレワークで自宅からもリリースが可能
  92. 92. によるパフォーマンステスト API Gateway Service A Service B Service C 決済機関 B Mock 決済機関 A Mock 決済機関 C Mock Tanzu Application Service
  93. 93. ● ● によるパフォーマンステスト
  94. 94. 想定の 倍のスループットを目標 問題 原因 スレッドプールが枯渇 スレッドプール数の設定ミス HTTP送信時にスループットが上がらない の のプール数の設定漏れ の実行時のスループットが上がらない コネクションプールの設定ミス Circuit Breakerの想定外のサーキットオープン のチューニングミス のメッセージキューイングが停止 のメモリ枯渇(スケールアップ対応) の のスループットが上がらない のワーカースレッド数が不足 アプリケーション全体の負荷限界 アプリケーションインスタンス数の不足 ※ というか のおかげで のチューニングは不要だった  (いつも必ず対応するやつ)
  95. 95. 週間 時間
  96. 96. 開発期間中にはJMeterによるロードテストとE2Eテストを毎日自動で実行 し、結果のスクリーンショットをSlackで通知 Report html cf push
  97. 97. パフォーマンステストは開発期間中に何度も繰り 返し実行して改善を続けることが大事
  98. 98. 決済システムの内製化への旅 と で作るクラウドネイティブなシステム開発 ● 安定した開発 運用を支える取り組み ➢ プラットフォーム 全体のアーキテクチャ ➢ アーキテクチャ ➢ パイプライン ➢
  99. 99. ※Metrics, tracing, and logging  https://peter.bourgon.org/blog/2017/02/21/metrics-tracing-and-logging.html
  100. 100. ※Metrics, tracing, and logging  https://peter.bourgon.org/blog/2017/02/21/metrics-tracing-and-logging.html
  101. 101. ※Metrics, tracing, and logging  https://peter.bourgon.org/blog/2017/02/21/metrics-tracing-and-logging.html
  102. 102. ※Metrics, tracing, and logging  https://peter.bourgon.org/blog/2017/02/21/metrics-tracing-and-logging.html
  103. 103. の監視 ● 全 のメトリクス ● 全コンテナのメトリクス ● の各コンポーネントのメトリクス ● ミドルウェアのメトリクス ○ の監視 ● 全 アプリ のメトリクス での監視対象 30種以上のダッシュボード
  104. 104. Micrometer <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-registry-prometheus</artifactId> </dependency>
  105. 105. 開発者はPrometheusの設定を意識することは なくリリースしたら自動でアプリケーションを監視 する仕組み 今までログから可視化していた情報が Grafanaでいつでも確認可能に ・CPU ・ヒープ(各領域ごと) ・スレッド ・GC(回数、時間) ・クラスローダ ・DBコネクションプール
  106. 106. (アクセスログ)
  107. 107. アクセスログ一覧 レスポンスタイム Percentile アプリ別 アクセス数 ステータスコード別 アクセス数 レスポンスタイム AVG (アクセスログ)
  108. 108. (アプリケーションログ)
  109. 109. ログレベル別 ログ出力数 アプリケーションログ一覧 アプリ別 ログ出力数 (アプリケーションログ)
  110. 110. 開発者は Elastic Stack を意識せず、標準出力にログを出力 するだけで良い。 (アプリケーションログ)
  111. 111. ( ロギングの活用) ( )で アプリケーションログのフォーマットを統一 構造化 は で管理しやすいログの定義 仕様のこと アプリの場合、依存を追加するだけでアプリケーション ログをいい感じに構造化した フォーマットのログにしてくれ る。 あとはそのままログを に突っ込むだけ。 ※ECS Logging Java Reference  https://www.elastic.co/guide/en/ecs-logging/java/current/index.html
  112. 112. ( ロギングの活用) ( )で アプリケーションログのフォーマットを統一 構造化 は で管理しやすいログの定義 仕様のこと アプリの場合、依存を追加するだけでアプリケーション ログをいい感じに構造化された フォーマットのログにしてくれ る。 あとはそのままログを に突っ込むだけ。 ※ECS Logging Java Reference  https://www.elastic.co/guide/en/ecs-logging/java/current/index.html ecs-logging-java <dependency> <groupId>co.elastic.logging</groupId> <artifactId>log4j2-ecs-layout</artifactId> <version>${ecs-logging-java.version}</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> </dependency>
  113. 113. ( ロギングの活用) ecs-logging-java <dependency> <groupId>co.elastic.logging</groupId> <artifactId>log4j2-ecs-layout</artifactId> <version>${ecs-logging-java.version}</version> </dependency> ※実装がLogback, Log4j2, Log4j, JUL, JBoss Log Manager から選択できるがLog4j2だと構造化ロギングに対 応してるので良さそう。
  114. 114. ( ロギングの活用) 例外情報もきちんと構造化 タイムスタンプ ホスト名 ログレベル ログメッセージ スレッド名 例外クラス 例外メッセージ スタックトレース
  115. 115. ( ロギングの活用)
  116. 116. ログレベル別 ログ出力数 ログレベル別 ( ロギングの活用) アプリケーション別 ログ出力数 アプリケーション別
  117. 117. ( ロギングの活用) Exceptionクラス別 ログ出力数 Exceptionクラス別 開発中のDB failoverテスト
  118. 118. ( ロギングの活用) WARNレベル/ERRORレベルのロ グ出力数が増加 一時的に例外が発生 その後、自動的に復旧 その後、例外の発生なし 開発中のDB failoverテスト
  119. 119. ( ロギングの活用)
  120. 120. ( ロギングの活用) 決済結果別 HTTPステータス別 決済手段別 加盟店別 ユーザエージェント別 API別リモートIP別 処理時間エラーコード別
  121. 121. ( ロギングの活用) リッチなダッシュボードを実現 求めるダッシュボードから逆算してロギン グ設計をする
  122. 122. Spring Cloud Sleuthによって アプリログに出力される トレースIDで検索可能
  123. 123. 複数のサーバにまたがる処理でも、 どこの通信やSQLに時間がかかっていたか一目でわ かる
  124. 124. Zipkin, Spring Cloud Sleuth <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zipkin</artifactId> </dependency> ※Spring Boot v2.4.0以降は spring-cloud-sleuth-zipkin spring.sleuth.sampler.probability: 1.0
  125. 125. Zipkin, Spring Cloud Sleuth <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zipkin</artifactId> </dependency> ※Spring Boot v2.4.0以降は spring-cloud-sleuth-zipkin spring.sleuth.sampler.probability: 1.0 Zipkinにトレースを送信する割合 本番環境でも 1.0 (100%) を指定している
  126. 126. Zipkinのデータストアに Elasticsearchを指定してKibanaで 独自ダッシュボードを作成
  127. 127. 処理時間がかかっているリクエストを特定
  128. 128. 特定したリクエストのトレースIDをクリックすると Zipkinへジャンプ
  129. 129. APIGateway ServiceA 決 済 機 関 内 部 シ ス テ ム
  130. 130. APIGateway ServiceA 決 済 機 関 内 部 シ ス テ ム 内部システムがAPI-Gatewayを呼び出して応 答されるまでの時間が長い(6.98秒)
  131. 131. APIGateway ServiceA 決 済 機 関 内 部 シ ス テ ム API-GatewayがServiceAを呼び出して応答さ れるまでの時間が長い(6.56秒)
  132. 132. APIGateway ServiceA 決 済 機 関 内 部 シ ス テ ム ServiceAが決済機関を呼び出して応答を待つ 時間が長い(6.53秒)
  133. 133. APIGateway ServiceA 決 済 機 関 内 部 シ ス テ ム 原因は決済機関のレスポンス待ち 全体の処理時間 6.98秒に対して6.53秒を要 していたことが視覚的に把握できる
  134. 134. APIGateway ServiceA 決 済 機 関 内 部 シ ス テ ム Zipkinのおかげで分散してしまっている各アプリケー ションのログからトレースを追わずに済み、効率良く調 査ができるようになった
  135. 135. サービス目線のモニタリング 決済手段毎の OK数 / NG数を表示
  136. 136. サービス目線のモニタリング 決済手段毎の OK数 / NG数を表示
  137. 137. サービス目線のモニタリング 決済数 取扱高 前日比・傾向 内訳 分類
  138. 138. サービス目線のモニタリング 決済数 取扱高 前日比・傾向 内訳 分類 XX,XXX X,XXX,XXX,XXX XXX,XXX X,XXX,XXX,XXX
  139. 139. サービス目線のモニタリング 決済数 取扱高 前日比・傾向 内訳 分類 XX,XXX X,XXX,XXX,XXX XXX,XXX X,XXX,XXX,XXX加盟店の システム障害 加盟店の システム障害
  140. 140. XX,XXX X,XXX,XXX,XXX XXX,XXX X,XXX,XXX,XXX 加盟店へリアルタイムに状況を共有、 さらには加盟店自身も見落としていた障害を検知 サービス目線のモニタリング
  141. 141. サービス目線のモニタリング 決済数 取扱高 前日比・傾向 内訳 分類 アプリをリリースするだけで プラットフォームが自動で監視対象に Metrics Logging Tracing + Biz
  142. 142. ● これまでの歩み
  143. 143. プラットフォーム導入の効果 Before After Release リリース作業 手作業 ワンクリック リリース品質 人為的なミスの可能性あり 自動化によりミスなし リリース時間 45分 5分 Observability ログ調査 ログファイルから調査 Kibanaダッシュボード サーバメトリクス調査 ログファイルから調査 Grafanaダッシュボード トレース調査 なし Zipkinダッシュボード Resilience 障害時の自動復旧 なし 自動再起動 スケールアウト 手作業 管理画面から数クリック
  144. 144. アーキテクチャのアップデート サービス開始時 2年経った現在 PaaS Platform Java Java 8 Java 11 Spring Boot v2.1.2 v2.3.5 Spring Cloud Greenwich. RELEASE Hoxton.SR8 ライブラリ Http Client RestTemplate WebClient ライブラリ CircuitBreaker Hystrix Resilience4J
  145. 145. サービスの広がり サービス開始時 2年経った現在 システム数 1システム 3システム ⤴ App数 12アプリケーション 22アプリケーション ⤴ Appインスタンス数 45インスタンス 57インスタンス ⤴ プラットフォーム運用者数 2名 3名 ➝ アプリケーション開発者数 4名 15名(開発ベンダ2社 6名含む) ⤴ このシステムの障害件数 - 0件
  146. 146. 本日のまとめ
  147. 147. 技術的なアップデートをしながらサービスの拡張や機能追加がで きている。 まとめ 自分たちのシステムをプラットフォームから構築しサービスの運 用開始から 年間、大きな障害もなく運用することができた。 リリース作業やログ調査も非常に効率良く運用できている。
  148. 148. さいごに サービス開始から2年間、大きな障害もなく運用することができ ましたが、歩みを止めることなく加盟店/エンドユーザの方々に 高い品質のサービスを提供したい。 堅牢、安全、1件1円間違えのない、 障害に強いシステムを目指して
  149. 149. ご清聴ありがとうございました SBペイメントサービスは エンジニアを募集しています 興味がある方は   @suzukijまで

×