Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Google App Engine 最新情報
松尾 貴史
Google Developer Day
2010年9月28日
アジェンダ
自己紹介
Python pre-compilation
Task Queue の強化
高速イメージ配信
カスタムエラーページ
count と query での 1000 件制限の撤廃
Multitenancy
知らないかもしれない注...
自己紹介
Google
デベロッパーリレーション
デベロッパーアドボケイト
松尾 貴史
tmatsuo@google.com
Python pre-compilation
Python script の事前コンパイルができるようになりまし
た。
やり方は app.yaml に下記2行を追加するだけ
derived_file_type:
- python_precomp...
Python pre-compilation
Python script の事前コンパイルができるようになりまし
た。
やり方は app.yaml に下記2行を追加するだけ
derived_file_type:
- python_precomp...
Task Queue の強化
queue.yaml で total_storage_limit が指定できるようにな
りました。下記のように記載します。
total_storage_limit: 100G
queue:
- name: defa...
Task Queue の強化
total_storage_limit: 100G
queue:
- name: default
rate: 50/s
Task Queue の強化
Version 1.3.4 までのTask Queue ではアプリケーション
毎に最大 50qps でした
Task Queue の強化
Version 1.3.5 からは queue 毎に最大 50qps 
高速イメージ配信
blobstore に保存したイメージを高速に配信する仕組
みです。
images.get_serving_url(blob_key, size=None, crop=False)
パブリックで推測しずらい URL が生成され...
高速イメージ配信 Sample
モデル
class AlbumImage(db.Model):
title = db.StringProperty()
original_image_url = db.StringProperty(indexed...
高速イメージ配信 Sample
ハンドラー - フォームとサムネイルを表示
class MainHandler(webapp.RequestHandler):
def get(self):
upload_url = blobstore.crea...
高速イメージ配信 Sample
ハンドラー - アップロードされた画像を処理
class UploadHandler(blobstore_handlers.BlobstoreUploadHandler):
def post(self):
# '...
カスタムエラーページ
app.yaml にて設定できます。
error_handlers:
- file: default_error.html
- error_code: over_quota
file: over_quota.html
有効...
1000件制限
カウントと fetch の limit で 1000 以上指定可能
q = MyModel.all()
number = q.count(100000)
entries = q.fetch(100000)
システムの30秒制限に...
Multitenancy
namespace を指定して実行できるサービス
datastore
memcache
taskqueue
注意: blobstore では namespace を使えません。
Multitenancy
google.appengine.api.namespace_manager で
namespace を指定できます
namespace_manager.set_namespace()
namespace_manage...
Multitenancy
Multitenancy 以外のユースケース
ユーザー情報を namespace で分ける
管理用のデータとアプリケーションデータを分ける
テストと本番運用でデータストアを分ける
ひとつの App Engine スロッ...
Multitenancy
一時的に namespace を設定したい場合
namespace = namespace_manager.get_namespace()
try:
namespace_manager.set_namespace('-...
Multitenancy
Google Apps のドメインで namespace を分けたい場合のパターン
appengine_config.py にて下記のようにします。
from google.appengine.api import n...
appengine_config.py
App Engine の設定システム
この設定システムはライブラリの動作をそのライブラリの使用者が設
定によって変更できる仕組みです。
google.appengine.api.lib_config.py...
appengine_config.py
例えば mylib.py を appengine_config.py 対応にするには
mylib.py:
from google.appengine.api import lib_config
confi...
appengine_config.py
do_something を上書きするには
appengine_config.py:
def mylib_do_something(obj):
# implement as you like
# ...
Multitenancy
テスト用に namespace を分ける...
クラウド上でもユニットテストがしたい
http://code.google.com/p/appengine-py-testhelper/wiki/GAETestBase
...
Multitenancy
my_namespace_manager.py
import os
from google.appengine.api import namespace_manager
current_namespace = ""
t...
Multitenancy
(続き)
def initialize(namespace):
global test_namespace, current_namespace
current_namespace = namespace
test_n...
Multitenancy
appengine_config.py では
import my_namespace_manager
def namespace_manager_default_namespace_for_request():
ns ...
知らないかもしれない注意点
平均 1000ms で Response を返すアプリケーション
のみ AutoScale します。
実際には 800ms を目指してください。
400ms くらいだと理想的です。
Query per minutes...
Thanks
Takashi Matsuo
Google, Inc.
tmatsuo@google.com
Upcoming SlideShare
Loading in …5
×

Google Developer Day 2010 Japan: Google App Engine についての最新情報 (松尾貴史)

4,104 views

Published on

Google App Engine で最近リリースされた機能 1) Task Queue の強化 2) Multitenancy 3) 高速イメージ配信 4)カスタムエラーページ 等について紹介します。

