SlideShare uma empresa Scribd logo
1 de 40
Baixar para ler offline
Takashi Matsuo
Google, Inc.
Feb 18, 2011
App Engine
                 to infinity and beyond




Takashi Matsuo
Google, Inc.
Feb 18, 2011
自己紹介

松尾貴史 @tmatsuo

  App Engine Developer Advocate
  Kay's Daddy
  http://code.google.com/p/kay-framework/
> 10万 Developers / Month

   > 15万 Apps / Week

 > 10億 Page Views / Day
App Engine のこれまで 3 年 - 進化を続けるプラットフォーム
      Apr 2008   Python launch
      May 2008   Memcache API, Images API
      Jul 2008   Logs export
      Aug 2008   Batch write/delete
      Oct 2008   HTTPS support
      Dec 2008   Status dashboard, quota details
      Feb 2009   Billing, Remote API, Larger HTTP request/response size limits (10MB)
      Apr 2009   Java launch, Bulkloader (DB import), Cron jobs, SDC
      May 2009   Key-only queries, Quota API
      Jun 2009   Task queue API, Django 1.0 support
      Sep 2009   XMPP API, Remote API shell, Django 1.1 support
      Oct 2009   Incoming email
      Dec 2009   Blobstore API
      Feb 2010   Datastore cursors, Async URLfetch, App stats
      Mar 2010   Denial-of-Service filtering, eventual consistency support
      May 2010   OpenID, OAuth, App Engine for Business, new bulkloader
      Aug 2010   Namespaces, increased quotas, high perf image serving
      Oct 2010   Instances console, datastore admin & bulk entity deletes
      Dec 2010   Channel API, 10-minute tasks & cron jobs, AlwaysOn & Warmup
      Jan 2011   High Replication datastore, entity copy b/w apps, 10-minute URLfetch
      Feb 2011   Improved XMPP and Task Queue, Django 1.2 support
ロードマップ

 SSL access on non-appspot.com domains
 Full-text Search over Datastore
 Support for Python 2.7
 Background servers capable of running for longer than 30s
 Support for running MapReduce jobs across App Engine datasets
 Bulk Datastore Import and Export tool
 Improved monitoring and alerting of application serving
 Logging system improvements to remove limits on size and storage
 Raise HTTP request and response size limits
 Integration with Google Storage for Developers
 Programmatic Blob creation in Blobstore
 Quota and presence improvements for Channel API
日本での事例

 たくさんのミクシィアプリ
   the Actress - 60万ユーザー
   Mixi Xmas 2010 - 200万ユーザー
 朝日新聞 - メディア配信サービス
 ソニー - Chan-Toru
 業務用アプリケーションも多数
App Engine for Business とは?

App Engine プラットフォームに加え

  99.9% SLA
  クラウド SQL
  有償サポート
  ドメインコンソール
  Hosted SSL
本あります

プログラミング Google App Engine
http://www.oreilly.co.jp/books/9784873114750/




オープンソース徹底活用 Slim3 on Google App Engine for Java
ISBN-10: 4798026999
アジェンダ

App Engine で開発する際の注意点

  Datastore の設計
  最小限の仕事をする
  Datastore Contention を避ける
     シャーディングカウンター
     Fork-join queue
  Memcache を効果的に使用する
  さらなる高みへ
Datastore の設計

  非正規化 を嫌がらない - No join
  必要な index のみ作成
  最小限の Entity Group
     トランザクションが必要な箇所のみ
  可能なら速い方を使う
     query より keys_only query が速い
     query より get が速い
     複数の get より batch get が速い
  kind の分割が有効なケース
     一部のプロパティだけ取得
  少しの失敗を受け入れる
     リトライ、deadline の指定
Datastore の設計

  非正規化 を嫌がらない - No join
  必要な index のみ作成
  最小限の Entity Group
     トランザクションが必要な箇所のみ
  可能なら速い方を使う
     query より keys_only query が速い
     query より get が速い
     複数の get より batch get が速い
  kind の分割が有効なケース
     一部のプロパティだけ取得
  少しの失敗を受け入れる
     リトライ、deadline の指定
Datastore の設計 - 非正規化
Before
from google.appengine.ext import db

class User(db.Model):
 name = db.StringProperty()
 groups = db.ListProperty(db.Key)

class Group(db.Model):
 name = db.StringProperty()

user = User.get(user_key)
group_names = [group.name for group in db.get(user.groups)]
Datastore の設計 - 非正規化
After
from google.appengine.ext import db

class User(db.Model):
 name = db.StringProperty()
 groups = db.ListProperty(db.Key)
 group_names = db.StringListProperty()

class Group(db.Model):
 name = db.StringProperty()

user = User.get(user_key)
# group_names = user.group_names
Datastore の設計

  非正規化 を嫌がらない - No join
  必要な index のみ作成
  最小限の Entity Group
     トランザクションが必要な箇所のみ
  可能なら速い方を使う
     query より keys_only query が速い
     query より get が速い
     複数の get より batch get が速い
  kind の分割が有効なケース
     一部のプロパティだけ取得
  少しの失敗を受け入れる
     リトライ、deadline の指定
Datastore の設計 - 必要な index のみ作成
from google.appengine.ext import db

class MyModel(db.Model):
 name = db.StringProperty()
 total = db.IntegerProperty(indexed=False)




 index が増えると書き込み速度は遅くなります
Datastore の設計

  非正規化 を嫌がらない - No join
  必要な index のみ作成
  最小限の Entity Group
     トランザクションが必要な箇所のみ
  可能なら速い方を使う
     query より keys_only query が速い
     query より get が速い
     複数の get より batch get が速い
  kind の分割が有効なケース
     一部のプロパティだけ取得
  少しの失敗を受け入れる
     リトライ、deadline の指定
Datastore の設計 - Entity Group
Entity Group 作成の方法
class MyModel(db.Model):
 # ...

# 単純にエンティティを作成すると、それ自体新しい Entity Group になる

my_entity = MyModel()
my_entity.put()

# 親を指定すると、親と同じ Entity Group に属する

my_second_entity = MyModel(parent=my_entity)
my_second_entity.put()

# 同じ kind である必要はない

my_third_entity = MyOtherModel(parent=my_second_entity)
my_third_entity.put()
Datastore の設計 - Entity Group
Entity Group 作成の方法
class MyModel(db.Model):
 # ...

# 単純にエンティティを作成すると、それ自体新しい Entity Group になる

my_entity = MyModel()
my_entity.put()

# 親を指定すると、親と同じ Entity Group に属する

my_second_entity = MyModel(parent=my_entity)
my_second_entity.put()

# 同じ kind である必要はない

my_third_entity = MyOtherModel(parent=my_second_entity)
my_third_entity.put()
Datastore の設計 - Entity Group
  親子関係全てに Entity Group を使用するべきではない
    例えば BlogEntry と Comment には不適切
  基本的にはトランザクションが必要な箇所に使う
  検索用インデックスを自前で作る時などにも有効
Datastore の設計 - Entity Group の使用例
検索用インデックス - Before

class Sentence(db.Model):
 body = db.TextProperty()
 indexes = db.StringListProperty()

query = Sentence.all().filter(
  "indexes =", search_word
)
search_result = query.fetch(20)

fetch 時に不必要な indexes のデシリアライズが発生
Datastore の設計 - Entity Group の使用例
検索用インデックス - After
class Sentence(db.Model):
 body = db.TextProperty()

class SearchIndex(db.Model):
 indexes = db.StringListProperty()

query = SearchIndex.all(keys_only=True).
 filter("indexes =", search_word)
search_result = db.get(
 [key.parent() for key in query.fetch(20)])

保存時に Entity Group を形成
Datastore の設計

  非正規化 を嫌がらない - No join
  必要な index のみ作成
  最小限の Entity Group
     トランザクションが必要な箇所のみ
  可能なら速い方を使う
     query より keys_only query が速い
     query より get が速い
     複数の get より batch get が速い
  kind の分割が有効なケース
     一部のプロパティだけ取得
  少しの失敗を受け入れる
     リトライ、deadline の指定
Datastore の設計

  非正規化 を嫌がらない - No join
  必要な index のみ作成
  最小限の Entity Group
     トランザクションが必要な箇所のみ
  可能なら速い方を使う
     query より keys_only query が速い
     query より get が速い
     複数の get より batch get が速い
  kind の分割が有効なケース
     一部のプロパティだけ取得
  少しの失敗を受け入れる
     リトライ、deadline の指定
