Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

スケーラブル GCP アーキテクチャ

9,217 views

Published on

DeNA TechCon 2017 での発表資料です。
Google App Engine、Task Queue、Cloud Pub/Sub を組み合わせた手法について紹介しています。

Published in: Technology
  • Be the first to comment

スケーラブル GCP アーキテクチャ

  1. 1. Copyright © DeNA Co.,Ltd. All Rights Reserved. スケーラブル GCP アーキテクチャ February 10, 2017 - DeNA TechCon 2017 Yuki Furuyama Alliance System Gr. Open Pla@orm Dept. DeNA Co., Ltd.
  2. 2. Copyright © DeNA Co.,Ltd. All Rights Reserved. ⾃⼰紹介 !  古⼭祐樹 !  オープンプラットフォーム事業本部システム開発部 アライアンスシステムグループ !  DeNA !  2014/04 新卒⼊社 !  2014/09 ~ Mobage の新プラットフォーム (Next Browser Platform)・ゲーム招待サービスの開発 !  2015/04 ~ グローバルマーケット向けの⼤規模ゲーム⽤ プラットフォーム開発 !  @addsict !  github.com/addsict 2
  3. 3. Copyright © DeNA Co.,Ltd. All Rights Reserved. このトークで話すこと !  Google App Engine をベースにスケーラビリティの⾼いアーキテクチャ を構成する時のポイントとなる点を説明します !  特に App Engine と Cloud Pub/Sub の組み合わせ⼿法を重点的に話し ます 3
  4. 4. Copyright © DeNA Co.,Ltd. All Rights Reserved. Google App Engine 4
  5. 5. Copyright © DeNA Co.,Ltd. All Rights Reserved. Google App Engine (GAE) とは !  Google が 2008 年(約10年前!)から提供している Web アプリケーション実⾏プラットフォーム !  特徴 !  アプリケーションより下側は⼀切気にしなくていい !  広義の Serverless Architecture !  トラフィックに応じてインスタンス数が⾃動で柔軟にスケール !  GCP の様々なサービスとの連携が容易 !  アプリログは Stackdriver Logging に !  BigQuery や Cloud Pub/Sub などとの認証も GAE のデフォルトの アクセストークンを⽤いることで容易に呼び出せる 5
  6. 6. Copyright © DeNA Co.,Ltd. All Rights Reserved. GAE でスケールさせるためには何に気をつけるべきか? 1.  Datastore !  特性を知りそれに⾒合った設計を⾏なう !  特にインデックス 2.  ⾮同期タスク !  時間のかかる処理は⾮同期に実⾏する !  外部システムに引きづられないように 6
  7. 7. Copyright © DeNA Co.,Ltd. All Rights Reserved. GAE でスケールさせるためには何に気をつけるべきか? 1.  Datastore !  特性を知りそれに⾒合った設計を⾏なう !  特にインデックス 2.  ⾮同期タスク !  時間のかかる処理は⾮同期に実⾏する !  外部システムに引きづられないように 7 今⽇はこちらを紹介
  8. 8. Copyright © DeNA Co.,Ltd. All Rights Reserved. ⾮同期タスク - リクエストの処理を分離してスケールさせる !  リクエストを !  同期的に処理する部分 !  ⾮同期的に処理する部分 !  に分離して実⾏する !  得られる様々なメリット !  より素早くレスポンスを返すことができる !  1つの処理を複数の処理単位に分離して独⽴して実⾏できる !  処理の特性に⾒合ったインスタンスを⽤意できる !  もちろん GAE 以外の組み合わせも可能 !  外部システムの調⼦に⼤きく引きづられないようになる !  緩衝材としての⾮同期化 8 システム全体をスケールさせるためには⾮同期化が不可⽋
  9. 9. Copyright © DeNA Co.,Ltd. All Rights Reserved. Task Queue - GAE の⾮同期タスク実⾏環境 !  ⾮同期タスクを実⾏するためのジョブキューシステム !  特徴 !  2 種類の Queue !  Pull Queue: Worker ⾃⾝がジョブを取りに⾏く !  Push Queue: Worker に対してジョブがプッシュされてくる !  Push Queue + GAE だと、⽤意したエンドポイントに HTTP リクエストが送られてくる !  Push Queue へのジョブ登録は HTTP リクエストを送るかのように⾏なう !  メソッドを指定して〜 (POST) !  URL を指定して〜 (/user/events) !  ヘッダを指定して〜 (X-My-Header: 1,2,3) !  ボディを指定して〜 ({“eventId”: “123”}) !  Datastore のトランザクションに Task Queue のキューイングを 含めることが可能 9
  10. 10. Copyright © DeNA Co.,Ltd. All Rights Reserved. Task Queue - ⾮同期 HTTP クライアントとして使う !  HTTP でジョブが送られてくる !  → ⾮同期 HTTP クライアントとして使える (+リトライ付き!) !  使い所 !  App Engine のサービス間通信を Task Queue を介して⾏なう !  「GAE Task Queue をマイクロサービスのサービス間通信として使う - addsict's blog」 10 App Engine Task Queue App Engine Enqueue Push POST /events HTTP/1.1
  11. 11. Copyright © DeNA Co.,Ltd. All Rights Reserved. Task Queue - スケーラビリティの問題 !  App Engine との相性は抜群だが課題も・・・ !  Task Queue (Push型) の実⾏レート !  1つのキューあたり 500 tasks/sec までに制限される !  それ以上の速度でタスクが登録されると処理が追いつかなくなる !  解決策 !  シャーディング !  秒間1万タスクが想定される場合: 20個のキューを⽤意 !  my_queue_01, my_queue_02, ..., my_queue_20 !  管理が煩雑 & マニュアル対応が⼊りスケールしない 11
  12. 12. Copyright © DeNA Co.,Ltd. All Rights Reserved. Cloud Pub/Sub 12
  13. 13. Copyright © DeNA Co.,Ltd. All Rights Reserved. Cloud Pub/Sub とは !  GCP の提供する汎⽤ Pub/Sub ミドルウェア !  特徴 !  ⾼いスケーラビリティ !  秒間100万(!) メッセージの処理 (https://cloud.google.com/pubsub/ での公表値) !  Push 型と Pull 型 !  Task Queue と同じ概念 !  Google App Engine との⾼い親和性 !  特別なエンドポイント: POST /_ah/push-handlers で認証された メッセージを受け取れる 13
  14. 14. Copyright © DeNA Co.,Ltd. All Rights Reserved. Task Queue から Cloud Pub/Sub へ !  両者は⾮常に似ている !  HTTP でタスク(=メッセージ)が Push される !  200 系のレスポンスを返すことでタスクが完了、削除される !  Cloud Pub/Sub は Task Queue の上位互換となり得るか? !  Push される HTTP リクエストを柔軟に設定できない... !  エンドポイントは Subscription 毎に固定 !  アプリケーション独⾃の HTTP ヘッダも付けられない !  Datastore のトランザクションに含めることが出来ない... !  Pub/Sub へのリクエストだけ失敗したらどうする? 14 App Engine App Engine Publish Push Cloud Pub/Sub POST /_ah/push-handlers
  15. 15. Copyright © DeNA Co.,Ltd. All Rights Reserved. Cloud Pub/Sub - 柔軟に HTTP リクエストを Push させる !  柔軟に HTTP リクエストを設定するために 1.  attributes と呼ばれる key/value ペアに HTTP リクエストの 情報を埋め込む 2.  リクエストのハンドリングを⾏なうコードの前にメッセージをほど き、HTTP リクエストを復元 1.  アプリケーションから⾒て通常の HTTP リクエストと透過的にする 3.  Pub/Sub が判別可能なレスポンスコードへの変換 1.  “202 Accepted” → “200 OK” への変換など 15 { “attributes”: { “method”: “PUT”, “path”: “/events/100”, “headers”: “{”X-My-Header”: ”1,2,3”}” }, “data”: “eyJmb28iOiAiYmFyIn0=” } PUT /events/100 HTTP/1.1 Content-Type: application/json X-My-Header: 1,2,3 {“foo”: “bar”} encode decode HTTP PubsubMessage
  16. 16. Copyright © DeNA Co.,Ltd. All Rights Reserved. Cloud Pub/Sub - 確実に Publish するために !  Task Queue にはあった Datastore とのトランザクションがない !  基本的に Pub/Sub へのリクエストはリトライを数回⾏なうことで ⾼い確率で成功する !  (実測値) 150ms のタイムアウトでは 99.96% の確率で1回で成功 !  失敗しても1度リトライを挟むだけで 99.998% まで上がる !  それでも失敗した場合は !  Task Queue にフォールバックさせる !  流れ: GAE → (Task Queue → GAE) → Pub/Sub → GAE !  トランザクションではないが実⽤には耐えうる 16
  17. 17. Copyright © DeNA Co.,Ltd. All Rights Reserved. Cloud Pub/Sub - インスタンス爆発を防ぐためのフロー制御 !  外部システムに引きづられインスタンス爆発を引き起こす危険性がある !  GAE では「ユーザのリクエスト」と「⾮同期タスクのリクエスト」 を同じインスタンスで処理する設計を取ることがあるため !  例. !  ⾮同期に通信している A の調⼦が悪くてリクエストが遅い !  → ユーザからのリクエストを処理できるインスタンスが減る !  → インスタンスを増やして対処する !  → A が回復しないのでインスタンスが際限なしに増えていく !  解決策: Pub/Sub のフロー制御をする !  “window” という設定値を Datastore に持ち、 どの程度 Pub/Sub からのリクエストを受け付けるかを定義する !  window に収まるようにランダムに失敗レスポンスを返す !  Pub/Sub の slow start な再送ロジックをうまく活⽤する !  ある程度「わざと失敗させる」ことでインスタンス数は安定してくる 17
  18. 18. Copyright © DeNA Co.,Ltd. All Rights Reserved. Cloud Pub/Sub - フロー制御の例 18 App Engine Cloud Pub/Sub 1. Push Datastore 外部 システム 2. 現在の window サイズを確認 3. window サイズ⼩さい → 4xx レスポンスを返却 なんだか 調⼦が悪い… 3. window サイズ⼤きい → 実際の処理を実⾏
  19. 19. Copyright © DeNA Co.,Ltd. All Rights Reserved. 最後に !  App Engine と Cloud Pub/Sub を使った⾮同期タスク処理を組み合わ せることで、スケーラビリティの⾼いアーキテクチャを実現する⼯夫を 紹介しました !  他にも Datastore や App Engine の中でも紹介したい Tips はあり ますが、それらはまた次回に! !  GCP の各サービスは⽇々改善されているため、本トークで話した課題が すぐに解決されていることもありうることに注意です 19

×