• Like

Loading…

Flash Player 9 (or above) is needed to view presentations.
We have detected that you do not have it on your computer. To install it, go here.

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

  • 3,352 views
Uploaded on

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

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

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
3,352
On Slideshare
0
From Embeds
0
Number of Embeds
5

Actions

Shares
Downloads
19
Comments
0
Likes
4

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Google App Engine 最新情報 松尾 貴史 Google Developer Day 2010年9月28日
  • 2. アジェンダ 自己紹介 Python pre-compilation Task Queue の強化 高速イメージ配信 カスタムエラーページ count と query での 1000 件制限の撤廃 Multitenancy 知らないかもしれない注意点
  • 3. 自己紹介 Google デベロッパーリレーション デベロッパーアドボケイト 松尾 貴史 tmatsuo@google.com
  • 4. Python pre-compilation Python script の事前コンパイルができるようになりまし た。 やり方は app.yaml に下記2行を追加するだけ derived_file_type: - python_precompiled どのくらい変化があるのか? 411ms 621cpu_ms →
  • 5. Python pre-compilation Python script の事前コンパイルができるようになりまし た。 やり方は app.yaml に下記2行を追加するだけ derived_file_type: - python_precompiled どのくらい変化があるのか? 411ms 621cpu_ms → 247ms 271cpu_ms
  • 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. Task Queue の強化 total_storage_limit: 100G queue: - name: default rate: 50/s
  • 8. Task Queue の強化 Version 1.3.4 までのTask Queue ではアプリケーション 毎に最大 50qps でした
  • 9. Task Queue の強化 Version 1.3.5 からは queue 毎に最大 50qps 
  • 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. 高速イメージ配信 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. 高速イメージ配信 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. 高速イメージ配信 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. カスタムエラーページ 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. 1000件制限 カウントと fetch の limit で 1000 以上指定可能 q = MyModel.all() number = q.count(100000) entries = q.fetch(100000) システムの30秒制限にてタイムアウトする可能性は あります
  • 16. Multitenancy namespace を指定して実行できるサービス datastore memcache taskqueue 注意: blobstore では namespace を使えません。
  • 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. Multitenancy Multitenancy 以外のユースケース ユーザー情報を namespace で分ける 管理用のデータとアプリケーションデータを分ける テストと本番運用でデータストアを分ける ひとつの App Engine スロットで複数のアプリケー ションを運用する
  • 19. Multitenancy 一時的に namespace を設定したい場合 namespace = namespace_manager.get_namespace() try: namespace_manager.set_namespace('-global-') some_operation() finally: namespace_manager.set_namespace(namespace)
  • 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. appengine_config.py App Engine の設定システム この設定システムはライブラリの動作をそのライブラリの使用者が設 定によって変更できる仕組みです。 google.appengine.api.lib_config.py を読むと使用方法が分かりま す。
  • 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. appengine_config.py do_something を上書きするには appengine_config.py: def mylib_do_something(obj): # implement as you like # ...
  • 24. Multitenancy テスト用に namespace を分ける... クラウド上でもユニットテストがしたい http://code.google.com/p/appengine-py-testhelper/wiki/GAETestBase setUp で set_namespace("test") などとすれば良い? でもテストする側のコードで set_namespace("-global-") などとし たらどうなる? ネームスペースを二つに分けて、テスト専用の部分とユーザーラ ンド専用の部分を別々に設定できるようにすれば良い? そこで...
  • 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. 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. 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. 知らないかもしれない注意点 平均 1000ms で Response を返すアプリケーション のみ AutoScale します。 実際には 800ms を目指してください。 400ms くらいだと理想的です。 Query per minutes limit 課金をオンにしたアプリケーションの最大 qpm は 500 qps のスパイクをさばける程度に制限さ れています。 それ以上必要なら相談してください。
  • 29. Thanks Takashi Matsuo Google, Inc. tmatsuo@google.com