Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
スケーラビリティのためのSansanアプリケーション基盤
Search
Junya Wada
July 28, 2016
Technology
670
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
スケーラビリティのためのSansanアプリケーション基盤
Sansan×gloops インフラ合同勉強会
http://connpass.com/event/33442/
Junya Wada
July 28, 2016
Other Decks in Technology
See All in Technology
AIが自律的に回る開発ループを設計してチーム開発に組み込む
nekorush14
0
130
IaC コードを資産へ:AWS CDK 社内ライブラリと横断展開 / aws-summit-japan-2026
gotok365
10
1.6k
從開發到部署全都交給 AI:實作 AI 驅動的自動化流程
appleboy
0
160
BPaaSで進むAIオペレーションの現在地 AI実装が効く領域とスケーラビリティの選定と実装
kentarofujii
0
190
【2026年版】 ベクトル検索とEmbedding最前線
mocobeta
24
7.6k
WebGIS AI Agentの紹介
_shimizu
0
560
フルAIで個人開発して学んだあれこれ / yuruai vol.1
isaoshimizu
0
120
“詰む”前に仕組みを作れ 〜技術の波に溺れないためのキャッチアップ術〜
takasyou
7
3.9k
Comment regagner la souveraineté de vos données tout en étant payé grâce à Nostr !
rlifchitz
0
200
螺旋型キャリアの生存戦略 / kinoko-conf2026
rakus_dev
1
1k
自分が詳しくない領域でAIを使う #プロヒス2026
konifar
20
7.5k
AIに障害切り分けを全部やってもらった。 。 。 。
estie
0
160
Featured
See All Featured
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
170
The World Runs on Bad Software
bkeepers
PRO
72
12k
Leo the Paperboy
mayatellez
7
1.9k
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
150
How GitHub (no longer) Works
holman
316
150k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
11
950
Chasing Engaging Ingredients in Design
codingconduct
0
230
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
240
The AI Search Optimization Roadmap by Aleyda Solis
aleyda
1
5.9k
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
1
780
Scaling GitHub
holman
464
140k
KATA
mclloyd
PRO
35
15k
Transcript
スケーラビリティのための Sansanアプリケーション基盤 2016年7月28日 #Sansan_gloops
Copyright © 2014 Sansan, Inc. All rights reserved. > 自己紹介
1 • 和田潤也 • 某SIerで8年弱 ⇒ SansanにJOIN • C#、JavaScript 辺り • 主にUI基盤とかを開発していた • 情弱 GitHub: chocolamint
Copyright © 2014 Sansan, Inc. All rights reserved. > え?「インフラ勉強会」…?
2 • インフラの話とはちょっと違います。。。 • アプリケーション基盤の話をします • インフラ要素とも多少絡められたらいいな…
Copyright © 2014 Sansan, Inc. All rights reserved. > スケーラビリティのための仕組み
3 • DBの垂直・水平分散 • 垂直分散 • 役割によってDBを分割 • 水平分散 • ShardingKey によってDBを分割 • ユーザーごとに使うDBを分散するイメージ • メッセージ基盤 • Pub-Sub 型の分散処理基盤 • キューイングサービスを利用
Copyright © 2014 Sansan, Inc. All rights reserved. > DBの分散
4
Copyright © 2014 Sansan, Inc. All rights reserved. > 水平・垂直分散
5 Query Shard Mapping Common Database Use Main data Databases Shard1 Shard3 Shard2 Shard4 News Databases
Copyright © 2014 Sansan, Inc. All rights reserved. > Sansan.Data
6 using (new ShardingScope(shardingKey)) { // ここでの接続は指定されたシャードにいく ... }
Copyright © 2014 Sansan, Inc. All rights reserved. > Sansan.Data
7 Webにおいては ActionFilterAttribute を継承した ShardingFilterAttribute を使って ShardingScope の生成・破棄(Dispose)をしている using (var cn = await ConnectionHelper.OpenDataAsync()) { // 勝手に現在のユーザーが繋ぐべきシャードに繋がる return await cn.Connection.QueryAsync<string>(sql); }
Copyright © 2014 Sansan, Inc. All rights reserved. > メッセージ基盤
8
Copyright © 2014 Sansan, Inc. All rights reserved. > ちょっと前までのツラみ
9 • 統一的な非同期処理基盤がない • Webアプリのボタンクリックで数分かえって来ない • 同時実行できない • 古い自作基盤が並列処理で死ぬ :yami: • リトライで成功するのにアラート • リレー式の処理の滞留具合がわからない • メンテナンス時の停止と開始がツラい
Copyright © 2014 Sansan, Inc. All rights reserved. > 非同期処理基盤がない
10 • Webアプリで数分かかるボタンクリック • 非同期処理するには個別にバッチ開発が必要 Button Click Insert Record with status = 0 Polling with Task Scheduler FooBar.exe FooBarJob Batch Server Web Server
Copyright © 2014 Sansan, Inc. All rights reserved. > 同時実行できない
11 status = 0 を取得 ↓ 何か処理 ↓ status = 1 に更新 複数台(プロセス)で 対象データを取り合うと死ぬ ↓ 複雑な排他制御が必要(しんどい) ↓ スケールしない Batch Server 1 Batch Server 2
Copyright © 2014 Sansan, Inc. All rights reserved. > リトライで成功するのにアラート
12 タスクマネージャーによる プロセスの定期起動 1分後 アクセス失敗 成功 アラート発砲
Copyright © 2014 Sansan, Inc. All rights reserved. > 処理の滞留がわかりづらい
13 スループット? 対象データの流入
Copyright © 2014 Sansan, Inc. All rights reserved. > 停止と開始の嵐
14 バッチA バッチB バッチC バッチD
Copyright © 2014 Sansan, Inc. All rights reserved. 15 殺伐としたバッチ界にメッセージ基盤が!!
Copyright © 2014 Sansan, Inc. All rights reserved. > メッセージ基盤
16 Message Queue Web Server Batch Server Enqueue Dequeue Message Server Execute message concurrency SaaS の キューサービスを利用 Message
Copyright © 2014 Sansan, Inc. All rights reserved. > メッセージ基盤のいいところ
17 • スケールできる • 1プロセス内でマルチスレッドによる並列処理 • キューの種類ごとに並列数を調整可能 • ノードを増やせばさらにスケール可能 • 自動リトライ • 複数回の exponential な自動リトライ • リトライに成功しない場合は dead letter 行き • 自動でアラートメール発砲 • 各処理は冪等であるべき
Copyright © 2014 Sansan, Inc. All rights reserved. > メッセージ基盤のいいところ
18 • 負荷が安定する • セマフォで並列数制御 • メッセージ毎に異なるキューにルーティング • キューの滞留を監視可能 • グラフでモニタリングも出来る • SaaS でアラームを定義できるので滞留を監視できる
Copyright © 2014 Sansan, Inc. All rights reserved. > メッセージ基盤で出来ること
19 • 1つのメッセージに複数の Subscriber を定義可能 • システムイベントに対する複数処理を割り当て • ex) 新しい名刺が登録されたら… • ◦◦処理を実行 • △△処理を実行 • 全て完了したら××処理を実行 • 安全に停止できる • Windows サービスとして実装 • OnStop でキャンセル要求 • 優先度の高いものから処理できる • キューの種類ごとに優先度別のキューを用意できる
Copyright © 2014 Sansan, Inc. All rights reserved. 20 Mail
Queue (High) Mail Queue (Normal) Mail Queue (Low) News Queue (High) News Queue (Normal) News Queue (Low) 4 parallel 8 parallel
Copyright © 2014 Sansan, Inc. All rights reserved. > コードのイメージ
21 MessageQueue queue; while (true) { var message = queue.ReceiveMessage(); if (message != null) Task.Run(() => DispatchMessage(message)); } var msg = new SendMailMessage("title", "body"); await msg.SendAsync(priority: MessagePriority.Background); 標準で用意されているメッセージ • SendMailMessage • SendAllMailMessage • EventMessage
Copyright © 2014 Sansan, Inc. All rights reserved. > Next...
22 • 実際に基盤に乗っかった処理はまだ一部 • 随時効果の高いところから乗せ換え中 • 現状はメッセージ基盤/バッチのログがテキスト • ツラい • fluentd で Elasticsearch に送り込み Kibana で見れる ように • 絶賛対応中