Datastore の設計 - Entity 分割

例: ファイルシェアリングサービス
   ファイル自身
   メタデータ

  ファイルの一覧ページで必要なのはメタデータだけ
  ファイル自身とメタデータを別エンティティに分割
  一覧ページでの処理が高速で無駄がなくなる
Datastore の設計

  非正規化 を嫌がらない - No join
  必要な index のみ作成
  最小限の Entity Group
     トランザクションが必要な箇所のみ
  可能なら速い方を使う
     query より keys_only query が速い
     query より get が速い
     複数の get より batch get が速い
  kind の分割が有効なケース
     一部のプロパティだけ取得
  少しの失敗を受け入れる
     リトライ、deadline の指定
Datastore の設計 - リトライ、deadline

from google.appengine.ext import db
from google.appengine.runtime.apiproxy_errors import DeadlineExceededError
from google.appengine.runtime import DeadlineExceededError as D

def somefunction(somevalue):
 handmaid_key = db.Key.from_path("MyModel", 1)
 new_id = db.allocate_ids(handmaid_key, 1)
 new_key = db.Key.from_path("MyModel", new_id)
 my_entity = MyModel(key=new_key, name=somevalue)
 try:
   while True:
   sleep_ms = 100
   try:
     db.put(my_entity, config=db.create_config(deadline=5))
     break
   except (DeadlineExceededError, db.Timeout):
     time.sleep(sleep_ms)
     sleep_ms *= 2
 except D:
   # Ran out of retry. Return an error to users.




自動リトライのレシピ
最小限の仕事をする

大事な用語
 ユーザー向けリクエスト(User Facing Request)
   インターネット側から来るもの全て
 バックグラウンドリクエスト(Background Request)
   TaskQueue, Cron 等

大事なポイント
ユーザー向けリクエストは 1000 ms 以内で返すこと
最小限の仕事をする - より速い方を使用

 query より keys_only query
 query より get
 datastore より memcache
 memcache より global 変数(static 変数)
最小限の仕事をする - Task Queue を使用

  時間のかかる処理は Task Queue に投げる。
  Channel API を使えば結果を簡単にプッシュ
Datastore Contention をさける

Entity または Entity Group に対しての書き込み

目安:  1 秒に 1 度程度
対策:
 Entity Group はなるべく小さくする
 シャーディングカウンターなどのテクニックを使用する
シャーディングカウンター - シンプルな実装例
from google.appengine.ext import db
import random                                                    http://goo.gl/8dGO
class SimpleCounterShard(db.Model):
   """Shards for the counter"""
   count = db.IntegerProperty(required=True, default=0)

NUM_SHARDS = 20

def get_count():
  """Retrieve the value for a given sharded counter."""
  total = 0
  for counter in SimpleCounterShard.all():
     total += counter.count
  return total

def increment():
  """Increment the value for a given sharded counter."""
  def txn():
      index = random.randint(0, NUM_SHARDS - 1)
      shard_name = "shard" + str(index)
      counter = SimpleCounterShard.get_by_key_name(shard_name)
      if counter is None:
          counter = SimpleCounterShard(key_name=shard_name)
      counter.count += 1
      counter.put()
  db.run_in_transaction(txn)
Fork-join queue

Building high-throughput data pipelines with Google App Engine
http://goo.gl/ntlH

シンプルなカウンターの例
http://paste.shehas.net/show/137/
memcache を効果的に使用する

使用例
 人気のあるページを html 丸ごとキャッシュ
 memcache.incr を使用したカウンター
   高速だが 100% 正確とは保証できない
 頻繁に使用される entity や query 結果をキャッシュ
memcache を効果的に使用する

基本パターン

results = memcache.get('results')
if results is None:
  results = some_complex_work()
  memcache.set('results', results)

# use results

古いキャッシュを破棄する
AppStats - パフォーマンス測定用ツール
Before




After




http://goo.gl/eYdhD
さらなる高みへ

 Request 数の Fixed Quota はデフォルト 500 QPS 程度
    それ以上必要な場合は、Quota Increase のフォームから
    申請するか私宛に相談してください
 Tablet Server の Split を抑制
    頻繁に(数百/秒) Entity の作成などを行う場合
        自動採番の id では Split を引き起こしやすい
            uuid などを key_name として使用する
        key_name を使用する場合でも、頭文字が類似だと
        Split が起きやすい
            Hash 値を前置する
まとめ

 Datastore に適した設計
 最小限の仕事をする
 Datastore Contention を避ける
 Memcache を効果的に使用する
 AppStats を使用してパフォーマンス測定する
 Fixed Quota を増やす
 Tablet Server の Split を抑制
無限の彼方へ
Takashi Matsuo
Google, Inc.
e-mail: tmatsuo@google.com
twitter: @tmatsuo

Mais conteúdo relacionado

Mais procurados

ログ管理のベストプラクティス
ログ管理のベストプラクティスログ管理のベストプラクティス
ログ管理のベストプラクティスAkihiro Kuwano
 
Firebaseで驚くほど簡単に作れるリアルタイムイベントドリブンアプリ
Firebaseで驚くほど簡単に作れるリアルタイムイベントドリブンアプリFirebaseで驚くほど簡単に作れるリアルタイムイベントドリブンアプリ
Firebaseで驚くほど簡単に作れるリアルタイムイベントドリブンアプリFumihiko Shiroyama
 
GDG Tokyo Firebaseを使った Androidアプリ開発
GDG Tokyo Firebaseを使った Androidアプリ開発GDG Tokyo Firebaseを使った Androidアプリ開発
GDG Tokyo Firebaseを使った Androidアプリ開発Fumihiko Shiroyama
 
AWS Glueを使った Serverless ETL の実装パターン
AWS Glueを使った Serverless ETL の実装パターンAWS Glueを使った Serverless ETL の実装パターン
AWS Glueを使った Serverless ETL の実装パターンseiichi arai
 
Deep Dive: Amazon DynamoDB (db tech showcase 2016)
Deep Dive: Amazon DynamoDB (db tech showcase 2016) Deep Dive: Amazon DynamoDB (db tech showcase 2016)
Deep Dive: Amazon DynamoDB (db tech showcase 2016) Amazon Web Services Japan
 
Web App for Containers + MySQLでコンテナ対応したRailsアプリを作ろう!
Web App for Containers + MySQLでコンテナ対応したRailsアプリを作ろう!Web App for Containers + MySQLでコンテナ対応したRailsアプリを作ろう!
Web App for Containers + MySQLでコンテナ対応したRailsアプリを作ろう!Yoichi Kawasaki
 
Spring data-rest-and-spring-cloud-contract
Spring data-rest-and-spring-cloud-contractSpring data-rest-and-spring-cloud-contract
Spring data-rest-and-spring-cloud-contractTakeshi Ogawa
 
ゲームのインフラをAwsで実戦tips全て見せます
ゲームのインフラをAwsで実戦tips全て見せますゲームのインフラをAwsで実戦tips全て見せます
ゲームのインフラをAwsで実戦tips全て見せますinfinite_loop
 
Amazon S3を中心とするデータ分析のベストプラクティス
Amazon S3を中心とするデータ分析のベストプラクティスAmazon S3を中心とするデータ分析のベストプラクティス
Amazon S3を中心とするデータ分析のベストプラクティスAmazon Web Services Japan
 
AWS Black Belt Tech シリーズ 2015 - AWS IoT
AWS Black Belt Tech シリーズ 2015 - AWS IoTAWS Black Belt Tech シリーズ 2015 - AWS IoT
AWS Black Belt Tech シリーズ 2015 - AWS IoTAmazon Web Services Japan
 
Apache Arrow 1.0 - A cross-language development platform for in-memory data
Apache Arrow 1.0 - A cross-language development platform for in-memory dataApache Arrow 1.0 - A cross-language development platform for in-memory data
Apache Arrow 1.0 - A cross-language development platform for in-memory dataKouhei Sutou
 
Pydata Amazon Kinesisのご紹介
Pydata Amazon Kinesisのご紹介Pydata Amazon Kinesisのご紹介
Pydata Amazon Kinesisのご紹介Toshiaki Enami
 
今からでも大丈夫!Firebase入門
今からでも大丈夫!Firebase入門今からでも大丈夫!Firebase入門
今からでも大丈夫!Firebase入門Tomoki Koga
 
