View
3.927
Download
0
Embed Size (px)
DESCRIPTION
Google App Engine で最近リリースされた機能 1) Task Queue の強化 2) Multitenancy 3) 高速イメージ配信 4)カスタムエラーページ 等について紹介します。
Citation preview
Google App Engine 最新情報松尾 貴史
Google Developer Day2010年9月28日
アジェンダ
自己紹介
Python pre-compilation
Task Queue の強化
高速イメージ配信
カスタムエラーページ
count と query での 1000 件制限の撤廃
Multitenancy
知らないかもしれない注意点
自己紹介
Googleデベロッパーリレーションデベロッパーアドボケイト松尾 貴史[email protected]
Python pre-compilationPython script の事前コンパイルができるようになりました。
やり方は app.yaml に下記2行を追加するだけ
derived_file_type:- python_precompiled
どのくらい変化があるのか?
411ms 621cpu_ms →
Python pre-compilationPython script の事前コンパイルができるようになりました。
やり方は app.yaml に下記2行を追加するだけ
derived_file_type:- python_precompiled
どのくらい変化があるのか?
411ms 621cpu_ms → 247ms 271cpu_ms
Task Queue の強化
queue.yaml で total_storage_limit が指定できるようになりました。下記のように記載します。
total_storage_limit: 100Gqueue:- name: default rate: 50/s
Task Queue で使えるストレージ容量が設定できます。B は byte, K は kilobyte, M は megabyte, G は gigabyte, T は terabyte です。デフォルト値は 100M です。
Task Queue の強化
total_storage_limit: 100Gqueue:- 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 が生成され、キャッシュが効きやすいです。生成された URL は元の blob が存在するうちはずっと使えます。URL をいじる事で resize, crop など行えます。resize や crop にかかる CPU コストは課金されません
=SXX=SXX-C
高速イメージ配信 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)
高速イメージ配信 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>")
高速イメージ配信 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('/')
カスタムエラーページ
app.yaml にて設定できます。
error_handlers: - file: default_error.html
- error_code: over_quota file: over_quota.html
有効な error_codeover_quotados_api_denialtimeout
1000件制限
カウントと fetch の limit で 1000 以上指定可能
q = MyModel.all()number = q.count(100000)
entries = q.fetch(100000)
システムの30秒制限にてタイムアウトする可能性はあります
Multitenancynamespace を指定して実行できるサービス
datastorememcachetaskqueue
注意: blobstore では namespace を使えません。
Multitenancygoogle.appengine.api.namespace_manager で namespace を指定できます
namespace_manager.set_namespace()namespace_manager.get_namespace()
namespace に指定できる文字[0‑9A‑Za‑z._‑]{0,100}_で始まる namespace はシステム予約
MultitenancyMultitenancy 以外のユースケース
ユーザー情報を namespace で分ける管理用のデータとアプリケーションデータを分けるテストと本番運用でデータストアを分けるひとつの App Engine スロットで複数のアプリケーションを運用する
Multitenancy一時的に namespace を設定したい場合
namespace = namespace_manager.get_namespace()try: namespace_manager.set_namespace('-global-') some_operation()finally: namespace_manager.set_namespace(namespace)
MultitenancyGoogle 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 ?
appengine_config.pyApp Engine の設定システム
この設定システムはライブラリの動作をそのライブラリの使用者が設定によって変更できる仕組みです。
google.appengine.api.lib_config.py を読むと使用方法が分かります。
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)
appengine_config.pydo_something を上書きするにはappengine_config.py:
def mylib_do_something(obj): # implement as you like # ...
Multitenancyテスト用に namespace を分ける...
クラウド上でもユニットテストがしたいhttp://code.google.com/p/appengine-py-testhelper/wiki/GAETestBasesetUp で set_namespace("test") などとすれば良い?でもテストする側のコードで set_namespace("-global-") などとしたらどうなる?ネームスペースを二つに分けて、テスト専用の部分とユーザーランド専用の部分を別々に設定できるようにすれば良い?
そこで...
Multitenancymy_namespace_manager.pyimport 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("")
続く
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()
Multitenancyappengine_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
知らないかもしれない注意点
平均 1000ms で Response を返すアプリケーションのみ AutoScale します。
実際には 800ms を目指してください。400ms くらいだと理想的です。
Query per minutes limit課金をオンにしたアプリケーションの最大 qpm は 500 qps のスパイクをさばける程度に制限されています。それ以上必要なら相談してください。
Thanks
Takashi MatsuoGoogle, [email protected]