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
40
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
使いながら育てる Claude Code — 開発フローの1コマンド化 × 繰り返し指摘の自動仕組み化
shiki_kakaku
0
1.7k
今さら聞けない .NET CLI
htkym
0
180
AI Engineeringは、AIプロダクトだけのものか? 〜AIがソフトウェアを作る時代の新しい当たり前〜 / No AI in your product. AI Engineering in your development.
rkaga
4
370
生成AIで帳票OCRが「簡単に」作れる時代になった?
kon_shou
0
450
属人化した知識を、 AIが辿れる地図にする
pkshadeck
PRO
1
140
What's New in Android 2026
veronikapj
0
250
5分で問診!Composer セキュリティ健康診断
codmoninc
0
860
改善しないと、タスクが回らない。 “てんこ盛りポジション” を引き継いだ情シスの、入社3ヶ月の業務改善録
krm963
0
250
ビデオ通話が繋がる0.2秒で何が起きているのか
supurazako
2
170
使用 Meilisearch 建立新聞搜尋工具
johnroyer
0
220
PHP に部分適用が来るぞ!……ところで何それ?おいしいの? #phpcon / phpcon-2026
shogogg
0
550
php-fpmのプロセスが枯渇した日-調査・対処・そして本当にやるべきだったこと-
shibuchaaaan
0
220
Featured
See All Featured
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
200
Scaling GitHub
holman
464
140k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.8k
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
3
1.1k
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
2
3.7k
RailsConf 2023
tenderlove
30
1.5k
Reality Check: Gamification 10 Years Later
codingconduct
0
2.2k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
23k
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
790
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.3k
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
ありがとうございました