AWS Black Belt Tech Webinar 2016 〜 Amazon CloudSearch & Amazon Elasticsearch ...
AWS Black Belt Tech Webinar 2016 〜 Amazon CloudSearch & Amazon Elasticsearch ...AWS Black Belt Tech Webinar 2016 〜 Amazon CloudSearch & Amazon Elasticsearch ...
AWS Black Belt Tech Webinar 2016 〜 Amazon CloudSearch & Amazon Elasticsearch ...Amazon Web Services Japan
 
Kinesis Analyticsの適用できない用途と、Kinesis Firehoseの苦労話
Kinesis Analyticsの適用できない用途と、Kinesis Firehoseの苦労話Kinesis Analyticsの適用できない用途と、Kinesis Firehoseの苦労話
Kinesis Analyticsの適用できない用途と、Kinesis Firehoseの苦労話Sotaro Kimura
 
Python を使ってカメリオを高速化した話
Python を使ってカメリオを高速化した話Python を使ってカメリオを高速化した話
Python を使ってカメリオを高速化した話Nozomu Kaneko
 

Mais procurados (20)

ログ管理のベストプラクティス
ログ管理のベストプラクティスログ管理のベストプラクティス
ログ管理のベストプラクティス
 
Firebaseで驚くほど簡単に作れるリアルタイムイベントドリブンアプリ
Firebaseで驚くほど簡単に作れるリアルタイムイベントドリブンアプリFirebaseで驚くほど簡単に作れるリアルタイムイベントドリブンアプリ
Firebaseで驚くほど簡単に作れるリアルタイムイベントドリブンアプリ
 
GDG Tokyo Firebaseを使った Androidアプリ開発
GDG Tokyo Firebaseを使った Androidアプリ開発GDG Tokyo Firebaseを使った Androidアプリ開発
GDG Tokyo Firebaseを使った Androidアプリ開発
 
AWS Glueを使った Serverless ETL の実装パターン
AWS Glueを使った Serverless ETL の実装パターンAWS Glueを使った Serverless ETL の実装パターン
AWS Glueを使った Serverless ETL の実装パターン
 
Deep Dive: Amazon DynamoDB (db tech showcase 2016)
Deep Dive: Amazon DynamoDB (db tech showcase 2016) Deep Dive: Amazon DynamoDB (db tech showcase 2016)
Deep Dive: Amazon DynamoDB (db tech showcase 2016)
 
Web App for Containers + MySQLでコンテナ対応したRailsアプリを作ろう!
Web App for Containers + MySQLでコンテナ対応したRailsアプリを作ろう!Web App for Containers + MySQLでコンテナ対応したRailsアプリを作ろう!
Web App for Containers + MySQLでコンテナ対応したRailsアプリを作ろう!
 
Spring data-rest-and-spring-cloud-contract
Spring data-rest-and-spring-cloud-contractSpring data-rest-and-spring-cloud-contract
Spring data-rest-and-spring-cloud-contract
 
ゲームのインフラをAwsで実戦tips全て見せます
ゲームのインフラをAwsで実戦tips全て見せますゲームのインフラをAwsで実戦tips全て見せます
ゲームのインフラをAwsで実戦tips全て見せます
 
Amazon S3を中心とするデータ分析のベストプラクティス
Amazon S3を中心とするデータ分析のベストプラクティスAmazon S3を中心とするデータ分析のベストプラクティス
Amazon S3を中心とするデータ分析のベストプラクティス
 
AWS Black Belt Tech シリーズ 2015 - AWS IoT
AWS Black Belt Tech シリーズ 2015 - AWS IoTAWS Black Belt Tech シリーズ 2015 - AWS IoT
AWS Black Belt Tech シリーズ 2015 - AWS IoT
 
Apache Arrow
Apache ArrowApache Arrow
Apache Arrow
 
Apache Arrow
Apache ArrowApache Arrow
Apache Arrow
 
Apache Arrow 1.0 - A cross-language development platform for in-memory data
Apache Arrow 1.0 - A cross-language development platform for in-memory dataApache Arrow 1.0 - A cross-language development platform for in-memory data
Apache Arrow 1.0 - A cross-language development platform for in-memory data
 
Pydata Amazon Kinesisのご紹介
Pydata Amazon Kinesisのご紹介Pydata Amazon Kinesisのご紹介
Pydata Amazon Kinesisのご紹介
 
今からでも大丈夫!Firebase入門
今からでも大丈夫!Firebase入門今からでも大丈夫!Firebase入門
今からでも大丈夫!Firebase入門
 
AWS Black Belt Tech Webinar 2016 〜 Amazon CloudSearch & Amazon Elasticsearch ...
AWS Black Belt Tech Webinar 2016 〜 Amazon CloudSearch & Amazon Elasticsearch ...AWS Black Belt Tech Webinar 2016 〜 Amazon CloudSearch & Amazon Elasticsearch ...
AWS Black Belt Tech Webinar 2016 〜 Amazon CloudSearch & Amazon Elasticsearch ...
 
HCL Nomad と OCR
HCL Nomad と OCRHCL Nomad と OCR
HCL Nomad と OCR
 
Apache Arrow 2019
Apache Arrow 2019Apache Arrow 2019
Apache Arrow 2019
 
Kinesis Analyticsの適用できない用途と、Kinesis Firehoseの苦労話
Kinesis Analyticsの適用できない用途と、Kinesis Firehoseの苦労話Kinesis Analyticsの適用できない用途と、Kinesis Firehoseの苦労話
Kinesis Analyticsの適用できない用途と、Kinesis Firehoseの苦労話
 
Python を使ってカメリオを高速化した話
Python を使ってカメリオを高速化した話Python を使ってカメリオを高速化した話
Python を使ってカメリオを高速化した話
 

Destaque

SBS2008の管理のポイント
SBS2008の管理のポイントSBS2008の管理のポイント
SBS2008の管理のポイントMasaya Sawada
 
презентация я и вика
презентация   я и викапрезентация   я и вика
презентация я и викаdianaivika
 
Díptico Sambito inglés
Díptico Sambito inglésDíptico Sambito inglés
Díptico Sambito inglésSambito
 
Казань
КазаньКазань
КазаньMarina
 
Renaissance of the Teachers
Renaissance of the TeachersRenaissance of the Teachers
Renaissance of the TeachersAndeel Ali
 
Selvvalgt fordypningsemne norsk
Selvvalgt fordypningsemne norskSelvvalgt fordypningsemne norsk
Selvvalgt fordypningsemne norskannbek
 
Oracle virtual server-2-t0-3-upgrade
Oracle virtual server-2-t0-3-upgradeOracle virtual server-2-t0-3-upgrade
Oracle virtual server-2-t0-3-upgradeRavi Kumar Lanke
 
Исследование потребительских расходов "Новый год и Рождество 2015"
Исследование потребительских расходов "Новый год и Рождество 2015"Исследование потребительских расходов "Новый год и Рождество 2015"
Исследование потребительских расходов "Новый год и Рождество 2015"Segrey Nikishov - @n_grey
 
Haiti 10 days of caring
Haiti 10 days of caringHaiti 10 days of caring
Haiti 10 days of caringjrendle
 
[HQ Nacional] Street Fighter II Ano I - Número 1 - parte 2
[HQ Nacional] Street Fighter II   Ano I - Número 1 - parte 2[HQ Nacional] Street Fighter II   Ano I - Número 1 - parte 2
[HQ Nacional] Street Fighter II Ano I - Número 1 - parte 2Santuário do Mestre Ryu
 
Library Project Stored Procs
Library Project Stored ProcsLibrary Project Stored Procs
Library Project Stored Procsnwbgh
 
Poletne novosti z druzbenih omrezij_Marketing Magazin_sep2016_st.423_str.54-56
Poletne novosti z druzbenih omrezij_Marketing Magazin_sep2016_st.423_str.54-56Poletne novosti z druzbenih omrezij_Marketing Magazin_sep2016_st.423_str.54-56
Poletne novosti z druzbenih omrezij_Marketing Magazin_sep2016_st.423_str.54-56Urska Saletinger
 
Конфликт между Ираном и Саудовской Аравией
Конфликт между Ираном и Саудовской АравиейКонфликт между Ираном и Саудовской Аравией
Конфликт между Ираном и Саудовской АравиейRthaji
 
An Overview Of World Cat Navigator Slides
An Overview Of World Cat Navigator SlidesAn Overview Of World Cat Navigator Slides
An Overview Of World Cat Navigator SlidesSue Bennett
 

Destaque (20)

Information Technology Tree
Information Technology TreeInformation Technology Tree
Information Technology Tree
 
Family Court
Family CourtFamily Court
Family Court
 
