SlideShare a Scribd company logo
1 of 48
Download to read offline
Sansanがメッセージング (SQS) で
スケーラビリティを手に入れた話
using C# on Windows;
神原 淳史
@atsukanrock
2017-05-31
AWS Dev Day Tokyo 2017
自己紹介
• 神原 淳史 @atsukanrock
• Development Manager at
• Interested in
• Domain-Driven Design
• C# / .NET
• Enterprise Integration Patterns
目次
• Sansanサービスの説明
• メッセージングとは
• メッセージングによる課題解決の実例
• メッセージングの注意点
• まとめ
Sansanサービスの説明
名刺を企業の資産に変える
サービス全体像
Scanner
データ化サービス
(Digitization Service)
精度99%
社内の別組織が開発・運用
API Call
Callback API
API Call
マルチテナント型クラウドサービス
tenant_id biz_card_id given_name family_name email …
xxx 11111 太郎 山田 … …
xxx 22222 二郎 鈴木 … …
xxx 33333 三郎 佐藤 … …
xxx 44444 四郎 田中 … …
yyy 55555 五郎 高橋 … …
yyy 66666 六郎 山本 … …
yyy 77777 花子 中村 … …
テナント (≒組織) 内で
データ共有
DBテーブルをテナント毎に分割
サービス規模の拡大
2014 2015 2016 2017
Tenants
2014 2015 2016 2017
Users
2014 2015 2016 2017
Biz Cards
2014 2015 2016 2017
Maximum Users Per Tenant
2014 2015 2016 2017
Maximum Biz Cards Per Tenant
スケーラビリティの
課題が次々に発生
メッセージングとは
前提知識を早巡り
メッセージングとは
Message Queue
Web App
Web API
Batch
Message
Consumer
Server
Message
Message
Message Message
Database
メッセージキューを介し、
プロセス間やアプリケーション間で
データや制御を伝達する
特徴
• メッセージは単なるテキスト
• 処理失敗したメッセージはリトライされる
• 厳密には、再度処理対象となる
• 一定回数失敗し続けたメッセージは別キューに退避
される (Dead Letter Queue)
ミドルウェア
Amazon SQS
Standard Queue
Amazon SQS
FIFO Queue
Azure Storage
Azure
Service Bus
MSMQ
PaaS Yes Yes Yes Yes No
Transaction No No No Local Distributed
At-most-once No Yes No Yes Yes
FIFO Best effort Yes Best effort Yes (w/ session) Yes
現Sansanで採用
メッセージングによる
課題解決の実例
スケーラビリティを手に入れる
抱えていた課題
• 巨大なトランザクション
• 終わらないバッチ処理
• 急激に変化するデータベース負荷
• 低いメンテナンス自由度
• リカバリ不可能な処理
抱えていた課題
• 巨大なトランザクション
• 終わらないバッチ処理
• 急激に変化するデータベース負荷
• 低いメンテナンス自由度
• リカバリ不可能な処理
巨大なトランザクション
所有名刺の参照・更新可否を
ユーザ単位で設定可能
0
5,000,000
10,000,000
15,000,000
20,000,000
25,000,000
30,000,000
35,000,000
40,000,000
0 1,000 2,000 3,000 4,000 5,000 6,000
権限設定レコード数
ユーザ数
権限設定レコードの洗い替え処理を
1トランザクションで処理すると、
指数関数的にトランザクションが巨大化
Scalable Design
トータルで処理するレコード数は変
わらないが、並列処理によりスルー
プットが向上
Transaction A Transaction B
Transaction C Transaction D
並列処理
実装例
Web Server
Consumers
Amazon SQS
Queue A
Database
User Consumer
Amazon SQS
Queue B
メッセージ分割
並列処理
抱えていた課題
• 巨大なトランザクション
• 終わらないバッチ処理
• 急激に変化するデータベース負荷
• 低いメンテナンス自由度
• リカバリ不可能な処理
終わらないバッチ処理
0
500,000
1,000,000
1,500,000
2,000,000
2,500,000
3,000,000
3,500,000
4,000,000
4,500,000
DIGITIZATIONS/MONTH DIGITIZATION VOLUME TREND
Non-scalable Design
var targetBizCards = GetBizCardsByDigitizedTimestamp(from, to);
foreach (var targetBizCard in targetBizCards)
{
DoSomething(targetBizCard);
}
0
500,000
1,000,000
1,500,000
2,000,000
2,500,000
3,000,000
3,500,000
4,000,000
4,500,000
2016-05
2016-06
2016-07
2016-08
2016-09
2016-10
2016-11
2016-12
2017-01
2017-02
2017-03
2017-04
DIGITIZATIONS/MONTH
DIGITIZATION VOLUME TREND
処理時間がデータ化の量に比例
Scalable Design
1件のデータ化
後続処理B後続処理A
1日中、並列処理されている
1件ずつすぐに後続処理を起動
(Domain Event)
• バッチウィンドウが1日中に
• 後続処理が並列化
Domain Eventとは
NOT Domain Event Domain Event
Operation A
Operation C
Operation A
A Completed Event
Operation B Operation C
B Request C Request
Aは後続処理を
知らない
Operation B
Aは次にBなことを
知っている
Event Aggregator
事前にEvent AggregatorにSubscribe
Domain Eventの実装例
Publisher
Amazon SNS
Topic
Amazon SQS
Subscriber
Queue A Subscriber A
Subscriber B
push
pull
Amazon SQS
Subscriber
Queue B
抱えていた課題
• 巨大なトランザクション
• 終わらないバッチ処理
• 急激に変化するデータベース負荷
• 低いメンテナンス自由度
• リカバリ不可能な処理
急激に変化するデータベース負荷
0
10,000
20,000
30,000
40,000
50,000
60,000
70,000
80,000
90,000
100,000
110,000
120,000
WRITES/HOUR
DIGITIZATION THROUGHPUT
データベース負荷を安定させる
0
10,000
20,000
30,000
40,000
50,000
60,000
70,000
80,000
90,000
100,000
110,000
120,000
WRITES/HOUR
DIGITIZATION THROUGHPUT
平均値
「後回し」にできれば
負荷が安定
データ化処理のアーキテクチャ
Web API Server Consumer
Amazon SQS
Queue
Database
Digitization
Service
Consumerの並列度の制御
により負荷を均す
メッセージキューにより
「後回し」を実現
並列度の制御
Consumer Database
• インスタンス並列度
• Auto Scaling等を利用すれば手軽
• スレッド並列度
• .NETであればSemaphoreSlim
クラス等を利用して自前実装
Consumerの並列度の制御
により負荷を均す
while (true)
{
IDisposable throttlingToken = null;
try
{
throttlingToken = await ThrottlingPolicy.EnterAsync();
var message = await MessageChannel.ReceiveAsync();
if (message == null)
{
throttlingToken.Dispose();
var interval = IdleRetryPolicy.GetRetryInterval(++idleCount);
await Task.Delay(interval, cancellationToken);
continue;
}
idleCount = 0;
Task.Run(async () =>
SemaphoreSlimクラス等を
利用してスレッド並列度を制御
Channelからメッセージを取得
ワーカースレッドを起動
※イメージです
抱えていた課題
• 巨大なトランザクション
• 終わらないバッチ処理
• 急激に変化するデータベース負荷
• 低いメンテナンス自由度
• リカバリ不可能な処理
メンテナンス前 (従来)
データ化サービス
(Digitization Service)
Developers Developers
停止依頼
停止
メンテナンス前 (現在)
データ化サービス
(Digitization Service)
Developers
メンテナンス中
Web API Server
Amazon SQS
Queue
Digitization
Service
データ化サービスから
見ると平常運転
メッセージが処理されず
溜まっていく
メンテナンス完了時
Web API Server Consumer
Amazon SQS
Queue
Database
Digitization
Service
メンテナンス中に溜まった
メッセージを処理
抱えていた課題
• 巨大なトランザクション
• 終わらないバッチ処理
• 急激に変化するデータベース負荷
• 低いメンテナンス自由度
• リカバリ不可能な処理
リカバリ不可能な処理
メッセージングなし
• リトライは自前実装
• 落ちた箇所によっては
リカバリ不可能
メッセージングあり
• リトライは標準装備
• リトライしても失敗し続けた
処理はDead Letter Queueへ
• 処理内容がテキストで表現さ
れているので、必ずリカバリ
可能
タイムアウト、外部サービス障害等による処理失敗時
メッセージングの注意点
銀の弾丸はない
注意点
• 冪等性を保証する必要がある
• 順序は保証されない (Amazon SQS Standard Queue)
• 結果整合性モデルになることが多い
注意点
• 冪等性を保証する必要がある
• 順序は保証されない (Amazon SQS Standard Queue)
• 結果整合性モデルになることが多い
冪等性 (べきとうせい) とは
ある操作を何回行っても結果が同じこと
REST API設計の議論で
HTTP POST (冪等でない) とHTTP PUT (冪等) の意味の違い
インフラ界隈で
ChefやAnsibleで実現されている
メッセージングと冪等性
• Amazon SQSは基本、At-Least-Once Delivery
(Standard Queue)
Exactly-Once ProcessingモデルのFIFO Queueもあるが、
遅い & Tokyoに来ていない
• 例外発生等によりメッセージの処理に失敗した場合、
該当処理はリトライされる
冪等性を保証する必要がある
強い一貫性モデル (ACID) を持つRDB等で保証するのが基本
注意点
• 冪等性を保証する必要がある
• 順序は保証されない (Amazon SQS Standard Queue)
• 結果整合性モデルになることが多い
順序は保証されない
• Amazon SQSは基本、順序保証なし (Standard Queue)
FIFOを保証するFIFO Queueもあるが、遅い & Tokyoに来てい
ない
順序保証は自前で行う必要がある
メッセージの処理の最後に次のメッセージを送信する等
注意点
• 冪等性を保証する必要がある
• 順序は保証されない (Amazon SQS Standard Queue)
• 結果整合性モデルになることが多い
結果整合性モデルになる例
Transaction A Transaction B
Transaction C Transaction D
並列処理
Transaction AとBしか終わっていな
い時点では、ビジネストランザク
ションとして整合性が取れていない
許容できない場合、分割後の全ての
メッセージ処理が完了するまで処理
結果を見せない等の制御が必要
まとめ
伝えたいことを改めて
まとめ
• メッセージングを使うことで以下を向上できる
• スケーラビリティ
• 堅牢性
• 運用性
• 反面、設計難易度・複雑度は上がる傾向にある
特性を知り、適切な場面・方法で使用すべし

More Related Content

What's hot

マルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのことマルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのことAmazon Web Services Japan
 
AHVでみるCVM Autopathの仕組み
AHVでみるCVM Autopathの仕組みAHVでみるCVM Autopathの仕組み
AHVでみるCVM Autopathの仕組みKazuhito Ohkawa
 
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)NTT DATA Technology & Innovation
 
Db2をAWS上に構築する際のヒント&TIPS 2019年7月版
Db2をAWS上に構築する際のヒント&TIPS 2019年7月版Db2をAWS上に構築する際のヒント&TIPS 2019年7月版
Db2をAWS上に構築する際のヒント&TIPS 2019年7月版Akira Shimosako
 
監査要件を有するシステムに対する PostgreSQL 導入の課題と可能性
監査要件を有するシステムに対する PostgreSQL 導入の課題と可能性監査要件を有するシステムに対する PostgreSQL 導入の課題と可能性
監査要件を有するシステムに対する PostgreSQL 導入の課題と可能性Ohyama Masanori
 
大規模DCのネットワークデザイン
大規模DCのネットワークデザイン大規模DCのネットワークデザイン
大規模DCのネットワークデザインMasayuki Kobayashi
 
Open Liberty: オープンソースになったWebSphere Liberty
Open Liberty: オープンソースになったWebSphere LibertyOpen Liberty: オープンソースになったWebSphere Liberty
Open Liberty: オープンソースになったWebSphere LibertyTakakiyo Tanaka
 
HA環境構築のベスト・プラクティス
HA環境構築のベスト・プラクティスHA環境構築のベスト・プラクティス
HA環境構築のベスト・プラクティスEnterpriseDB
 
Azure Log Analytics 概要
Azure Log Analytics 概要Azure Log Analytics 概要
Azure Log Analytics 概要喜智 大井
 
Amazon Aurora - Auroraの止まらない進化とその中身
Amazon Aurora - Auroraの止まらない進化とその中身Amazon Aurora - Auroraの止まらない進化とその中身
Amazon Aurora - Auroraの止まらない進化とその中身Amazon Web Services Japan
 
RLSを用いたマルチテナント実装 for Django
RLSを用いたマルチテナント実装 for DjangoRLSを用いたマルチテナント実装 for Django
RLSを用いたマルチテナント実装 for DjangoTakayuki Shimizukawa
 
AWSのログ管理ベストプラクティス
AWSのログ管理ベストプラクティスAWSのログ管理ベストプラクティス
AWSのログ管理ベストプラクティスAkihiro Kuwano
 
MogileFSをバックエンドとしたPrivate S3の作り方
MogileFSをバックエンドとしたPrivate S3の作り方MogileFSをバックエンドとしたPrivate S3の作り方
MogileFSをバックエンドとしたPrivate S3の作り方Ryo Kuroda
 
AWS Black Belt Online Seminar 2017 AWSへのネットワーク接続とAWS上のネットワーク内部設計
AWS Black Belt Online Seminar 2017 AWSへのネットワーク接続とAWS上のネットワーク内部設計AWS Black Belt Online Seminar 2017 AWSへのネットワーク接続とAWS上のネットワーク内部設計
AWS Black Belt Online Seminar 2017 AWSへのネットワーク接続とAWS上のネットワーク内部設計Amazon Web Services Japan
 
細かすぎて伝わらないかもしれない Azure Container Networking Deep Dive
細かすぎて伝わらないかもしれない Azure Container Networking Deep Dive細かすぎて伝わらないかもしれない Azure Container Networking Deep Dive
細かすぎて伝わらないかもしれない Azure Container Networking Deep DiveToru Makabe
 
202110 AWS Black Belt Online Seminar AWS Site-to-Site VPN
202110 AWS Black Belt Online Seminar AWS Site-to-Site VPN202110 AWS Black Belt Online Seminar AWS Site-to-Site VPN
202110 AWS Black Belt Online Seminar AWS Site-to-Site VPNAmazon Web Services Japan
 
20200623 AWS Black Belt Online Seminar Amazon Elasticsearch Service
20200623 AWS Black Belt Online Seminar Amazon Elasticsearch Service20200623 AWS Black Belt Online Seminar Amazon Elasticsearch Service
20200623 AWS Black Belt Online Seminar Amazon Elasticsearch ServiceAmazon Web Services Japan
 
20190320 AWS Black Belt Online Seminar Amazon EBS
20190320 AWS Black Belt Online Seminar Amazon EBS20190320 AWS Black Belt Online Seminar Amazon EBS
20190320 AWS Black Belt Online Seminar Amazon EBSAmazon Web Services Japan
 

What's hot (20)

マルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのことマルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのこと
 
AHVでみるCVM Autopathの仕組み
AHVでみるCVM Autopathの仕組みAHVでみるCVM Autopathの仕組み
AHVでみるCVM Autopathの仕組み
 
AWS Black Belt Techシリーズ Amazon VPC
AWS Black Belt Techシリーズ Amazon VPCAWS Black Belt Techシリーズ Amazon VPC
AWS Black Belt Techシリーズ Amazon VPC
 
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
 
Db2をAWS上に構築する際のヒント&TIPS 2019年7月版
Db2をAWS上に構築する際のヒント&TIPS 2019年7月版Db2をAWS上に構築する際のヒント&TIPS 2019年7月版
Db2をAWS上に構築する際のヒント&TIPS 2019年7月版
 
監査要件を有するシステムに対する PostgreSQL 導入の課題と可能性
監査要件を有するシステムに対する PostgreSQL 導入の課題と可能性監査要件を有するシステムに対する PostgreSQL 導入の課題と可能性
監査要件を有するシステムに対する PostgreSQL 導入の課題と可能性
 
大規模DCのネットワークデザイン
大規模DCのネットワークデザイン大規模DCのネットワークデザイン
大規模DCのネットワークデザイン
 
Open Liberty: オープンソースになったWebSphere Liberty
Open Liberty: オープンソースになったWebSphere LibertyOpen Liberty: オープンソースになったWebSphere Liberty
Open Liberty: オープンソースになったWebSphere Liberty
 
HA環境構築のベスト・プラクティス
HA環境構築のベスト・プラクティスHA環境構築のベスト・プラクティス
HA環境構築のベスト・プラクティス
 
Azure Log Analytics 概要
Azure Log Analytics 概要Azure Log Analytics 概要
Azure Log Analytics 概要
 
Amazon Aurora - Auroraの止まらない進化とその中身
Amazon Aurora - Auroraの止まらない進化とその中身Amazon Aurora - Auroraの止まらない進化とその中身
Amazon Aurora - Auroraの止まらない進化とその中身
 
RLSを用いたマルチテナント実装 for Django
RLSを用いたマルチテナント実装 for DjangoRLSを用いたマルチテナント実装 for Django
RLSを用いたマルチテナント実装 for Django
 
AWSのログ管理ベストプラクティス
AWSのログ管理ベストプラクティスAWSのログ管理ベストプラクティス
AWSのログ管理ベストプラクティス
 
Oracle GoldenGate Cloud Serviceユーザーズガイド
Oracle GoldenGate Cloud ServiceユーザーズガイドOracle GoldenGate Cloud Serviceユーザーズガイド
Oracle GoldenGate Cloud Serviceユーザーズガイド
 
MogileFSをバックエンドとしたPrivate S3の作り方
MogileFSをバックエンドとしたPrivate S3の作り方MogileFSをバックエンドとしたPrivate S3の作り方
MogileFSをバックエンドとしたPrivate S3の作り方
 
AWS Black Belt Online Seminar 2017 AWSへのネットワーク接続とAWS上のネットワーク内部設計
AWS Black Belt Online Seminar 2017 AWSへのネットワーク接続とAWS上のネットワーク内部設計AWS Black Belt Online Seminar 2017 AWSへのネットワーク接続とAWS上のネットワーク内部設計
AWS Black Belt Online Seminar 2017 AWSへのネットワーク接続とAWS上のネットワーク内部設計
 
細かすぎて伝わらないかもしれない Azure Container Networking Deep Dive
細かすぎて伝わらないかもしれない Azure Container Networking Deep Dive細かすぎて伝わらないかもしれない Azure Container Networking Deep Dive
細かすぎて伝わらないかもしれない Azure Container Networking Deep Dive
 
202110 AWS Black Belt Online Seminar AWS Site-to-Site VPN
202110 AWS Black Belt Online Seminar AWS Site-to-Site VPN202110 AWS Black Belt Online Seminar AWS Site-to-Site VPN
202110 AWS Black Belt Online Seminar AWS Site-to-Site VPN
 
20200623 AWS Black Belt Online Seminar Amazon Elasticsearch Service
20200623 AWS Black Belt Online Seminar Amazon Elasticsearch Service20200623 AWS Black Belt Online Seminar Amazon Elasticsearch Service
20200623 AWS Black Belt Online Seminar Amazon Elasticsearch Service
 
20190320 AWS Black Belt Online Seminar Amazon EBS
20190320 AWS Black Belt Online Seminar Amazon EBS20190320 AWS Black Belt Online Seminar Amazon EBS
20190320 AWS Black Belt Online Seminar Amazon EBS
 

Similar to Sansanがメッセージング (SQS) でスケーラビリティを手に入れた話

Androidを中心に紐解くIoT
Androidを中心に紐解くIoTAndroidを中心に紐解くIoT
Androidを中心に紐解くIoTKeisuke Nishitani
 
ゲーム開発者からMaaS開発者へ ゲーム開発のノウハウを活かして 移動体情報配信システムを作ってみた [DeNA TechCon 2019]
ゲーム開発者からMaaS開発者へ ゲーム開発のノウハウを活かして 移動体情報配信システムを作ってみた [DeNA TechCon 2019]ゲーム開発者からMaaS開発者へ ゲーム開発のノウハウを活かして 移動体情報配信システムを作ってみた [DeNA TechCon 2019]
ゲーム開発者からMaaS開発者へ ゲーム開発のノウハウを活かして 移動体情報配信システムを作ってみた [DeNA TechCon 2019]DeNA
 
Azure Antenna AI 概要
Azure Antenna AI 概要Azure Antenna AI 概要
Azure Antenna AI 概要Miho Yamamoto
 
DockerCon '17 Feedback -User Stories- at Docker Meetup Tokyo
DockerCon '17 Feedback -User Stories- at Docker Meetup TokyoDockerCon '17 Feedback -User Stories- at Docker Meetup Tokyo
DockerCon '17 Feedback -User Stories- at Docker Meetup TokyoGo Chiba
 
What's new of XPages in 2015 and beyond
What's new of XPages in 2015 and beyondWhat's new of XPages in 2015 and beyond
What's new of XPages in 2015 and beyondAtsushi Sato
 
MashupAward7 Microsoft Presentation
MashupAward7 Microsoft PresentationMashupAward7 Microsoft Presentation
MashupAward7 Microsoft PresentationShinichiro Isago
 
20170311 jawsdays 新訳 とあるアーキテクトのクラウドデザインパターン目録
20170311 jawsdays 新訳 とあるアーキテクトのクラウドデザインパターン目録20170311 jawsdays 新訳 とあるアーキテクトのクラウドデザインパターン目録
20170311 jawsdays 新訳 とあるアーキテクトのクラウドデザインパターン目録Naomi Yamasaki
 
Mashup Award 7 Caravan in Fukuoka
Mashup Award 7 Caravan in FukuokaMashup Award 7 Caravan in Fukuoka
Mashup Award 7 Caravan in FukuokaKazumi Hirose
 
Data x AI x API で考えるビジネスインフラ
Data x AI x API で考えるビジネスインフラData x AI x API で考えるビジネスインフラ
Data x AI x API で考えるビジネスインフラDaiyu Hatakeyama
 
DevAx::connect はじめました
DevAx::connect はじめましたDevAx::connect はじめました
DevAx::connect はじめました政雄 金森
 
Big DataとContainerとStream - AWSでのクラスタ構成とストリーム処理 -
Big DataとContainerとStream - AWSでのクラスタ構成とストリーム処理 -Big DataとContainerとStream - AWSでのクラスタ構成とストリーム処理 -
Big DataとContainerとStream - AWSでのクラスタ構成とストリーム処理 -Amazon Web Services Japan
 
JAWS-UG広島 - 2019-07-12 - 金融ビッグデータを守るリソースポリシー実例
JAWS-UG広島 - 2019-07-12 - 金融ビッグデータを守るリソースポリシー実例JAWS-UG広島 - 2019-07-12 - 金融ビッグデータを守るリソースポリシー実例
JAWS-UG広島 - 2019-07-12 - 金融ビッグデータを守るリソースポリシー実例Yutaro Ono
 
BigQueryを活用したPrivate DMPを作って使ってるお話
BigQueryを活用したPrivate DMPを作って使ってるお話BigQueryを活用したPrivate DMPを作って使ってるお話
BigQueryを活用したPrivate DMPを作って使ってるお話Masato Kawada
 
DynamoDB MyNA・JPUG合同DB勉強会 in 東京
DynamoDB   MyNA・JPUG合同DB勉強会 in 東京DynamoDB   MyNA・JPUG合同DB勉強会 in 東京
DynamoDB MyNA・JPUG合同DB勉強会 in 東京Yuko Mori
 
クラウドの破壊力
クラウドの破壊力クラウドの破壊力
クラウドの破壊力Osaka University
 
Amazon dynamo db、cloudant、blockchainの紹介 20160706
Amazon dynamo db、cloudant、blockchainの紹介 20160706Amazon dynamo db、cloudant、blockchainの紹介 20160706
Amazon dynamo db、cloudant、blockchainの紹介 20160706Tsuyoshi Hirayama
 
Docker on azure!進化していくcontainerを覗いてみよう!
Docker on azure!進化していくcontainerを覗いてみよう! Docker on azure!進化していくcontainerを覗いてみよう!
Docker on azure!進化していくcontainerを覗いてみよう! Tsukasa Kato
 

Similar to Sansanがメッセージング (SQS) でスケーラビリティを手に入れた話 (20)

Androidを中心に紐解くIoT
Androidを中心に紐解くIoTAndroidを中心に紐解くIoT
Androidを中心に紐解くIoT
 
ゲーム開発者からMaaS開発者へ ゲーム開発のノウハウを活かして 移動体情報配信システムを作ってみた [DeNA TechCon 2019]
ゲーム開発者からMaaS開発者へ ゲーム開発のノウハウを活かして 移動体情報配信システムを作ってみた [DeNA TechCon 2019]ゲーム開発者からMaaS開発者へ ゲーム開発のノウハウを活かして 移動体情報配信システムを作ってみた [DeNA TechCon 2019]
ゲーム開発者からMaaS開発者へ ゲーム開発のノウハウを活かして 移動体情報配信システムを作ってみた [DeNA TechCon 2019]
 
Azure Antenna AI 概要
Azure Antenna AI 概要Azure Antenna AI 概要
Azure Antenna AI 概要
 
DockerCon '17 Feedback -User Stories- at Docker Meetup Tokyo
DockerCon '17 Feedback -User Stories- at Docker Meetup TokyoDockerCon '17 Feedback -User Stories- at Docker Meetup Tokyo
DockerCon '17 Feedback -User Stories- at Docker Meetup Tokyo
 
What's new of XPages in 2015 and beyond
What's new of XPages in 2015 and beyondWhat's new of XPages in 2015 and beyond
What's new of XPages in 2015 and beyond
 
MashupAward7 Microsoft Presentation
MashupAward7 Microsoft PresentationMashupAward7 Microsoft Presentation
MashupAward7 Microsoft Presentation
 
20170311 jawsdays 新訳 とあるアーキテクトのクラウドデザインパターン目録
20170311 jawsdays 新訳 とあるアーキテクトのクラウドデザインパターン目録20170311 jawsdays 新訳 とあるアーキテクトのクラウドデザインパターン目録
20170311 jawsdays 新訳 とあるアーキテクトのクラウドデザインパターン目録
 
Mashup Award 7 Caravan in Fukuoka
Mashup Award 7 Caravan in FukuokaMashup Award 7 Caravan in Fukuoka
Mashup Award 7 Caravan in Fukuoka
 
Data x AI x API で考えるビジネスインフラ
Data x AI x API で考えるビジネスインフラData x AI x API で考えるビジネスインフラ
Data x AI x API で考えるビジネスインフラ
 
DevAx::connect はじめました
DevAx::connect はじめましたDevAx::connect はじめました
DevAx::connect はじめました
 
Big DataとContainerとStream - AWSでのクラスタ構成とストリーム処理 -
Big DataとContainerとStream - AWSでのクラスタ構成とストリーム処理 -Big DataとContainerとStream - AWSでのクラスタ構成とストリーム処理 -
Big DataとContainerとStream - AWSでのクラスタ構成とストリーム処理 -
 
JAWS-UG広島 - 2019-07-12 - 金融ビッグデータを守るリソースポリシー実例
JAWS-UG広島 - 2019-07-12 - 金融ビッグデータを守るリソースポリシー実例JAWS-UG広島 - 2019-07-12 - 金融ビッグデータを守るリソースポリシー実例
JAWS-UG広島 - 2019-07-12 - 金融ビッグデータを守るリソースポリシー実例
 
BigQueryを活用したPrivate DMPを作って使ってるお話
BigQueryを活用したPrivate DMPを作って使ってるお話BigQueryを活用したPrivate DMPを作って使ってるお話
BigQueryを活用したPrivate DMPを作って使ってるお話
 
Global Network on Alibaba Cloud
Global Network on Alibaba CloudGlobal Network on Alibaba Cloud
Global Network on Alibaba Cloud
 
[Japan Tech summit 2017] DEP 008
[Japan Tech summit 2017] DEP 008[Japan Tech summit 2017] DEP 008
[Japan Tech summit 2017] DEP 008
 
DynamoDB MyNA・JPUG合同DB勉強会 in 東京
DynamoDB   MyNA・JPUG合同DB勉強会 in 東京DynamoDB   MyNA・JPUG合同DB勉強会 in 東京
DynamoDB MyNA・JPUG合同DB勉強会 in 東京
 
Growing up serverless
Growing up serverlessGrowing up serverless
Growing up serverless
 
クラウドの破壊力
クラウドの破壊力クラウドの破壊力
クラウドの破壊力
 
Amazon dynamo db、cloudant、blockchainの紹介 20160706
Amazon dynamo db、cloudant、blockchainの紹介 20160706Amazon dynamo db、cloudant、blockchainの紹介 20160706
Amazon dynamo db、cloudant、blockchainの紹介 20160706
 
Docker on azure!進化していくcontainerを覗いてみよう!
Docker on azure!進化していくcontainerを覗いてみよう! Docker on azure!進化していくcontainerを覗いてみよう!
Docker on azure!進化していくcontainerを覗いてみよう!
 

Sansanがメッセージング (SQS) でスケーラビリティを手に入れた話

Editor's Notes

  1. C#成分はほとんど入っておらず、言語非依存の技術であるメッセージングに関するお話
  2. ユーザが名刺をスキャナーでスキャンすると、Web APIでSansanに名刺画像が送信される Sansanは受け取った名刺画像をテキストデータにするため、データ化サービスにWeb APIで送信する ※データ化サービスは社内の別組織が開発・運用しており、ユーザが触れる部分のSansanサービスとは疎結合 Sansanはデータ化サービスからCallback APIで、名刺テキストデータを受け取る
  3. ポイントは、個人の名刺管理ではなく、テナント単位で名刺データベースを構築できる点 右側はDBテーブルのイメージ 他のマルチテナントの設計パターン データベースごと分ける データベース内のスキーマを分ける
  4. 非公開の数値を含むため縦軸は伏せているが、雰囲気は掴める Maximum Users Per Tenantの極端な拡大ぶりは特にすごい
  5. Messageは
  6. Sansanサービスの特徴的な仕様として、細やかなセキュリティ設定機能がある 名刺というのは個人情報であり、同じテナント内であっても参照制限、更新制限をかけたいという要求が頻繁に出るが、Sansanはそれに対応している 特に企業規模が大きくなればなるほど出やすい要件だが、例えば役員が交換した名刺を一般社員の誰でも参照可能とはしづらい。逆方向は参照可能としたかったりする 左側の図 中央の四角い枠の両側に並んでいるのはユーザで、両方共上からユーザA, B, C, D 中央の四角い枠の中の矢印が、DBの権限設定レコード1レコード分 右側のグラフ テナント内のユーザ数が増えると、対応するための権限設定レコードは指数関数的に増える 1テナント内の権限設定レコード洗い替え処理が発生することがあったが、整合性を保って処理するために1つのDBトランザクション内で処理していた 結果、そのDBトランザクションが指数関数的に巨大化していた
  7. 注意すべきなのは、この設計でスループットが向上するかどうかはDBのパフォーマンス特性に依るので、計測が重要 SansanのDBでは、スループットが向上した この設計だと、一部は完了、一部は未完了と状態が混在することがあるが、その辺りは後ほど触れる
  8. これは、メッセージングを活用した分散並列処理の設計の基本形
  9. いずれもネットワーク越しにアプリケーションを連携するPaaSだが、Amazon SNSはpushベース、Amazon SQSはpullベース SNSは、モバイルプッシュ通知やSMSメッセージ送信等が可能だが、SQSキューへのメッセージ送信も可能
  10. 個人的な想像だが… データ化サービスでは、精度の維持向上のため、人力入力に頼っている部分がある 現時点ではデータ化のほとんどは日本語の名刺なので、日本語を理解できる人が入力している 自ずと、日本時間の日中にデータ化の量がピークを迎える
  11. 急激に変化するデータベース負荷は、データベースに優しくない データ化処理は、それほど高い即時性は求められない
  12. 図にしてしまうと非常に当たり前な感じだが、ポイントは3つ Digitization Serviceから見ると、Web API Serverは常に即時処理している 実際にはAmazon SQS Queueに溜まっていて、後回しにされることもある Consumerの並列度制御により、データベース負荷が高くなりすぎない
  13. FIFO遅い: 300 transactions / sec ( http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/FIFO-queues.html#FIFO-queues-moving )