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
Play Scala on AWS, C10K and DevOps
Search
arai-yusuke
April 23, 2016
Technology
2
1.3k
Play Scala on AWS, C10K and DevOps
arai-yusuke
April 23, 2016
Tweet
Share
More Decks by arai-yusuke
See All by arai-yusuke
Serverless Scala
cmaraiyusuke
0
2k
Scala: Mobile Backend on AWS
cmaraiyusuke
1
710
Other Decks in Technology
See All in Technology
ウォンテッドリーにおける Platform Engineering
bgpat
0
180
3/26 クラウド食堂LT #2 GenU案件を通して学んだ教訓 登壇資料
ymae
1
240
Agile TPIを活用した品質改善事例
tomasagi
0
600
低レイヤを知りたいPHPerのためのCコンパイラ作成入門 / Building a C Compiler for PHPers Who Want to Dive into Low-Level Programming
tomzoh
0
110
マルチアカウント管理で必須!AWS Organizationsの機能とユースケース解説
nrinetcom
PRO
1
120
Re:VIEWで書いた「Compose で Android の edge-to-edge に対応する」をRoo Codeで発表資料にしてもらった
tomoya0x00
0
240
NLP2025 参加報告会 / NLP2025
sansan_randd
4
320
Restarting_SRE_Road_to_SRENext_.pdf
_awache
1
230
AWSエンジニアがSAPのデータ抽出してみた
mayumi_hirano
0
110
OPENLOGI Company Profile
hr01
0
62k
Langchain4j y Ollama - Integrando LLMs con programas Java @ Commit Conf 2025
deors
0
100
ウェブアクセシビリティとは
lycorptech_jp
PRO
0
350
Featured
See All Featured
Optimising Largest Contentful Paint
csswizardry
35
3.2k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
331
21k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
22
2.6k
Automating Front-end Workflow
addyosmani
1369
200k
Writing Fast Ruby
sferik
628
61k
Being A Developer After 40
akosma
90
590k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
507
140k
Build your cross-platform service in a week with App Engine
jlugia
229
18k
Measuring & Analyzing Core Web Vitals
bluesmoon
6
370
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
40
2.1k
Rails Girls Zürich Keynote
gr2m
94
13k
Embracing the Ebb and Flow
colly
85
4.6k
Transcript
PLAY SCALA ON AWS C10K とDevOps Yusuke A. / Classmethod,
Inc.
WHOAMI Yusuke Arai Server App Programmer / AWS Architect http://dev.classmethod.jp/author/arai-yusuke/
クラスメソッドでは、iOS / Android ネイティブアプリの 受託開発を行っています。 バックエンドにはAWS を用います。
C10K インフラ設計に問題がなくてもクライアントが1 万超 えだしたらサー バー パンクします問題 Web 2.0 のころから既に問題提起されている Netty
(Java), Node.js, Play (Java, Scala) などのアプリケ ー ションフレー ムワー クがこの問題に挑戦してきた 文脈によって意味が微妙に異なるタイプのワー ド
スマホアプリとC10K スマホアプリの開発では、 バックエンドAPI サー バー が C10K 問題としっかり向き合う必要があります。
スマホ 日本国内のスマホ普及率は49.7%(2015/8 日経BP) 5000 万人以上がスマホを通じてネットにアクセス 日本で( ひいては世界で) もっとも普及ている「 イン ター
ネットにつながったデバイス」 1 日の平均的なスマホ利用時間は2 時間くらい 10 代、20 代にフォー カスすると5 時間くらい(!) 女子高生にフォー カスすると7 時間くらい(!?)
スマホアプリの受託開発 B to B to C スマホ普及率の上昇に比例して、KPI 目標数値も上昇 してきている 初年度インストー
ル数目標は100 万のオー ダー 目標達成時には100,000 MAU 以上が容易に想定される MAU = Monthly Active User( 月間アクティブユー ザー)
10 万以上のMAU が想定される時点で、 すでにC10K 問題と 向き合うべきアプリケー ションです。 くわえて、 スマホアプリ開発には特筆すべき点がもう一 つあります。
スマホアプリの特性 スマホアプリと《 モバイルプッシュ通知》 は切り離せま せん。 B2B2C における顧客は「 エンドユー ザー と円滑に
コミュニケー ションをとる方法」 を求めています。 彼らにとって、 その問題のソリュー ションのひとつがス マホアプリであり、 その機能の中でも《 プッシュ通知》 はとても魅力的なコミュニケー ション方法だからです。
プッシュ通知のリター ン プッシュ通知にはリター ンがあります。 エンドユー ザー が通知に反応してアプリを開いた結果、 バックエンドの API やCDN
へのアクセスが発生します。 100 万件のプッシュ通知を発行した場合、10% のアクテ ィブユー ザー が一斉に反応すると瞬間的に10 万のアクセ スがバックエンドに集中します。
先ほどの100 万件の例で言えば、15 分毎に1 万ユー ザー ず つ配信する負荷分散があり得ます。 この場合は延べ1 日 以上の配信時間がかかります。
ここまで極端な例でなくとも、 数時間単位で配信に時間 がかかることは、 顧客にとって受容しがたい場合がほと んどです。
C10K 問題と向き合う 現在のClassmethod スマホアプリ開発チー ムは モバイルバックエンドAPI サー バー は、 C10K
問題に対応するのが当然。 という考え方です。
C10K のソリュー ション AWS 2 Tier チー ム全員がAWS のエキスパー トである前提。
アプ リが複雑化する。iOS / Android で全く同じビジネス ロジックを書く必要がある。 AWS Lambda + Amazon API Gateway プロダクション適用はまだ厳しい。 本当にリソー ス 間のトランザクションが不要かの精査が難しい。 C10K に答えられるアプリケー ションの構築 ✔
開発チー ムはPlay Framework 2 の採用を決めました。 しかし、『 ただ採用するだけ』 では何も解決しません。
PLAY とC10K Play Framework 2.4 を使って 1,000 RPS のアプリを開発したお話をします。 RPS
= Request Per Minute( リクエスト毎秒)
アプリケー ションの概要 飲食系大手企業のB2C モバイルアプリ 予想される初年度インストー ル数は100 万のオー ダー プッシュ通知の一斉配信あり 試算ではAPI
サー バー 全体で 1,000 RPS の性能要求 バックエンドにはPlay を採用 ✔
だいぶ端折るとこんなアー キテクチャです。
最終的な目標は、 負荷試験ツー ルを用いて 1,000 RPS の 性能をAWS 環境ににデプロイされたアプリケー ションで 確認することでした。
開発チー ムは当初より Play を正しく使えばこの要求は達成できる というスタンスでした。
結論から言えば、 この時の認識は甘かったです。 Play アプリが実際に1,000 RPS を捌くためには、 正しく使 ったうえで超えなければならない壁がありました。
PLAY を正しく使う … ために、 以下の点に配慮して開発を進めました。 同期的なI/O の禁止 I/O のタイプ毎にExecutionContext ※を分ける
Request-Response 形式以外の処理はAkka Actor に切り分 ける。 ※ ExecutionContext は、 平たく言えばスレッドプー ルです。Scala のFuture と密接に関係します。
壁1 Play のアプリログ出力がボトルネックになる 最終的にログ出力用のActor を実装した 事前に行っていた" やわめ" の負荷試験では発覚しな い、 高RPS
ならではの問題だった
壁2 スレッドプー ルの数が多くなり、 最適な設定値を探す のに苦労した ExecutionContext を細かく分割したのは高RPS に対処 する上でとても有効だったが、 副作用として設定が
複雑になった 基本的には、I/O 処理委譲先のスルー プットを考慮 してスレッド数を決めていく 低IOPS だけど集中する予定ならスレッド数多め 高IOPS ならスレッド数低め
壁3 Future のシリアルな結合数が多すぎるとアウト 数十回のAPI 呼び出しの結果を集約して返す処理 Future はMonadOps なので、 とりあえずflatMap で結
合したくなる もちろんシリアルに処理されるから超遅い いわゆる「Applicative で十分パター ン」 ぽいのだけ れど、 使っているのはscala.concurrent.Future 結局実装をまるっと変えるはめになった。 実力不足 感があった
その他のハマった罠 Redis クライアントライブラリ(scala-redis) がデフォ ルトでスレッドセー フじゃなかった Akka のFault Torelance が難易度高い
でステー ト持っちゃったり Amazon Linux でJava 起動するとデフォルトのopen file limit が4096 だった(※ 知ってたらハマらない) AWS のAPI 性能がボトルネックになる箇所もあった
http://dev.classmethod.jp/server-side/play-framework-stress-test-pre-checklist/
PLAY とDEVOPS Play アプリをAWS 環境に継続的にデプロイしています。
大前提として、 ホットデプロイは目指していません。 AWS の仕組みをしっかり使えば、「 ホットデプロイじゃ ないから」 という理由で極端にデプロイが遅くなったり 煩雑になったりはしません。
AWS のDevOps なサー ビスたち AWS CloudFormation AWS Elastic Beanstalk AWS
CodeDeploy AWS OpsWorks
Golden AMI 方式 CDP「Stamp パター ン」 のCFn・Packer・Ansible による自動化実装
Golden AMI 方式 Packer にAnsible Playbook を実行させ、 アプリバンドル 済みAMI を作成
このAMI をGolden AMI と呼ぶ CFn により、AutoScaling Group のRolling Update で Golden AMI のインスタンスをデプロイする Infrastructure as Code
AWS CodeDeploy
CodeDeploy の利用 「Golden AMI 方式」 で作成したAnsible Playbook を流用 CodeDeploy を利用することでインスタンスの
Stop/Start なしでデプロイ アプリを再起動するshell script は自分で書く 速度的に優秀だが、 堅牢さでGolden AMI 方式に劣る http://aws.amazon.com/jp/documentation/codedeploy/
None
デプロイ方式 顧客がどの程度の堅牢さを求めているのかで変わる。 開発環境 ステー ジング環境 本番環境 案件A Ansible ※ Golden
AMI Golden AMI 案件B CodeDeploy Golden AMI Golden AMI 案件C CodeDeploy CodeDeploy CodeDeploy ※ Dynamic Inventory(ec2.py) の利用
顧客タイプとデプロイ 顧客の求めるセキュリティレベルによって、 DevOps の方法は変わってきます。 Golden AMI 方式は、 セキュリティに高い関心を持つ 顧客に提案します。 対してCodeDeploy
は、RTO や開発スピー ドに関心を 持っている顧客に適しています。
EB は使ってないの? 使っています。 ただし、JVM アプリのデプロイには使っていません。 Ruby on Rails で作成されたCMS( 管理画面)
などの デプロイに使っています。 EC2 インスタンスにどの程度のカスタマイズが必要か、 が大きな基準です。 ほとんどカスタマイズが要らない& アプリもそんなに複雑でないなら、EB がマッチします。 BCP の有無も一つ基準になるかもしれません。
どの方式でもCI サー ビスやJenkins から自動化できます。
今日のまとめ プッシュ通知のリター ンに耐える Play Framework 高負荷時の罠を知る Golden AMI 方式とCodeDeploy を使い分ける
AWS を駆使してDevOps と向き合う
ご清聴ありがとうございました。