Euros pp
Euros ppEuros pp
Euros pp
 
SBS2008の管理のポイント
SBS2008の管理のポイントSBS2008の管理のポイント
SBS2008の管理のポイント
 
Erkende maatregelen uit het Activiteitenbesluit
Erkende maatregelen uit het Activiteitenbesluit Erkende maatregelen uit het Activiteitenbesluit
Erkende maatregelen uit het Activiteitenbesluit
 
презентация я и вика
презентация   я и викапрезентация   я и вика
презентация я и вика
 
Díptico Sambito inglés
Díptico Sambito inglésDíptico Sambito inglés
Díptico Sambito inglés
 
Казань
КазаньКазань
Казань
 
Renaissance of the Teachers
Renaissance of the TeachersRenaissance of the Teachers
Renaissance of the Teachers
 
Selvvalgt fordypningsemne norsk
Selvvalgt fordypningsemne norskSelvvalgt fordypningsemne norsk
Selvvalgt fordypningsemne norsk
 
College SIOB Mediacoach - John Leek - April 15th 2013
College SIOB Mediacoach - John Leek - April 15th 2013College SIOB Mediacoach - John Leek - April 15th 2013
College SIOB Mediacoach - John Leek - April 15th 2013
 
Oracle virtual server-2-t0-3-upgrade
Oracle virtual server-2-t0-3-upgradeOracle virtual server-2-t0-3-upgrade
Oracle virtual server-2-t0-3-upgrade
 
Monogràfic facebook
Monogràfic facebookMonogràfic facebook
Monogràfic facebook
 
Исследование потребительских расходов "Новый год и Рождество 2015"
Исследование потребительских расходов "Новый год и Рождество 2015"Исследование потребительских расходов "Новый год и Рождество 2015"
Исследование потребительских расходов "Новый год и Рождество 2015"
 
Haiti 10 days of caring
Haiti 10 days of caringHaiti 10 days of caring
Haiti 10 days of caring
 
[HQ Nacional] Street Fighter II Ano I - Número 1 - parte 2
[HQ Nacional] Street Fighter II   Ano I - Número 1 - parte 2[HQ Nacional] Street Fighter II   Ano I - Número 1 - parte 2
[HQ Nacional] Street Fighter II Ano I - Número 1 - parte 2
 
Library Project Stored Procs
Library Project Stored ProcsLibrary Project Stored Procs
Library Project Stored Procs
 
Poletne novosti z druzbenih omrezij_Marketing Magazin_sep2016_st.423_str.54-56
Poletne novosti z druzbenih omrezij_Marketing Magazin_sep2016_st.423_str.54-56Poletne novosti z druzbenih omrezij_Marketing Magazin_sep2016_st.423_str.54-56
Poletne novosti z druzbenih omrezij_Marketing Magazin_sep2016_st.423_str.54-56
 
Конфликт между Ираном и Саудовской Аравией
Конфликт между Ираном и Саудовской АравиейКонфликт между Ираном и Саудовской Аравией
Конфликт между Ираном и Саудовской Аравией
 
An Overview Of World Cat Navigator Slides
An Overview Of World Cat Navigator SlidesAn Overview Of World Cat Navigator Slides
An Overview Of World Cat Navigator Slides
 

Semelhante a 【18-C-4】Google App Engine - 無限の彼方へ

Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例Yoshifumi Kawai
 
20190514 Smart Store - Azure servlerless architecture
20190514 Smart Store - Azure servlerless architecture20190514 Smart Store - Azure servlerless architecture
20190514 Smart Store - Azure servlerless architectureIssei Hiraoka
 
Smart Store サーバーレスアーキテクチャ編
Smart Store サーバーレスアーキテクチャ編Smart Store サーバーレスアーキテクチャ編
Smart Store サーバーレスアーキテクチャ編Microsoft Azure Japan
 
Google Developer Day 2010 Japan: Google App Engine についての最新情報 (松尾貴史)
Google Developer Day 2010 Japan: Google App Engine についての最新情報 (松尾貴史)Google Developer Day 2010 Japan: Google App Engine についての最新情報 (松尾貴史)
Google Developer Day 2010 Japan: Google App Engine についての最新情報 (松尾貴史)Google Developer Relations Team
 
ASP.NET シングル ページ アプリケーション (SPA) 詳説
ASP.NET シングル ページ アプリケーション (SPA) 詳説ASP.NET シングル ページ アプリケーション (SPA) 詳説
ASP.NET シングル ページ アプリケーション (SPA) 詳説Akira Inoue
 
Let's build a simple app with .net 6 asp.net core web api, react, and elasti...
Let's build a simple app with  .net 6 asp.net core web api, react, and elasti...Let's build a simple app with  .net 6 asp.net core web api, react, and elasti...
Let's build a simple app with .net 6 asp.net core web api, react, and elasti...Shotaro Suzuki
 
AppExchangeパートナー&デベロッパー第2部:20070523版
AppExchangeパートナー&デベロッパー第2部:20070523版AppExchangeパートナー&デベロッパー第2部:20070523版
AppExchangeパートナー&デベロッパー第2部:20070523版Junichiro Tasaki
 
Inside mobage platform
Inside mobage platformInside mobage platform
Inside mobage platformToru Yamaguchi
 
Azure Machine Learning Services 概要 - 2019年3月版
Azure Machine Learning Services 概要 - 2019年3月版Azure Machine Learning Services 概要 - 2019年3月版
Azure Machine Learning Services 概要 - 2019年3月版Daiyu Hatakeyama
 
データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回Naoyuki Yamada
 
Elastic on Azure Integration & Building React UI Based Search App Using Azure...
Elastic on Azure Integration & Building React UI Based Search App Using Azure...Elastic on Azure Integration & Building React UI Based Search App Using Azure...
Elastic on Azure Integration & Building React UI Based Search App Using Azure...Shotaro Suzuki
 
[Cloud OnAir] BigQuery の仕組みからベストプラクティスまでのご紹介 2018年9月6日 放送
[Cloud OnAir] BigQuery の仕組みからベストプラクティスまでのご紹介 2018年9月6日 放送[Cloud OnAir] BigQuery の仕組みからベストプラクティスまでのご紹介 2018年9月6日 放送
[Cloud OnAir] BigQuery の仕組みからベストプラクティスまでのご紹介 2018年9月6日 放送Google Cloud Platform - Japan
 
[Cloud OnAir] 最新アップデート Google Cloud データ関連ソリューション 2020年5月14日 放送
[Cloud OnAir] 最新アップデート Google Cloud データ関連ソリューション 2020年5月14日 放送[Cloud OnAir] 最新アップデート Google Cloud データ関連ソリューション 2020年5月14日 放送
[Cloud OnAir] 最新アップデート Google Cloud データ関連ソリューション 2020年5月14日 放送Google Cloud Platform - Japan
 
Apexコアデベロッパーセミナー070726 配布用
Apexコアデベロッパーセミナー070726 配布用Apexコアデベロッパーセミナー070726 配布用
Apexコアデベロッパーセミナー070726 配布用stomita
 
キャバァーン! サツバツエアアイオー弐〇壱弐
キャバァーン! サツバツエアアイオー弐〇壱弐キャバァーン! サツバツエアアイオー弐〇壱弐
キャバァーン! サツバツエアアイオー弐〇壱弐Kei Nakazawa
 
Gpu accelerates aimodeldevelopmentandanalyticsutilizingelasticsearchandazure ai
Gpu accelerates aimodeldevelopmentandanalyticsutilizingelasticsearchandazure aiGpu accelerates aimodeldevelopmentandanalyticsutilizingelasticsearchandazure ai
Gpu accelerates aimodeldevelopmentandanalyticsutilizingelasticsearchandazure aiShotaro Suzuki
 
初めての Data API CMS どうでしょう - 仙台編 -
初めての Data API   CMS どうでしょう - 仙台編 -初めての Data API   CMS どうでしょう - 仙台編 -
初めての Data API CMS どうでしょう - 仙台編 -Yuji Takayama
 
Chrome Extensionsの基本とデザインパターン
Chrome Extensionsの基本とデザインパターンChrome Extensionsの基本とデザインパターン
Chrome Extensionsの基本とデザインパターンYoichiro Tanaka
 
Geeklog2.1新機能紹介 20140723
Geeklog2.1新機能紹介 20140723Geeklog2.1新機能紹介 20140723
Geeklog2.1新機能紹介 20140723Tetsuko Komma
 

Semelhante a 【18-C-4】Google App Engine - 無限の彼方へ (20)

Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
 