Published in: Technology
  • Be the first to comment

Google Developer Day 2010 Japan: Google App Engine についての最新情報 (松尾貴史)

  1. 1. Google App Engine 最新情報 松尾 貴史 Google Developer Day 2010年9月28日
  2. 2. アジェンダ 自己紹介 Python pre-compilation Task Queue の強化 高速イメージ配信 カスタムエラーページ count と query での 1000 件制限の撤廃 Multitenancy 知らないかもしれない注意点
  3. 3. 自己紹介 Google デベロッパーリレーション デベロッパーアドボケイト 松尾 貴史 tmatsuo@google.com
  4. 4. Python pre-compilation Python script の事前コンパイルができるようになりまし た。 やり方は app.yaml に下記2行を追加するだけ derived_file_type: - python_precompiled どのくらい変化があるのか? 411ms 621cpu_ms →
  5. 5. Python pre-compilation Python script の事前コンパイルができるようになりまし た。 やり方は app.yaml に下記2行を追加するだけ derived_file_type: - python_precompiled どのくらい変化があるのか? 411ms 621cpu_ms → 247ms 271cpu_ms
  6. 6. Task Queue の強化 queue.yaml で total_storage_limit が指定できるようにな りました。下記のように記載します。 total_storage_limit: 100G queue: - name: default rate: 50/s Task Queue で使えるストレージ容量が設定できます。B は byte, K は kilobyte, M は megabyte, G は gigabyte, T は terabyte です。デフォルト値は 100M です。
  7. 7. Task Queue の強化 total_storage_limit: 100G queue: - name: default rate: 50/s
  8. 8. Task Queue の強化 Version 1.3.4 までのTask Queue ではアプリケーション 毎に最大 50qps でした
  9. 9. Task Queue の強化 Version 1.3.5 からは queue 毎に最大 50qps 
  10. 10. 高速イメージ配信 blobstore に保存したイメージを高速に配信する仕組 みです。 images.get_serving_url(blob_key, size=None, crop=False) パブリックで推測しずらい URL が生成され、キャッ シュが効きやすいです。 生成された URL は元の blob が存在するうちは ずっと使えます。 URL をいじる事で resize, crop など行えます。 resize や crop にかかる CPU コストは課金されま せん =SXX =SXX-C
  11. 11. 高速イメージ配信 Sample モデル class AlbumImage(db.Model): title = db.StringProperty() original_image_url = db.StringProperty(indexed=False) thumbnail_url = db.StringProperty(indexed=False) created_at = db.DateTimeProperty(auto_now_add=True)
  12. 12. 高速イメージ配信 Sample ハンドラー - フォームとサムネイルを表示 class MainHandler(webapp.RequestHandler): def get(self): upload_url = blobstore.create_upload_url('/upload') self.response.out.write("""<html><body> <form action="%s" method="POST" enctype="multipart/form-data"> Title: <input name="title"><br> Upload File: <input type="file" name="file"><br> <input type="submit" name="submit" value="Submit"> </form>""" % upload_url) album_images = AlbumImage.all().order("-created_at").fetch(5) for album_image in album_images: self.response.out.write(album_image.title + "<br>") self.response.out.write('<a href="%s"><img src="%s"></a><br>' % (album_image.original_image_url, album_image.thumbnail_url)) self.response.out.write("</body></html>")
  13. 13. 高速イメージ配信 Sample ハンドラー - アップロードされた画像を処理 class UploadHandler(blobstore_handlers.BlobstoreUploadHandler): def post(self): # 'file' is file upload field in the form upload_files = self.get_uploads('file') blob_info = upload_files[0] original_image_url = images.get_serving_url(str(blob_info.key())) uploaded_image = AlbumImage( title=self.request.get("title"), original_image_url=original_image_url, thumbnail_url=original_image_url+"=S320" ) uploaded_image.put() self.redirect('/')
  14. 14. カスタムエラーページ app.yaml にて設定できます。 error_handlers: - file: default_error.html - error_code: over_quota file: over_quota.html 有効な error_code over_quota dos_api_denial timeout
  15. 15. 1000件制限 カウントと fetch の limit で 1000 以上指定可能 q = MyModel.all() number = q.count(100000) entries = q.fetch(100000) システムの30秒制限にてタイムアウトする可能性は あります
  16. 16. Multitenancy namespace を指定して実行できるサービス datastore memcache taskqueue 注意: blobstore では namespace を使えません。
  17. 17. Multitenancy google.appengine.api.namespace_manager で namespace を指定できます namespace_manager.set_namespace() namespace_manager.get_namespace() namespace に指定できる文字 [0‑9A‑Za‑z._‑]{0,100} _で始まる namespace はシステム予約
  18. 18. Multitenancy Multitenancy 以外のユースケース ユーザー情報を namespace で分ける 管理用のデータとアプリケーションデータを分ける テストと本番運用でデータストアを分ける ひとつの App Engine スロットで複数のアプリケー ションを運用する
  19. 19. Multitenancy 一時的に namespace を設定したい場合 namespace = namespace_manager.get_namespace() try: namespace_manager.set_namespace('-global-') some_operation() finally: namespace_manager.set_namespace(namespace)
  20. 20. Multitenancy Google Apps のドメインで namespace を分けたい場合のパターン appengine_config.py にて下記のようにします。 from google.appengine.api import namespace_manager # Called only if the current namespace is not set. def namespace_manager_default_namespace_for_request(): # The returned string will be used as the Google Apps domain. return namespace_manager.google_apps_namespace() appengine_config.py ?
  21. 21. appengine_config.py App Engine の設定システム この設定システムはライブラリの動作をそのライブラリの使用者が設 定によって変更できる仕組みです。 google.appengine.api.lib_config.py を読むと使用方法が分かりま す。
  22. 22. appengine_config.py 例えば mylib.py を appengine_config.py 対応にするには mylib.py: from google.appengine.api import lib_config config_handle = lib_config.register( 'mylib', {'do_something': lambda obj: obj}) def do_something(obj): return config_handle.do_something(obj)
  23. 23. appengine_config.py do_something を上書きするには appengine_config.py: def mylib_do_something(obj): # implement as you like # ...
  24. 24. Multitenancy テスト用に namespace を分ける... クラウド上でもユニットテストがしたい http://code.google.com/p/appengine-py-testhelper/wiki/GAETestBase setUp で set_namespace("test") などとすれば良い? でもテストする側のコードで set_namespace("-global-") などとし たらどうなる? ネームスペースを二つに分けて、テスト専用の部分とユーザーラ ンド専用の部分を別々に設定できるようにすれば良い? そこで...
  25. 25. Multitenancy my_namespace_manager.py import os from google.appengine.api import namespace_manager current_namespace = "" test_namespace = "" pattern = "%s--%s" def _set_namespace(): if test_namespace: namespace_manager.set_namespace(pattern % (test_namespace, current_namespace)) else: namespace_manager.set_namespace(current_namespace) def _initialize(): if not namespace_manager.get_namespace(): initialize("") 続く
  26. 26. Multitenancy (続き) def initialize(namespace): global test_namespace, current_namespace current_namespace = namespace test_namespace = "" def get_namespace(): return current_namespace def set_namespace(namespace): global current_namespace _initialize() current_namespace = namespace _set_namespace() def set_test_namespace(namespace): global test_namespace _initialize() test_namespace = namespace _set_namespace()
  27. 27. Multitenancy appengine_config.py では import my_namespace_manager def namespace_manager_default_namespace_for_request(): ns = namespace_manager.google_apps_namespace() my_namespace_manager.initialize(ns) return ns
  28. 28. 知らないかもしれない注意点 平均 1000ms で Response を返すアプリケーション のみ AutoScale します。 実際には 800ms を目指してください。 400ms くらいだと理想的です。 Query per minutes limit 課金をオンにしたアプリケーションの最大 qpm は 500 qps のスパイクをさばける程度に制限さ れています。 それ以上必要なら相談してください。
  29. 29. Thanks Takashi Matsuo Google, Inc. tmatsuo@google.com

×