Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

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

AWS Dev Day Tokyo 2017での講演資料です。

http://www.awssummit.tokyo/devday/?id=type#D2T8-5

Atsushi Kambara

May 31, 2017
Tweet

More Decks by Atsushi Kambara

Other Decks in Programming

Transcript

  1. 自己紹介 • 神原 淳史 @atsukanrock • Development Manager at •

    Interested in • Domain-Driven Design • C# / .NET • Enterprise Integration Patterns
  2. マルチテナント型クラウドサービス 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テーブルをテナント毎に分割
  3. サービス規模の拡大 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 スケーラビリティの 課題が次々に発生
  4. メッセージングとは Message Queue Web App Web API Batch Message Consumer

    Server Message Message Message Message Database メッセージキューを介し、 プロセス間やアプリケーション間で データや制御を伝達する
  5. ミドルウェア 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で採用
  6. 巨大なトランザクション 所有名刺の参照・更新可否を ユーザ単位で設定可能 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トランザクションで処理すると、 指数関数的にトランザクションが巨大化
  7. 実装例 Web Server Consumers Amazon SQS Queue A Database User

    Consumer Amazon SQS Queue B メッセージ分割 並列処理
  8. 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 処理時間がデータ化の量に比例
  9. 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
  10. Domain Eventの実装例 Publisher Amazon SNS Topic Amazon SQS Subscriber Queue

    A Subscriber A Subscriber B push pull Amazon SQS Subscriber Queue B
  11. 急激に変化するデータベース負荷 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
  12. データベース負荷を安定させる 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 平均値 「後回し」にできれば 負荷が安定
  13. データ化処理のアーキテクチャ Web API Server Consumer Amazon SQS Queue Database Digitization

    Service Consumerの並列度の制御 により負荷を均す メッセージキューにより 「後回し」を実現
  14. 並列度の制御 Consumer Database • インスタンス並列度 • Auto Scaling等を利用すれば手軽 • スレッド並列度

    • .NETであればSemaphoreSlim クラス等を利用して自前実装 Consumerの並列度の制御 により負荷を均す
  15. 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からメッセージを取得 ワーカースレッドを起動 ※イメージです
  16. メンテナンス中 Web API Server Amazon SQS Queue Digitization Service データ化サービスから

    見ると平常運転 メッセージが処理されず 溜まっていく
  17. メンテナンス完了時 Web API Server Consumer Amazon SQS Queue Database Digitization

    Service メンテナンス中に溜まった メッセージを処理
  18. リカバリ不可能な処理 メッセージングなし • リトライは自前実装 • 落ちた箇所によっては リカバリ不可能 メッセージングあり • リトライは標準装備

    • リトライしても失敗し続けた 処理はDead Letter Queueへ • 処理内容がテキストで表現さ れているので、必ずリカバリ 可能 タイムアウト、外部サービス障害等による処理失敗時
  19. メッセージングと冪等性 • Amazon SQSは基本、At-Least-Once Delivery (Standard Queue) Exactly-Once ProcessingモデルのFIFO Queueもあるが、

    遅い & Tokyoに来ていない • 例外発生等によりメッセージの処理に失敗した場合、 該当処理はリトライされる 冪等性を保証する必要がある 強い一貫性モデル (ACID) を持つRDB等で保証するのが基本
  20. 順序は保証されない • Amazon SQSは基本、順序保証なし (Standard Queue) FIFOを保証するFIFO Queueもあるが、遅い & Tokyoに来てい

    ない 順序保証は自前で行う必要がある メッセージの処理の最後に次のメッセージを送信する等
  21. 結果整合性モデルになる例 Transaction A Transaction B Transaction C Transaction D 並列処理

    Transaction AとBしか終わっていな い時点では、ビジネストランザク ションとして整合性が取れていない 許容できない場合、分割後の全ての メッセージ処理が完了するまで処理 結果を見せない等の制御が必要
  22. まとめ • メッセージングを使うことで以下を向上できる • スケーラビリティ • 堅牢性 • 運用性 •

    反面、設計難易度・複雑度は上がる傾向にある 特性を知り、適切な場面・方法で使用すべし