20190514 Smart Store - Azure servlerless architecture
20190514 Smart Store - Azure servlerless architecture20190514 Smart Store - Azure servlerless architecture
20190514 Smart Store - Azure servlerless architecture
 
Smart Store サーバーレスアーキテクチャ編
Smart Store サーバーレスアーキテクチャ編Smart Store サーバーレスアーキテクチャ編
Smart Store サーバーレスアーキテクチャ編
 
Google Developer Day 2010 Japan: Google App Engine についての最新情報 (松尾貴史)
Google Developer Day 2010 Japan: Google App Engine についての最新情報 (松尾貴史)Google Developer Day 2010 Japan: Google App Engine についての最新情報 (松尾貴史)
Google Developer Day 2010 Japan: Google App Engine についての最新情報 (松尾貴史)
 
ASP.NET シングル ページ アプリケーション (SPA) 詳説
ASP.NET シングル ページ アプリケーション (SPA) 詳説ASP.NET シングル ページ アプリケーション (SPA) 詳説
ASP.NET シングル ページ アプリケーション (SPA) 詳説
 
Let's build a simple app with .net 6 asp.net core web api, react, and elasti...
Let's build a simple app with  .net 6 asp.net core web api, react, and elasti...Let's build a simple app with  .net 6 asp.net core web api, react, and elasti...
Let's build a simple app with .net 6 asp.net core web api, react, and elasti...
 
AppExchangeパートナー&デベロッパー第2部:20070523版
AppExchangeパートナー&デベロッパー第2部:20070523版AppExchangeパートナー&デベロッパー第2部:20070523版
AppExchangeパートナー&デベロッパー第2部:20070523版
 
Inside mobage platform
Inside mobage platformInside mobage platform
Inside mobage platform
 
Azure Machine Learning Services 概要 - 2019年3月版
Azure Machine Learning Services 概要 - 2019年3月版Azure Machine Learning Services 概要 - 2019年3月版
Azure Machine Learning Services 概要 - 2019年3月版
 
データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回
 
Elastic on Azure Integration & Building React UI Based Search App Using Azure...
Elastic on Azure Integration & Building React UI Based Search App Using Azure...Elastic on Azure Integration & Building React UI Based Search App Using Azure...
Elastic on Azure Integration & Building React UI Based Search App Using Azure...
 
[Cloud OnAir] BigQuery の仕組みからベストプラクティスまでのご紹介 2018年9月6日 放送
[Cloud OnAir] BigQuery の仕組みからベストプラクティスまでのご紹介 2018年9月6日 放送[Cloud OnAir] BigQuery の仕組みからベストプラクティスまでのご紹介 2018年9月6日 放送
[Cloud OnAir] BigQuery の仕組みからベストプラクティスまでのご紹介 2018年9月6日 放送
 
BPStudy20121221
BPStudy20121221BPStudy20121221
BPStudy20121221
 
[Cloud OnAir] 最新アップデート Google Cloud データ関連ソリューション 2020年5月14日 放送
[Cloud OnAir] 最新アップデート Google Cloud データ関連ソリューション 2020年5月14日 放送[Cloud OnAir] 最新アップデート Google Cloud データ関連ソリューション 2020年5月14日 放送
[Cloud OnAir] 最新アップデート Google Cloud データ関連ソリューション 2020年5月14日 放送
 
Apexコアデベロッパーセミナー070726 配布用
Apexコアデベロッパーセミナー070726 配布用Apexコアデベロッパーセミナー070726 配布用
Apexコアデベロッパーセミナー070726 配布用
 
キャバァーン! サツバツエアアイオー弐〇壱弐
キャバァーン! サツバツエアアイオー弐〇壱弐キャバァーン! サツバツエアアイオー弐〇壱弐
キャバァーン! サツバツエアアイオー弐〇壱弐
 
Gpu accelerates aimodeldevelopmentandanalyticsutilizingelasticsearchandazure ai
Gpu accelerates aimodeldevelopmentandanalyticsutilizingelasticsearchandazure aiGpu accelerates aimodeldevelopmentandanalyticsutilizingelasticsearchandazure ai
Gpu accelerates aimodeldevelopmentandanalyticsutilizingelasticsearchandazure ai
 
初めての Data API CMS どうでしょう - 仙台編 -
初めての Data API   CMS どうでしょう - 仙台編 -初めての Data API   CMS どうでしょう - 仙台編 -
初めての Data API CMS どうでしょう - 仙台編 -
 
Chrome Extensionsの基本とデザインパターン
Chrome Extensionsの基本とデザインパターンChrome Extensionsの基本とデザインパターン
Chrome Extensionsの基本とデザインパターン
 
Geeklog2.1新機能紹介 20140723
Geeklog2.1新機能紹介 20140723Geeklog2.1新機能紹介 20140723
Geeklog2.1新機能紹介 20140723
 

Mais de Developers Summit

【18-A-2】ゲーミフィケーション・エバンジェリストが見る「あなたの技術力が“ワクワクするサービス”に変わる未来」
【18-A-2】ゲーミフィケーション・エバンジェリストが見る「あなたの技術力が“ワクワクするサービス”に変わる未来」【18-A-2】ゲーミフィケーション・エバンジェリストが見る「あなたの技術力が“ワクワクするサービス”に変わる未来」
【18-A-2】ゲーミフィケーション・エバンジェリストが見る「あなたの技術力が“ワクワクするサービス”に変わる未来」Developers Summit
 
【C-2・小林様】AIとAPIがITインフラにもたらす変化 ~プログラマブルなクラウド型Wi-Fi~
【C-2・小林様】AIとAPIがITインフラにもたらす変化 ~プログラマブルなクラウド型Wi-Fi~【C-2・小林様】AIとAPIがITインフラにもたらす変化 ~プログラマブルなクラウド型Wi-Fi~
【C-2・小林様】AIとAPIがITインフラにもたらす変化 ~プログラマブルなクラウド型Wi-Fi~Developers Summit
 
【C-2・醍醐様】AIとAPIがITインフラにもたらす変化 ~プログラマブルなクラウド型Wi-Fi~
【C-2・醍醐様】AIとAPIがITインフラにもたらす変化 ~プログラマブルなクラウド型Wi-Fi~【C-2・醍醐様】AIとAPIがITインフラにもたらす変化 ~プログラマブルなクラウド型Wi-Fi~
【C-2・醍醐様】AIとAPIがITインフラにもたらす変化 ~プログラマブルなクラウド型Wi-Fi~Developers Summit
 
【B-4】オープンソース開発で、フリー静的解析ツールを使ってみる
【B-4】オープンソース開発で、フリー静的解析ツールを使ってみる【B-4】オープンソース開発で、フリー静的解析ツールを使ってみる
【B-4】オープンソース開発で、フリー静的解析ツールを使ってみるDevelopers Summit
 
【B-6】Androidスマホの生体認証の脆弱性、調べてみたらよくある話だった。
【B-6】Androidスマホの生体認証の脆弱性、調べてみたらよくある話だった。【B-6】Androidスマホの生体認証の脆弱性、調べてみたらよくある話だった。
【B-6】Androidスマホの生体認証の脆弱性、調べてみたらよくある話だった。Developers Summit
 
【13-B-6】Hondaの生産技術屋さんがソフトウェア開発でアジャイルを初導入し組織変革に挑戦
【13-B-6】Hondaの生産技術屋さんがソフトウェア開発でアジャイルを初導入し組織変革に挑戦【13-B-6】Hondaの生産技術屋さんがソフトウェア開発でアジャイルを初導入し組織変革に挑戦
【13-B-6】Hondaの生産技術屋さんがソフトウェア開発でアジャイルを初導入し組織変革に挑戦Developers Summit
 
【15-E-7】セキュアな環境でDevOpsを実現する厳選ツール
【15-E-7】セキュアな環境でDevOpsを実現する厳選ツール【15-E-7】セキュアな環境でDevOpsを実現する厳選ツール
【15-E-7】セキュアな環境でDevOpsを実現する厳選ツールDevelopers Summit
 
【15-E-7】セキュアな環境でDevOpsを実現する厳選ツール
【15-E-7】セキュアな環境でDevOpsを実現する厳選ツール【15-E-7】セキュアな環境でDevOpsを実現する厳選ツール
【15-E-7】セキュアな環境でDevOpsを実現する厳選ツールDevelopers Summit
 
