Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
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