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
GAE/Jで盛大に失敗する方法
Search
mmorito
October 28, 2018
Programming
680
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
GAE/Jで盛大に失敗する方法
mmorito
October 28, 2018
More Decks by mmorito
See All by mmorito
WEB TOUCH MEETING #123
mmorito
0
43
Road to SRE NEXT@広島
mmorito
0
330
Google Cloud によるDICOM管理
mmorito
0
120
JBUG広島#11
mmorito
0
460
データ分析やAIの "運用" について考える
mmorito
0
520
JP_Stripes in Setouchi #01
mmorito
0
200
Cloud Native Kansai #01
mmorito
0
1.4k
Cloud Native Sapporo #01
mmorito
0
460
自社サービスにStripeを導入する話
mmorito
1
890
Other Decks in Programming
See All in Programming
Terraform標準の組織で AWS CDKをどう使うか
mu7889yoon
1
530
生成AIで帳票OCRが「簡単に」作れる時代になった?
kon_shou
0
1.1k
いまどきの Codex で開発する visionOS アプリの開発スタイルについて
karad
0
150
関東Kaggler会_NVIDIA_Nemotron_コンペ_振り返り
rick_ds
0
660
ここ半年くらいでAIに作らせたR用ツール
eitsupi
0
390
Detecting Compromised CI with eBPF and Cilium Tetragon
lizrice
0
220
freee が目指す データ マネジメント戦略 AI-Ready 時代を支える 攻めのガバナンスとは
freee
PRO
0
430
MySQLとPostgreSQLって何が違うの?
akagami
0
110
【デモ】Kiroで体験する仕様駆動開発|設計からコーディングまでAIと進める開発フロー
cmkudo
0
200
TSX の <Hoge<Fuga>> という構文に驚いた話 / tsx-type-argument-syntax
kanaru0928
0
230
Claude CodeとAgentCore Gatewayを繋ぐ際の認証認可 / Authentication and authorization when connecting Claude Code with AgentCore Gateway
har1101
2
330
わからない話を追いかけたら、プログラミング言語を作る側にいた
ydah
3
530
Featured
See All Featured
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
2.1k
More Than Pixels: Becoming A User Experience Designer
marktimemedia
3
490
Leading Effective Engineering Teams in the AI Era
addyosmani
9
2.4k
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
250
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
1
2.4k
Designing Experiences People Love
moore
143
24k
Game over? The fight for quality and originality in the time of robots
wayneb77
1
250
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
28
3.6k
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4.1k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
2k
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
210
How to Think Like a Performance Engineer
csswizardry
28
2.7k
Transcript
GAE/Jで盛大に失敗する方法 GCPUG Okayama #11
森藤 敏之(もりとう) - @mmorito_0318 所属 - 株式会社エムネス - 遠隔画像診断センター - 医療支援サービス「LOOKREC」
イベント / 勉強会(担当) - GCPUG - 広島支部 organizer - Cloud Native Hiroshima
カープ優勝 おめでとうございます!
これは、GAE/J に魅了された者たちの物語です。 決してJavaを批判するものではないことをご理解ください。 はじめに
- サーバー: - データベース: - キャッシュ: - その他: Google App
Engine(Java) Datastore Memcache 魅了された者 登場人物
- GAEのJava7 Runtime が2019年1月16日にShatdownする - 弊社アプリケーションの完全移行が2018年11月までに完了予定 発表のきっかけ
背景
- 人口100万人あたりのCT/MRI 設置台数 日本はダントツで1位 CT units per million population OECD
Health at a Glance 2017 MRI units per million population
- 人口100万人あたりの放射線科医数 人口100万人あたりの 放射線科医数 日本はダントツで最下位 高額医療機器(CT/MR)と放射線科医の数
- データの保存や移行に莫大な時間とお金がかかる - 超高額で囲い込みの激しい医療業界の常識を撤廃 - 深刻な医師不足を解消するためのネットワーク作り - 機械学習などのIT技術を用いて、医療をサポートしたい クラウドへ移行する決意 Google
Cloud Platform 上で構築へ いつでも、どこでも、だれにでも高品質な医療を提供する
None
順調に開発が進み…
Googleからの取材 2014年8月
あれから2年.... 我々はアプリのリプレイスを余儀なくされる。
なにがダメだったか
失敗① スピンアップ Frameworkなし : Slim3 : Slim3 + Struts(仮) : Slim3
+ Struts(仮) + アプリ : 約2.5s 約3.3s(+800ms) 約5s (+1700ms) 約10s (+5000ms) 開発速度重視のため
- NoSQLであるDatastoreを非正規化したRDBのような使い方 主要なKindで自動インクリメントするKeyを設定 - KeyでGetできないため、 シングルプロパティインデックス・カスタムインデックスを貼りまくる 失敗② テーブル設計
- Queryでデータ取得することによる弊害 - Memcacheに載らない - トランザクションに引っかからない - Frameworkに搭載された禁断のインメモリフィルタに手を出す ※多めに取得してクライアントに返したいデータ以外を 捨てる
失敗② テーブル設計
- JSPの結果を返すリクエストがコンスタントに1秒を超えるようになる 失敗③ レスポンス
- 一方でAjaxを使い、signedURLを数百単位で要求してくるリクエストなど もあるが、スケールの恩恵を受けづらくなる 失敗③ レスポンス
- 軽い気持ちで30分毎に直近500件のデータを検索し、 他のテーブルに情報を更新する処理をCronジョブで実行 番外編 バッチ処理 翌月の請求額が 40万円UP↑↑
対応策
- インスタンスタイプを F1 → F2 へスケールアップ 愚策① チューニング - インスタンスが落ちるまでの時間を 最大(15秒)に設定 スピンアップやJavaのクラスロードに直面する リクエストを極力減らし、1秒でも速く処理させるため.....
- Memcache を 共有 → 1GB専有 に変更 愚策② キャッシュ
- アプリケーションを 単一Service → 複数Service にデプロイ 良策③ ディスパッチ 業務単位毎に別のServiceへルーティングを設定 (バッチ処理なども別Serviceへ)
そして、バージョン2開発へ
- AppEngineの言語を Java → Go に変更 - クライアントを JSP → Angular2系(SPA)に変更 -
Datastoreの設計を見直し インデックス数が ゼロ に Memcacheのヒット率もキャッシュサイズも大幅アップ - Serviceを分けてデプロイ。適切な ディスパッチ を設定 バージョン2 スピンアップが約20msに サーバ処理時間は200ms以内に 基本構成 AppEngine / Datastore は変更せず
None
Googleからの取材(2回目) 2018年6月
None
- うまく動作しない、性能が出ないのは、 だいたいクラウドサービス側よりもアプリ側に原因がある場合が多い - 現在は、AppEngine にも 2nd Gen が登場し、 いろいろと過渡期のため、機能要件に応じて適切なプロダクトを
選択していく必要がある - クラウドサービスならではのベストプラクティスやハマりどころ が存在するため、Slackとかで雑に質問してみると良いかも - なんにしても口座へのダメージ回避が最優先(性能改善にも繋がる) まとめ
None
ありがとうございました