【14-E-3】セキュリティ・テストの自動化によるDevSecOpsの実現 (デモ有)
【14-E-3】セキュリティ・テストの自動化によるDevSecOpsの実現 (デモ有)【14-E-3】セキュリティ・テストの自動化によるDevSecOpsの実現 (デモ有)
【14-E-3】セキュリティ・テストの自動化によるDevSecOpsの実現 (デモ有)Developers Summit
 
【15-D-2】デンソーのMaaS開発~アジャイル開発で顧客との協調・チームビルディング・実装概要~
【15-D-2】デンソーのMaaS開発~アジャイル開発で顧客との協調・チームビルディング・実装概要~【15-D-2】デンソーのMaaS開発~アジャイル開発で顧客との協調・チームビルディング・実装概要~
【15-D-2】デンソーのMaaS開発~アジャイル開発で顧客との協調・チームビルディング・実装概要~Developers Summit
 
【14-C-8】みんなの暮らしを支えるAmazon S3の裏側、お伝えします
【14-C-8】みんなの暮らしを支えるAmazon S3の裏側、お伝えします【14-C-8】みんなの暮らしを支えるAmazon S3の裏側、お伝えします
【14-C-8】みんなの暮らしを支えるAmazon S3の裏側、お伝えしますDevelopers Summit
 
【14-C-7】コンピュータビジョンを支える深層学習技術の新潮流
【14-C-7】コンピュータビジョンを支える深層学習技術の新潮流【14-C-7】コンピュータビジョンを支える深層学習技術の新潮流
【14-C-7】コンピュータビジョンを支える深層学習技術の新潮流Developers Summit
 
【15-B-7】無意味なアラートからの脱却 ~ Datadogを使ってモダンなモニタリングを始めよう ~
【15-B-7】無意味なアラートからの脱却 ~ Datadogを使ってモダンなモニタリングを始めよう ~【15-B-7】無意味なアラートからの脱却 ~ Datadogを使ってモダンなモニタリングを始めよう ~
【15-B-7】無意味なアラートからの脱却 ~ Datadogを使ってモダンなモニタリングを始めよう ~Developers Summit
 
【15-A-1】ドラゴンクエストXを支える失敗事例
【15-A-1】ドラゴンクエストXを支える失敗事例【15-A-1】ドラゴンクエストXを支える失敗事例
【15-A-1】ドラゴンクエストXを支える失敗事例Developers Summit
 
【15-A-5】ゲーミフィケーションエバンジェリストが説く、アプリ開発で見落としがちな「おもてなし」とは~面白さを伝える × 面白く魅せる~
【15-A-5】ゲーミフィケーションエバンジェリストが説く、アプリ開発で見落としがちな「おもてなし」とは~面白さを伝える × 面白く魅せる~【15-A-5】ゲーミフィケーションエバンジェリストが説く、アプリ開発で見落としがちな「おもてなし」とは~面白さを伝える × 面白く魅せる~
【15-A-5】ゲーミフィケーションエバンジェリストが説く、アプリ開発で見落としがちな「おもてなし」とは~面白さを伝える × 面白く魅せる~Developers Summit
 
【B-2】福岡発Node.jsで支える大規模システム!〜「誰ガ為のアルケミスト」と歩んだ三年〜
【B-2】福岡発Node.jsで支える大規模システム!〜「誰ガ為のアルケミスト」と歩んだ三年〜【B-2】福岡発Node.jsで支える大規模システム!〜「誰ガ為のアルケミスト」と歩んだ三年〜
【B-2】福岡発Node.jsで支える大規模システム!〜「誰ガ為のアルケミスト」と歩んだ三年〜Developers Summit
 
【B-5】モダンな開発を実現するツールチェーンのご紹介
【B-5】モダンな開発を実現するツールチェーンのご紹介【B-5】モダンな開発を実現するツールチェーンのご紹介
【B-5】モダンな開発を実現するツールチェーンのご紹介Developers Summit
 
【C-2】メモリも、僕のキャパシティも溢れっぱなし。。2年目エンジニアが実現した機械学習
【C-2】メモリも、僕のキャパシティも溢れっぱなし。。2年目エンジニアが実現した機械学習【C-2】メモリも、僕のキャパシティも溢れっぱなし。。2年目エンジニアが実現した機械学習
【C-2】メモリも、僕のキャパシティも溢れっぱなし。。2年目エンジニアが実現した機械学習Developers Summit
 
【A-2】とあるマーケティング部隊とデータエンジニアのデータドリブンへの道
【A-2】とあるマーケティング部隊とデータエンジニアのデータドリブンへの道【A-2】とあるマーケティング部隊とデータエンジニアのデータドリブンへの道
【A-2】とあるマーケティング部隊とデータエンジニアのデータドリブンへの道Developers Summit
 
【B-2】AI時代におけるエンジニアの生存戦略
【B-2】AI時代におけるエンジニアの生存戦略【B-2】AI時代におけるエンジニアの生存戦略
【B-2】AI時代におけるエンジニアの生存戦略Developers Summit
 

Mais de Developers Summit (20)

【18-A-2】ゲーミフィケーション・エバンジェリストが見る「あなたの技術力が“ワクワクするサービス”に変わる未来」
【18-A-2】ゲーミフィケーション・エバンジェリストが見る「あなたの技術力が“ワクワクするサービス”に変わる未来」【18-A-2】ゲーミフィケーション・エバンジェリストが見る「あなたの技術力が“ワクワクするサービス”に変わる未来」
【18-A-2】ゲーミフィケーション・エバンジェリストが見る「あなたの技術力が“ワクワクするサービス”に変わる未来」
 
【C-2・小林様】AIとAPIがITインフラにもたらす変化 ~プログラマブルなクラウド型Wi-Fi~
【C-2・小林様】AIとAPIがITインフラにもたらす変化 ~プログラマブルなクラウド型Wi-Fi~【C-2・小林様】AIとAPIがITインフラにもたらす変化 ~プログラマブルなクラウド型Wi-Fi~
【C-2・小林様】AIとAPIがITインフラにもたらす変化 ~プログラマブルなクラウド型Wi-Fi~
 
【C-2・醍醐様】AIとAPIがITインフラにもたらす変化 ~プログラマブルなクラウド型Wi-Fi~
【C-2・醍醐様】AIとAPIがITインフラにもたらす変化 ~プログラマブルなクラウド型Wi-Fi~【C-2・醍醐様】AIとAPIがITインフラにもたらす変化 ~プログラマブルなクラウド型Wi-Fi~
【C-2・醍醐様】AIとAPIがITインフラにもたらす変化 ~プログラマブルなクラウド型Wi-Fi~
 
【B-4】オープンソース開発で、フリー静的解析ツールを使ってみる
【B-4】オープンソース開発で、フリー静的解析ツールを使ってみる【B-4】オープンソース開発で、フリー静的解析ツールを使ってみる
【B-4】オープンソース開発で、フリー静的解析ツールを使ってみる
 
【B-6】Androidスマホの生体認証の脆弱性、調べてみたらよくある話だった。
【B-6】Androidスマホの生体認証の脆弱性、調べてみたらよくある話だった。【B-6】Androidスマホの生体認証の脆弱性、調べてみたらよくある話だった。
【B-6】Androidスマホの生体認証の脆弱性、調べてみたらよくある話だった。
 
【13-B-6】Hondaの生産技術屋さんがソフトウェア開発でアジャイルを初導入し組織変革に挑戦
【13-B-6】Hondaの生産技術屋さんがソフトウェア開発でアジャイルを初導入し組織変革に挑戦【13-B-6】Hondaの生産技術屋さんがソフトウェア開発でアジャイルを初導入し組織変革に挑戦
【13-B-6】Hondaの生産技術屋さんがソフトウェア開発でアジャイルを初導入し組織変革に挑戦
 
【15-E-7】セキュアな環境でDevOpsを実現する厳選ツール
【15-E-7】セキュアな環境でDevOpsを実現する厳選ツール【15-E-7】セキュアな環境でDevOpsを実現する厳選ツール
【15-E-7】セキュアな環境でDevOpsを実現する厳選ツール
 
【15-E-7】セキュアな環境でDevOpsを実現する厳選ツール
【15-E-7】セキュアな環境でDevOpsを実現する厳選ツール【15-E-7】セキュアな環境でDevOpsを実現する厳選ツール
【15-E-7】セキュアな環境でDevOpsを実現する厳選ツール
 
