GAE/Jで盛大に失敗する方法GCPUG Okayama #11
View Slide
森藤 敏之(もりとう)- @mmorito_0318所属- 株式会社エムネス- 遠隔画像診断センター- 医療支援サービス「LOOKREC」イベント / 勉強会(担当)- GCPUG - 広島支部 organizer- Cloud Native Hiroshima
カープ優勝おめでとうございます!
これは、GAE/J に魅了された者たちの物語です。決してJavaを批判するものではないことをご理解ください。はじめに
- サーバー:- データベース:- キャッシュ:- その他:Google App Engine(Java)DatastoreMemcache魅了された者登場人物
- GAEのJava7 Runtime が2019年1月16日にShatdownする- 弊社アプリケーションの完全移行が2018年11月までに完了予定発表のきっかけ
背景
- 人口100万人あたりのCT/MRI 設置台数日本はダントツで1位 CT units per million populationOECD Health at a Glance 2017MRI units per million population
- 人口100万人あたりの放射線科医数人口100万人あたりの 放射線科医数日本はダントツで最下位 高額医療機器(CT/MR)と放射線科医の数
- データの保存や移行に莫大な時間とお金がかかる- 超高額で囲い込みの激しい医療業界の常識を撤廃- 深刻な医師不足を解消するためのネットワーク作り- 機械学習などのIT技術を用いて、医療をサポートしたいクラウドへ移行する決意Google Cloud Platform 上で構築へいつでも、どこでも、だれにでも高品質な医療を提供する
順調に開発が進み…
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 は変更せず
Googleからの取材(2回目)2018年6月
- うまく動作しない、性能が出ないのは、だいたいクラウドサービス側よりもアプリ側に原因がある場合が多い- 現在は、AppEngine にも 2nd Gen が登場し、いろいろと過渡期のため、機能要件に応じて適切なプロダクトを選択していく必要がある- クラウドサービスならではのベストプラクティスやハマりどころが存在するため、Slackとかで雑に質問してみると良いかも- なんにしても口座へのダメージ回避が最優先(性能改善にも繋がる)まとめ
ありがとうございました