Slide 1

Slide 1 text

Kubernetesで メールの大量配信をしている話 Kubernetes Meetup Tokyo #69 2025/2/5 クラウド事業本部 プラットフォーム部 販売管理グループ 深町 公法 [email protected] ©SAKURA internet Inc.

Slide 2

Slide 2 text

概要 • k8sを業務システムで使ってみたい人へ • レガシーなシステムの置き換え • k8sで大量のデータ処理を効率化 2

Slide 3

Slide 3 text

背景 • 販売管理システムを開発運用する部署にいます。 • 部内のインフラ担当 • k8sを使ってもらえると、サーバをアプリ毎に立てな くてよくなる • k8sを使ってお客様宛のメール配信システムを内製し ました 3

Slide 4

Slide 4 text

流れ 1. 使っているk8s環境 2. 古き良きメール配信システム 3. 新しいシステムの構成 4. KafkaでPodをつなぐ 5. リプレース後のシステムの性能 6. まとめ 4

Slide 5

Slide 5 text

使っているk8s環境 5 HAProxy x3 VIP(control-plane-endpoint) control-plane x3 node x5 サーバ構成 管理者 96 vcore 92.4 Gi 180 vcore 296.51Gi

Slide 6

Slide 6 text

使っているk8s環境 6 HAProxy x3 VIP(app) control-plane x3 node x5 Webアプリへのアクセス NodePort(80, 443) 社内のユーザ 96 vcore 92.4 Gi 180 vcore 296.51Gi

Slide 7

Slide 7 text

古き良きメール配信システム • トランザクションメール ・・・ログイン通知など • 一括配信 ・・・約款改定のお知らせ、メールマガジンなど 7 SMTPサーバ APIサーバ DB 送信サーバ 社内のユーザ 古いメール配信システム

Slide 8

Slide 8 text

古き良きメール配信システム • WebAPI + Cron + メール送信スクリプト ・・・プロセスを並列実行 8 SMTPサーバ APIサーバ DB 送信サーバ 社内のユーザ ① 配信リストを取得する ② 電文用データを作る ③ メールを配信する 1回計1秒くらいかかる 古いメール配信システム

Slide 9

Slide 9 text

古き良きメール配信システム 9 SMTPサーバ APIサーバ DB 送信サーバ 社内のユーザ ① 配信リストを取得する ② 電文用データを作る ③ メールを配信する 定刻を過ぎたリストを取得 個別のパラメータを取得 SMTP テンプレートを取得 メール件数分繰り返し cron起動 配信予約 200OK 配信ステータスを更新

Slide 10

Slide 10 text

性能などの問題 • 年々、一括配信の時間が増えていく ・・・長くて25万件を8時間 8.68件/s • 一括配信中に別のメールを送れない ・・・メール配信のスケジュール調整が必要 10 SMTPサーバ APIサーバ DB 送信サーバ 社内のユーザ 古いメール配信システム

Slide 11

Slide 11 text

管理の問題 • サーバの老朽化 ・・・Webサーバ、DBサーバ、SMTPサーバ • 組織変更で管理部門が定まっていない • メール配信システムの乱立 11 SMTPサーバ APIサーバ DB 送信サーバ 社内のユーザ 古いメール配信システム

Slide 12

Slide 12 text

新しいシステムの性能目標 • 目標 100万件を3時間(10倍速くらい) • コードの改善だけで配信時間を縮めるのは困難 • 100万件を3時間で 92.59件/s ・・・一括配信を1つ処理するために だいたい50コア100スレッド 必要 もろもろで2倍の 100コア200スレッド • Nodeを追加すればリソースは増やせる 12 → 並列数を増やす → k8sを使う

Slide 13

Slide 13 text

新しいシステムの基本的な構成 13 Kafka DB 配信リストを取得する 電文用データを作る メールを配信する 配信ステータス管理 UI API フロントエンド メール配信処理 Redis サーバサイド HAProxy 管理系 SMTPサーバ

Slide 14

Slide 14 text

Kafkaの概要 • Pub-Sub • 冗長化されたメッセージキューのようなもの 14 zookeeper zookeeper zookeeper Kafka Broker Kafka Broker Kafka Broker Kafka

Slide 15

Slide 15 text

Kafkaの概要 • Pub-Sub • 冗長化されたメッセージキューのようなもの 15 Kafka Producer Consumer Topic Publish Subscribe

Slide 16

Slide 16 text

Kafkaの概要 • アプリ間の通信につかう • バッチ処理(ループ処理)の冗長化、並列化 • データは一定期間保存可能 • Pod間を疎結合に 16 Kafka Producer Consumer

Slide 17

Slide 17 text

KafkaでPodをつなぐ 17 メール配信処理 配信リストを取得する 電文用データを作る メールを配信する 分割リスト メールデー タ リトライメー ルデータ メールをリトライ DB 配信リスト 1から1000 1001から2000 ~ 1件ごとに分ける 一定の配信件数に分ける

Slide 18

Slide 18 text

KafkaでPodをつなぐ 18 メール配信処理 配信リストを取得する 電文用データを作る メールを配信する メールをリトライ DB 配信リスト 1件ごとに分ける 分割リスト メールデータ リトライメールデータ 1から1000 1001から2000 ~ 一定の配信件数に分ける

Slide 19

Slide 19 text

リプレース後のシステムの性能 • 118 pods、 cpu上限: 92.1 vcore、memory上限: 187.24 Gi 19 配信リストを取得する 電文用データを作る メールを配信する メールをリトライ DB 配信リスト SMTPサーバ HAProxy 12 pods 48 pods 1 pod 1 pod

Slide 20

Slide 20 text

リプレース後のシステムの性能 • 30万件を約26分で処理(100万件だと約1時間27分) 20 配信リストを取得する 電文用データを作る メールを配信する メールをリトライ DB 配信リスト SMTPサーバ HAProxy 12 pods 48 pods 1 pod 1 pod

Slide 21

Slide 21 text

運用面の改善 • リアルタイム性の向上 • 流量をコントロールしやすい • アプリをアップデートしやすい • 機能を追加しやすい 21 DB 配信リスト SMTPサーバ HAProxy SMTPサーバ HAProxy トランザクションメール用 一括配信用

Slide 22

Slide 22 text

まとめ • k8sを使って社内のメール配信システムを内製しました • k8sに適したシステム構成にすることで処理性能が向上しまし た • メール配信に限らず、 時間のかかるバッチ処理などを高速化できるかもしれません • k8sをつかってシステムを作ってみたいと思っていた方の参考 になれば幸いです ご清聴ありがとうございました。 22