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
0
600
GAE/Jで盛大に失敗する方法
mmorito
October 28, 2018
Tweet
Share
More Decks by mmorito
See All by mmorito
WEB TOUCH MEETING #123
mmorito
0
17
Road to SRE NEXT@広島
mmorito
0
280
Google Cloud によるDICOM管理
mmorito
0
62
JBUG広島#11
mmorito
0
410
データ分析やAIの "運用" について考える
mmorito
0
470
JP_Stripes in Setouchi #01
mmorito
0
170
Cloud Native Kansai #01
mmorito
0
1.2k
Cloud Native Sapporo #01
mmorito
0
420
自社サービスにStripeを導入する話
mmorito
1
850
Other Decks in Programming
See All in Programming
dynamic!
moro
9
6.8k
ネイティブ製ガントチャートUIを作って学ぶUICollectionViewLayoutの威力
jrsaruo
0
140
CSC509 Lecture 01
javiergs
PRO
1
430
The Flutter Journey of Building a Live Streaming App — With a Side of Performance Tuning
u503
1
100
チームの境界をブチ抜いていけ
tokai235
0
100
CSC305 Lecture 04
javiergs
PRO
0
260
『毎日の移動』を支えるGoバックエンド内製開発
yutautsugi
2
210
デミカツ切り抜きで面倒くさいことはPythonにやらせよう
aokswork3
0
210
アメ車でサンノゼを走ってきたよ!
s_shimotori
0
200
Breaking Up with Big ViewModels — Without Breaking Your Architecture (droidcon Berlin 2025)
steliosf
PRO
1
350
Railsだからできる 例外業務に禍根を残さない 設定設計パターン
ei_ei_eiichi
0
370
Domain-centric? Why Hexagonal, Onion, and Clean Architecture Are Answers to the Wrong Question
olivergierke
1
620
Featured
See All Featured
Testing 201, or: Great Expectations
jmmastey
45
7.7k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
19
1.2k
Bash Introduction
62gerente
615
210k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
53k
A Modern Web Designer's Workflow
chriscoyier
697
190k
Product Roadmaps are Hard
iamctodd
PRO
54
11k
[RailsConf 2023] Rails as a piece of cake
palkan
57
5.9k
We Have a Design System, Now What?
morganepeng
53
7.8k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
33
2.5k
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
A Tale of Four Properties
chriscoyier
160
23k
Side Projects
sachag
455
43k
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
ありがとうございました