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
670
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
38
Road to SRE NEXT@広島
mmorito
0
320
Google Cloud によるDICOM管理
mmorito
0
120
JBUG広島#11
mmorito
0
450
データ分析やAIの "運用" について考える
mmorito
0
520
JP_Stripes in Setouchi #01
mmorito
0
200
Cloud Native Kansai #01
mmorito
0
1.3k
Cloud Native Sapporo #01
mmorito
0
460
自社サービスにStripeを導入する話
mmorito
1
890
Other Decks in Programming
See All in Programming
AI時代のPHPer生存戦略 ~「言語、もうなんでもよくない?」に本気で向き合う~
vivion
0
160
琵琶湖の水は止められてもNet--HTTPのリトライは止められない / You might be able to stop the water flow of Lake Biwa but you can't stop Net::HTTP retries
luccafort
PRO
0
440
Generative UI & AI-Assistants for Your Angular Solutions
manfredsteyer
PRO
0
120
アルゴリズムは何を圧縮しているのか ─ Haskell から育った「圧縮代数」というメンタルモデル
naoya
16
3.6k
act1-costs.pdf
sumedhbala
0
250
音楽のための関数型プログラミング言語mimiumにおける多段階計算の活用
tomoyanonymous
1
360
PHP初心者セッション2026 〜生成AIでは見えない裏側を知る:今だからLAMPを通して仕組みを学ぶ〜
kashioka
0
660
地域 SRE コミュニティ最前線 - ホンマでっかSRE勉強会
tk3fftk
0
270
人間の目はかわらない、だからJPEGは30年もつ
yuzneri
8
13k
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
190
jsmini JavaScript Engine を作ってみた話
yosuke_furukawa
PRO
0
220
今さら聞けない .NET CLI
htkym
0
120
Featured
See All Featured
Odyssey Design
rkendrick25
PRO
2
730
Building an army of robots
kneath
306
46k
Designing for humans not robots
tammielis
254
26k
A designer walks into a library…
pauljervisheath
211
24k
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
320
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
1
2.1k
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
62
45k
Ethics towards AI in product and experience design
skipperchong
2
330
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.3k
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
240
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
260
Practical Orchestrator
shlominoach
191
11k
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
ありがとうございました