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
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Junya Wada
July 28, 2016
Technology
2
650
スケーラビリティのためのSansanアプリケーション基盤
Sansan×gloops インフラ合同勉強会
http://connpass.com/event/33442/
Junya Wada
July 28, 2016
Tweet
Share
Other Decks in Technology
See All in Technology
S3はフラットである –AWS公式SDKにも存在した、 署名付きURLにおけるパストラバーサル脆弱性– / JAWS DAYS 2026
flatt_security
0
440
組織のSREを推進するためのPlatform EngineeringとEKS / Platform Engineering and EKS to drive SRE in your organization
chmikata
0
190
型を書かないRuby開発への挑戦
riseshia
0
200
Digitization部 紹介資料
sansan33
PRO
1
7k
Security Diaries of an Open Source IAM
ahus1
0
210
わたしがセキュアにAWSを使えるわけないじゃん、ムリムリ!(※ムリじゃなかった!?)
cmusudakeisuke
1
410
楽しく学ぼう!ネットワーク入門
shotashiratori
0
290
JAWS DAYS 2026 CDP道場 事前説明会 / JAWS DAYS 2026 CDP Dojo briefing document
naospon
0
200
バクラクのSREにおけるAgentic AIへの挑戦/Our Journey with Agentic AI
taddy_919
2
1.1k
タスク管理も1on1も、もう「管理」じゃない ― KiroとBedrock AgentCoreで変わった"判断の仕事"
yusukeshimizu
5
1.8k
Ultra Ethernet (UEC) v1.0 仕様概説
markunet
3
230
All About Sansan – for New Global Engineers
sansan33
PRO
1
1.4k
Featured
See All Featured
The AI Search Optimization Roadmap by Aleyda Solis
aleyda
1
5.4k
The Curse of the Amulet
leimatthew05
1
9.7k
Jess Joyce - The Pitfalls of Following Frameworks
techseoconnect
PRO
1
96
Music & Morning Musume
bryan
47
7.1k
Measuring Dark Social's Impact On Conversion and Attribution
stephenakadiri
1
150
The Pragmatic Product Professional
lauravandoore
37
7.2k
How to train your dragon (web standard)
notwaldorf
97
6.5k
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
1.9k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
128
55k
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
630
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.4k
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.6k
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 で見れる ように • 絶賛対応中