Becoming a Nimble Giant: How DynamoDB serves Nike at Scale を読んだ

AWSでかれこれもう5年以上働いていて、今まで色々なロスがあったけど、その中でも個人的に大きかったのは @riywo が居なくなったことかもしれない(彼がバンクーバーAWSのサービスを開発するチームに異動してから、コレは!!っていう情報が手に入りにくくなった感)。そんな彼がイイ話だって言ってるので、チョロっと読んでみましたよ、と。

https://platform.twitter.com/widgets.js

この記事を書いた人のTwitterを見てみると、ポートランドで働くNikeの人で、re:Inventでカマすから見に来てね!な感じらしい。(私は今年はARIAというホテルの会場のStartup Centralというブースにずっといる予定なので、お時間ある方いたらひやかしにきてください :P)

https://platform.twitter.com/widgets.js

尚、本ブログの内容はタイトルの通り私個人のものであり、所属企業・部門見解を代表するものではありませんmm

はじめに

・重要なイニシアチブの1つに『microservices architecture with cloud deployment』が挙げられる ・近年data-center-deployedなモノリシックなシステムをインクリメンタルにマイクロサービス化してきた ・どんなmicroservice-basedにせよ、データストレージはクリティカル ・シンプルにスケールし且つ運用の手間のかからないDynamoDBはgo-to NoSQL data store

NoSQL Evolution

Nikeクラウドへのマイグレーションをはじめた時、self-hostedなCouchbaseとCassandraクラスターを運用していた ・それらのテクノロジーはWorkしていたものの、時が経つにつれメンテナンスが大変になってきて、サービス開発の足かせになってきてしまった ・NikeにおけるほとんどすべてのマイクロサービスはAWSにデプロイされているのでDynamoDBはリプレースの第一候補だった ・DynamoDBの前身であるDynamoAmazonのショッピングカート用にRDBMSの代替として作られたものだが、今日ではDynamoDBは簡単なAPIでテーブルを作ることができて、always onなlow-latencyの読み書きが可能 ・新しいサービスでは開始するためのバリアが低いDynamoDBを選択する傾向が強い

Learning the Model

・ほとんどの開発チームは過去の経験からCassandra and/or Couchbaseに親しみがある ・DynamoDBはitem(よくあるDBでいうところの"row")とattribute(いわゆる"column")とkeyで構成される ってか、この辺は"DynamoDBとは?"的な話なので、オラニエ先生(@oranieoranie)の↓とかを参照されたい [slideshare id=2FNMCpo8fSYiZ1&w=595&h=485&fb=0&mw=0&mh=0&style=border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;&sc=no]

・言いたいこととしては、DynamoDBはシンプルでフレキシブルなのでサービス開発が加速していくZE!っていう感じですかね

Scaling Up

・何百万人ものユーザーを抱えるNikeのフロントエンドにおいてmicroservicesのscalabilityはしばしばconcernに見舞われる ・ここでいうスケーラビリティとは何百万もの書き込みを受け付けられることと、バイボリュームなリクエストをさばくために水平方向にスケールできることで、DynamoDBはこの両方をパーフェクトに満たす ・DynamoDBのパーティショニングの振る舞いについては↑のBlack Beltの資料を参照いただければと思いますが、こちらのポストでは↓のような画像と共に紹介されています DDB Partition ・ReadとWriteのプロビジョンスループットはそれぞれ別々に値を更新可能 ・CassandraやCouchbaseを使っていた時はスケールさせるためにEC2インスタンスを追加しなければならなかったが、安定性において問題が発生することがあった ・DynamoDBを選択することで"no angry sneakerheads trying to cop the latest kicks"-うぇ〜い(スイマセン、個人ブログなんで諸々ご了承くださいw)

Challenges At Higher Scale

DynamoDBを使う上でのチャレンジもある。

Key Design and Throttling

・"hot keys"問題によって多数のトラフィックが1つのパーティションに短期間に集まってしまう場合 ・DynamoDBにおいてKeyは分散されていてデータが増えた時に複数のパーティションに分散することが望ましい ・GSIを使う時のKeyの設計は注意が必要 ・プロダクションに投入するまでhot key問題に気づかないことが多いのだが、それでは遅いので設計重要

Throughput During Spikes

Nikeが新しいスニーカーを発売した時のトラフィックパターンは"isn’t just a hockey stick; it’s a steep cliff!" ・顧客の関心が高い新しいプロダクトをリリースしようとする時に複数のサービスをまたぐトラフィックが発生する ・普段とくらべて500%以上のトラフィックが来ることもしばしば ・さすがに秒単位でピークが来る場合にauto-scaleでは間に合わないこともある ・DynamoDBなら事前にプロビジョンスループットを上げておけばイイ。いつスパイクが発生するかNikeは知っている ・エンジニアのマニュアルな操作がなくてもDynamoDBのAPIをcallすれば良い ・それでもテーブルが十分にスケールできておらずスロットリングすることはある。そんな時もスロットルされるのはプロビジョンスループットを超えた分だけで、(全体が止まってしまうわけではなく)リジェクトされるリクエストの割合は小さい。そしてAWS SDKによるリトライもまたスロットリングの一時的なワークアラウンドである

Wrong Tool for Some Jobs

・DynamoDBが全てのワークロードに適しているわけではない ・複雑なクエリパターンが要求される場合はElasticsearchが適しているが、そんな時はAmazon Elasticsearch Serviceを選択する。なぜなら運用面と複雑なクエリのサポートといった点でのベネフィットを享受できる ・グラフデータベースやリレーショナル・データベースが適している場合もある。S3に大量のデータを配置する-RedisやKinesisを中継する-ことが適している場合もある ・ワークロードに応じて適切なツールを慎重に選ぶ

Final Thoughts

・DynamoDBはNikeクラウド移行に重要な役割を担ってきた ・AWSNikeのデータのストレージとクエリのスケーラビリティをシンプルなAPIとモデルでtake careしてくれている ・service-basedなソリューションとしてDynamoDBは高い可用性、信頼性、そして合理的なパフォーマンスを発揮している ・DynamoDBは進化を続けていてGlobal Tables/DAX/TTL/Encryption at rest/backup and restoreといった魅力的な新機能が追加されている ・DynamoDBはデータストレージの問題をlong termな視点で解決してくれる素晴らしいソリューションで、データベースクラスタの保守運用にかかる時間を抑えることができ、新サービスの開発に注力できている ・DynamoDBに追加されている機能はNikeのお客様体験の向上に寄与している!

・・・ Want to join the Nike Digital Team? Check out the available jobs here. ⇒ ここまで嬉しいコメントが続くとjoinしたいって思っちゃうカモ…!?

amzn_assoc_ad_type ="responsive_search_widget"; amzn_assoc_tracking_id ="diary045-22"; amzn_assoc_marketplace ="amazon"; amzn_assoc_region ="JP"; amzn_assoc_placement =""; amzn_assoc_search_type = "search_widget";amzn_assoc_width ="auto"; amzn_assoc_height ="auto"; amzn_assoc_default_search_category =""; amzn_assoc_default_search_key ="Nike";amzn_assoc_theme ="light"; amzn_assoc_bg_color ="FFFFFF"; //z-fe.amazon-adsystem.com/widgets/q?ServiceVersion=20070822&Operation=GetScript&ID=OneJS&WS=1&Marketplace=JP