【14-E-3】セキュリティ・テストの自動化によるDevSecOpsの実現 (デモ有)
【14-E-3】セキュリティ・テストの自動化によるDevSecOpsの実現 (デモ有)【14-E-3】セキュリティ・テストの自動化によるDevSecOpsの実現 (デモ有)
【14-E-3】セキュリティ・テストの自動化によるDevSecOpsの実現 (デモ有)
 
【15-D-2】デンソーのMaaS開発~アジャイル開発で顧客との協調・チームビルディング・実装概要~
【15-D-2】デンソーのMaaS開発~アジャイル開発で顧客との協調・チームビルディング・実装概要~【15-D-2】デンソーのMaaS開発~アジャイル開発で顧客との協調・チームビルディング・実装概要~
【15-D-2】デンソーのMaaS開発~アジャイル開発で顧客との協調・チームビルディング・実装概要~
 
【14-C-8】みんなの暮らしを支えるAmazon S3の裏側、お伝えします
【14-C-8】みんなの暮らしを支えるAmazon S3の裏側、お伝えします【14-C-8】みんなの暮らしを支えるAmazon S3の裏側、お伝えします
【14-C-8】みんなの暮らしを支えるAmazon S3の裏側、お伝えします
 
【14-C-7】コンピュータビジョンを支える深層学習技術の新潮流
【14-C-7】コンピュータビジョンを支える深層学習技術の新潮流【14-C-7】コンピュータビジョンを支える深層学習技術の新潮流
【14-C-7】コンピュータビジョンを支える深層学習技術の新潮流
 
【15-B-7】無意味なアラートからの脱却 ~ Datadogを使ってモダンなモニタリングを始めよう ~
【15-B-7】無意味なアラートからの脱却 ~ Datadogを使ってモダンなモニタリングを始めよう ~【15-B-7】無意味なアラートからの脱却 ~ Datadogを使ってモダンなモニタリングを始めよう ~
【15-B-7】無意味なアラートからの脱却 ~ Datadogを使ってモダンなモニタリングを始めよう ~
 
【15-A-1】ドラゴンクエストXを支える失敗事例
【15-A-1】ドラゴンクエストXを支える失敗事例【15-A-1】ドラゴンクエストXを支える失敗事例
【15-A-1】ドラゴンクエストXを支える失敗事例
 
【15-A-5】ゲーミフィケーションエバンジェリストが説く、アプリ開発で見落としがちな「おもてなし」とは~面白さを伝える × 面白く魅せる~
【15-A-5】ゲーミフィケーションエバンジェリストが説く、アプリ開発で見落としがちな「おもてなし」とは~面白さを伝える × 面白く魅せる~【15-A-5】ゲーミフィケーションエバンジェリストが説く、アプリ開発で見落としがちな「おもてなし」とは~面白さを伝える × 面白く魅せる~
【15-A-5】ゲーミフィケーションエバンジェリストが説く、アプリ開発で見落としがちな「おもてなし」とは~面白さを伝える × 面白く魅せる~
 
【B-2】福岡発Node.jsで支える大規模システム!〜「誰ガ為のアルケミスト」と歩んだ三年〜
【B-2】福岡発Node.jsで支える大規模システム!〜「誰ガ為のアルケミスト」と歩んだ三年〜【B-2】福岡発Node.jsで支える大規模システム!〜「誰ガ為のアルケミスト」と歩んだ三年〜
【B-2】福岡発Node.jsで支える大規模システム!〜「誰ガ為のアルケミスト」と歩んだ三年〜
 
【B-5】モダンな開発を実現するツールチェーンのご紹介
【B-5】モダンな開発を実現するツールチェーンのご紹介【B-5】モダンな開発を実現するツールチェーンのご紹介
【B-5】モダンな開発を実現するツールチェーンのご紹介
 
【C-2】メモリも、僕のキャパシティも溢れっぱなし。。2年目エンジニアが実現した機械学習
【C-2】メモリも、僕のキャパシティも溢れっぱなし。。2年目エンジニアが実現した機械学習【C-2】メモリも、僕のキャパシティも溢れっぱなし。。2年目エンジニアが実現した機械学習
【C-2】メモリも、僕のキャパシティも溢れっぱなし。。2年目エンジニアが実現した機械学習
 
【A-2】とあるマーケティング部隊とデータエンジニアのデータドリブンへの道
【A-2】とあるマーケティング部隊とデータエンジニアのデータドリブンへの道【A-2】とあるマーケティング部隊とデータエンジニアのデータドリブンへの道
【A-2】とあるマーケティング部隊とデータエンジニアのデータドリブンへの道
 
【B-2】AI時代におけるエンジニアの生存戦略
【B-2】AI時代におけるエンジニアの生存戦略【B-2】AI時代におけるエンジニアの生存戦略
【B-2】AI時代におけるエンジニアの生存戦略
 

【18-C-4】Google App Engine - 無限の彼方へ

  • 2. App Engine to infinity and beyond Takashi Matsuo Google, Inc. Feb 18, 2011
  • 3. 自己紹介 松尾貴史 @tmatsuo App Engine Developer Advocate Kay's Daddy http://code.google.com/p/kay-framework/
  • 4. > 10万 Developers / Month > 15万 Apps / Week > 10億 Page Views / Day
  • 5. App Engine のこれまで 3 年 - 進化を続けるプラットフォーム Apr 2008 Python launch May 2008 Memcache API, Images API Jul 2008 Logs export Aug 2008 Batch write/delete Oct 2008 HTTPS support Dec 2008 Status dashboard, quota details Feb 2009 Billing, Remote API, Larger HTTP request/response size limits (10MB) Apr 2009 Java launch, Bulkloader (DB import), Cron jobs, SDC May 2009 Key-only queries, Quota API Jun 2009 Task queue API, Django 1.0 support Sep 2009 XMPP API, Remote API shell, Django 1.1 support Oct 2009 Incoming email Dec 2009 Blobstore API Feb 2010 Datastore cursors, Async URLfetch, App stats Mar 2010 Denial-of-Service filtering, eventual consistency support May 2010 OpenID, OAuth, App Engine for Business, new bulkloader Aug 2010 Namespaces, increased quotas, high perf image serving Oct 2010 Instances console, datastore admin & bulk entity deletes Dec 2010 Channel API, 10-minute tasks & cron jobs, AlwaysOn & Warmup Jan 2011 High Replication datastore, entity copy b/w apps, 10-minute URLfetch Feb 2011 Improved XMPP and Task Queue, Django 1.2 support
  • 6. ロードマップ SSL access on non-appspot.com domains Full-text Search over Datastore Support for Python 2.7 Background servers capable of running for longer than 30s Support for running MapReduce jobs across App Engine datasets Bulk Datastore Import and Export tool Improved monitoring and alerting of application serving Logging system improvements to remove limits on size and storage Raise HTTP request and response size limits Integration with Google Storage for Developers Programmatic Blob creation in Blobstore Quota and presence improvements for Channel API
  • 7. 日本での事例 たくさんのミクシィアプリ the Actress - 60万ユーザー Mixi Xmas 2010 - 200万ユーザー 朝日新聞 - メディア配信サービス ソニー - Chan-Toru 業務用アプリケーションも多数
  • 8. App Engine for Business とは? App Engine プラットフォームに加え 99.9% SLA クラウド SQL 有償サポート ドメインコンソール Hosted SSL
  • 9. 本あります プログラミング Google App Engine http://www.oreilly.co.jp/books/9784873114750/ オープンソース徹底活用 Slim3 on Google App Engine for Java ISBN-10: 4798026999
  • 10. アジェンダ App Engine で開発する際の注意点 Datastore の設計 最小限の仕事をする Datastore Contention を避ける シャーディングカウンター Fork-join queue Memcache を効果的に使用する さらなる高みへ
  • 11. Datastore の設計 非正規化 を嫌がらない - No join 必要な index のみ作成 最小限の Entity Group トランザクションが必要な箇所のみ 可能なら速い方を使う query より keys_only query が速い query より get が速い 複数の get より batch get が速い kind の分割が有効なケース 一部のプロパティだけ取得 少しの失敗を受け入れる リトライ、deadline の指定
  • 12. Datastore の設計 非正規化 を嫌がらない - No join 必要な index のみ作成 最小限の Entity Group トランザクションが必要な箇所のみ 可能なら速い方を使う query より keys_only query が速い query より get が速い 複数の get より batch get が速い kind の分割が有効なケース 一部のプロパティだけ取得 少しの失敗を受け入れる リトライ、deadline の指定
  • 13. Datastore の設計 - 非正規化 Before from google.appengine.ext import db class User(db.Model): name = db.StringProperty() groups = db.ListProperty(db.Key) class Group(db.Model): name = db.StringProperty() user = User.get(user_key) group_names = [group.name for group in db.get(user.groups)]
  • 14. Datastore の設計 - 非正規化 After from google.appengine.ext import db class User(db.Model): name = db.StringProperty() groups = db.ListProperty(db.Key) group_names = db.StringListProperty() class Group(db.Model): name = db.StringProperty() user = User.get(user_key) # group_names = user.group_names
  • 15. Datastore の設計 非正規化 を嫌がらない - No join 必要な index のみ作成 最小限の Entity Group トランザクションが必要な箇所のみ 可能なら速い方を使う query より keys_only query が速い query より get が速い 複数の get より batch get が速い kind の分割が有効なケース 一部のプロパティだけ取得 少しの失敗を受け入れる リトライ、deadline の指定
  • 16. Datastore の設計 - 必要な index のみ作成 from google.appengine.ext import db class MyModel(db.Model): name = db.StringProperty() total = db.IntegerProperty(indexed=False) index が増えると書き込み速度は遅くなります
  • 17. Datastore の設計 非正規化 を嫌がらない - No join 必要な index のみ作成 最小限の Entity Group トランザクションが必要な箇所のみ 可能なら速い方を使う query より keys_only query が速い query より get が速い 複数の get より batch get が速い kind の分割が有効なケース 一部のプロパティだけ取得 少しの失敗を受け入れる リトライ、deadline の指定
  • 18. Datastore の設計 - Entity Group Entity Group 作成の方法 class MyModel(db.Model): # ... # 単純にエンティティを作成すると、それ自体新しい Entity Group になる my_entity = MyModel() my_entity.put() # 親を指定すると、親と同じ Entity Group に属する my_second_entity = MyModel(parent=my_entity) my_second_entity.put() # 同じ kind である必要はない my_third_entity = MyOtherModel(parent=my_second_entity) my_third_entity.put()
  • 19. Datastore の設計 - Entity Group Entity Group 作成の方法 class MyModel(db.Model): # ... # 単純にエンティティを作成すると、それ自体新しい Entity Group になる my_entity = MyModel() my_entity.put() # 親を指定すると、親と同じ Entity Group に属する my_second_entity = MyModel(parent=my_entity) my_second_entity.put() # 同じ kind である必要はない my_third_entity = MyOtherModel(parent=my_second_entity) my_third_entity.put()
  • 20. Datastore の設計 - Entity Group 親子関係全てに Entity Group を使用するべきではない 例えば BlogEntry と Comment には不適切 基本的にはトランザクションが必要な箇所に使う 検索用インデックスを自前で作る時などにも有効
  • 21. Datastore の設計 - Entity Group の使用例 検索用インデックス - Before class Sentence(db.Model): body = db.TextProperty() indexes = db.StringListProperty() query = Sentence.all().filter( "indexes =", search_word ) search_result = query.fetch(20) fetch 時に不必要な indexes のデシリアライズが発生
  • 22. Datastore の設計 - Entity Group の使用例 検索用インデックス - After class Sentence(db.Model): body = db.TextProperty() class SearchIndex(db.Model): indexes = db.StringListProperty() query = SearchIndex.all(keys_only=True). filter("indexes =", search_word) search_result = db.get( [key.parent() for key in query.fetch(20)]) 保存時に Entity Group を形成
  • 23. Datastore の設計 非正規化 を嫌がらない - No join 必要な index のみ作成 最小限の Entity Group トランザクションが必要な箇所のみ 可能なら速い方を使う query より keys_only query が速い query より get が速い 複数の get より batch get が速い kind の分割が有効なケース 一部のプロパティだけ取得 少しの失敗を受け入れる リトライ、deadline の指定
  • 24. Datastore の設計 非正規化 を嫌がらない - No join 必要な index のみ作成 最小限の Entity Group トランザクションが必要な箇所のみ 可能なら速い方を使う query より keys_only query が速い query より get が速い 複数の get より batch get が速い kind の分割が有効なケース 一部のプロパティだけ取得 少しの失敗を受け入れる リトライ、deadline の指定
  • 25. Datastore の設計 - Entity 分割 例: ファイルシェアリングサービス ファイル自身 メタデータ ファイルの一覧ページで必要なのはメタデータだけ ファイル自身とメタデータを別エンティティに分割 一覧ページでの処理が高速で無駄がなくなる
  • 26. Datastore の設計 非正規化 を嫌がらない - No join 必要な index のみ作成 最小限の Entity Group トランザクションが必要な箇所のみ 可能なら速い方を使う query より keys_only query が速い query より get が速い 複数の get より batch get が速い kind の分割が有効なケース 一部のプロパティだけ取得 少しの失敗を受け入れる リトライ、deadline の指定
  • 27. Datastore の設計 - リトライ、deadline from google.appengine.ext import db from google.appengine.runtime.apiproxy_errors import DeadlineExceededError from google.appengine.runtime import DeadlineExceededError as D def somefunction(somevalue): handmaid_key = db.Key.from_path("MyModel", 1) new_id = db.allocate_ids(handmaid_key, 1) new_key = db.Key.from_path("MyModel", new_id) my_entity = MyModel(key=new_key, name=somevalue) try: while True: sleep_ms = 100 try: db.put(my_entity, config=db.create_config(deadline=5)) break except (DeadlineExceededError, db.Timeout): time.sleep(sleep_ms) sleep_ms *= 2 except D: # Ran out of retry. Return an error to users. 自動リトライのレシピ
  • 28. 最小限の仕事をする 大事な用語 ユーザー向けリクエスト(User Facing Request) インターネット側から来るもの全て バックグラウンドリクエスト(Background Request) TaskQueue, Cron 等 大事なポイント ユーザー向けリクエストは 1000 ms 以内で返すこと
  • 29. 最小限の仕事をする - より速い方を使用 query より keys_only query query より get datastore より memcache memcache より global 変数(static 変数)
  • 30. 最小限の仕事をする - Task Queue を使用 時間のかかる処理は Task Queue に投げる。 Channel API を使えば結果を簡単にプッシュ
  • 31. Datastore Contention をさける Entity または Entity Group に対しての書き込み 目安:  1 秒に 1 度程度 対策: Entity Group はなるべく小さくする シャーディングカウンターなどのテクニックを使用する
  • 32. シャーディングカウンター - シンプルな実装例 from google.appengine.ext import db import random http://goo.gl/8dGO class SimpleCounterShard(db.Model): """Shards for the counter""" count = db.IntegerProperty(required=True, default=0) NUM_SHARDS = 20 def get_count(): """Retrieve the value for a given sharded counter.""" total = 0 for counter in SimpleCounterShard.all(): total += counter.count return total def increment(): """Increment the value for a given sharded counter.""" def txn(): index = random.randint(0, NUM_SHARDS - 1) shard_name = "shard" + str(index) counter = SimpleCounterShard.get_by_key_name(shard_name) if counter is None: counter = SimpleCounterShard(key_name=shard_name) counter.count += 1 counter.put() db.run_in_transaction(txn)
  • 33. Fork-join queue Building high-throughput data pipelines with Google App Engine http://goo.gl/ntlH シンプルなカウンターの例 http://paste.shehas.net/show/137/
  • 34. memcache を効果的に使用する 使用例 人気のあるページを html 丸ごとキャッシュ memcache.incr を使用したカウンター 高速だが 100% 正確とは保証できない 頻繁に使用される entity や query 結果をキャッシュ
  • 35. memcache を効果的に使用する 基本パターン results = memcache.get('results') if results is None: results = some_complex_work() memcache.set('results', results) # use results 古いキャッシュを破棄する
  • 37. さらなる高みへ Request 数の Fixed Quota はデフォルト 500 QPS 程度 それ以上必要な場合は、Quota Increase のフォームから 申請するか私宛に相談してください Tablet Server の Split を抑制 頻繁に(数百/秒) Entity の作成などを行う場合 自動採番の id では Split を引き起こしやすい uuid などを key_name として使用する key_name を使用する場合でも、頭文字が類似だと Split が起きやすい Hash 値を前置する
  • 38. まとめ Datastore に適した設計 最小限の仕事をする Datastore Contention を避ける Memcache を効果的に使用する AppStats を使用してパフォーマンス測定する Fixed Quota を増やす Tablet Server の Split を抑制
  • 40. Takashi Matsuo Google, Inc. e-mail: tmatsuo@google.com twitter: @tmatsuo