Google App Engine Une introduction L’infrastructure de Google pour servir vos applications.
Agenda Les applications en ligne et la montée en charge AppEngine : solution intégrée sur l’infrastructure Google Les différents services Google Web Toolkit l’intégration complète - le principe - la version 2.0 - qui l’utilise
Evolutions typiques d’une appplication en ligne 1
Evolutions typiques d’une appplication en ligne 2
Evolutions typiques d’une appplication en ligne 3
Evolutions typiques d’une appplication en ligne 5 …
LiveJournal circa 2007 "LiveJournal: Behind the Scenes“ par Brad Fitzpatrick's USENIX '07 talk:
Beaucoup de travail et d’itérations… Une application en ligne signifie :  Prévision des évolutions de traffic et d’usage Planifier les ressources pour les montées en charge Mise à jour et applications des patchs logiciels Des personnes dédiées à l’exploitation Licenses des services Montées de version
Google App Engine Ecrire une application capable de servir gratuitement 5 000 000 pages vues / mois. L’infrastructure Google accueille votre application et gère les authentifications, la montée en charge, la distribution des ressources, etc…
Google App Engine : Les éléments clés du design  Utiliser les technologies mises au point par Google Fournir un environnement intégré Données distribuées Des services spécialisés Séparation étanche entre les applications
Promouvoir l’usage d’applications sans états  Promouvoir la création de services spécialisés Traiter beaucoup de requêtes “légères” Encourager les réponses rapides Google App Engine : Les bonnes pratiques
LiveJournal circa 2007 Frontends Storage Application Servers Memcache Static File Servers "LiveJournal: Behind the Scenes“ par Brad Fitzpatrick's USENIX '07 talk:
Architecture générale
Profitez de l’infrastructure Google Traitements Parrallèles Montée en charge prévue dès le départ Disponibilité globale Configuration automatique (donc pas de configuration) Sécurisation des applications par défaut
Pour quels types d’application ? Des utilisateurs authentifiés, des droits d’accès Des données propres à ces utilisateurs Des interfaces WEB pour manipuler et présenter celles-ci. Un grand nombre de consultations et de mises à jour simples Quelques traitements lourds en tâche de fond Des interconnexions internet ou intranet
Pourquoi Google App Engine ? Montée en charge Performance Standards Coûts réduits Intégration Services Distribution
Un exemple Poser des questions au président Obama  via une application sur AppEngine.
Ces derniers 18 mois… Apr 2008 Support de Python May 2008 Memcache, Images API Jul 2008 Logs export Aug 2008 Batch write/delete Oct 2008 HTTPS support Dec 2008 Console d’administration, Quotas Feb 2009 Facturation, Fichiers + gros Apr 2009 Support de Java , DB import, cron, SDC May 2009 Key-only queries Jun 2009 Task queues Aug 2009 Kindless queries Sep 2009 XMPP Oct 2009 Incoming Email
Java ou Python ? Vous êtes libres ! La même infrastructure Les mêmes services spécialisés La même console d’administration
Ou un autre langage ? La communauté a implémenté le support d’autres langages via la JVM Java Scala JRuby (Ruby) Groovy Quercus (PHP) Rhino (JavaScript) Jython (Python) Duke, the Java mascot Copyright © Sun Microsystems Inc., all rights reserved.
Une console d’administration unique
Un contrôle détaillé des ressources consommées Deux types de quotas : fixes & facturables Ces quotas sont calculés sur une période de 24h On contrôle en plus la consommation de ressources par minute Vous définissez un budget quotidien pour les quotas facturables Les APIs permettent de connaître l’état de son compte à tout instant
Les ressources mesurées http://code.google.com/appengine/docs/quotas.html
Définir ses structures de données Dans le Datastore on peut stocker des entités. Une entité se définit par : Son genre (Kind) Son identifiant  Un ensemble de propriétés On peut exécuter des requêtes sur les entités d’un genre donné avec des critères sur les valeurs des différentes propriétés et un ordre de tri. AppEngine maintient un index pour chaque type de requête qu’on peut exécuter dans l’application.
Le stockage de données s’appuie sur BigTable Sort Machine #2 Machine #3 Machine #1 Big Table n’est pas : Une base de données Une base de données distribuée Mais plutôt : Un tableau trié réparti sur plusieurs machines
Récupérer les données via le bon index SELECT * FROM Grandparent Kind index Prefix = Grandparent Scan!
Requêtes sur une propriété WHERE name >= 'B' and name < 'C' ORDER BY name RANGE = [Parent name B, Parent name C) Scan! 
Comment créer les index ?  La configuration des index se fait via un fichier XML. L’environnement de développement génère le fichier de configuration adéquat en fonction des requêtes exécutées par l’application.
Concevoir le modèle de données Critère de comparaison sur une seule propriété à la fois Toutes les entités d’un même genre n’ont pas forcément les mêmes propriétés. On ne peut pas mettre un critère sur une propriété qui n’est pas définie. Si on a un critère d’inégalité, il faut trier la réponse selon ce critère SELECT *  FROM Person  WHERE birth_year >= :min  AND birth_year <= :max SELECT *  FROM Person  WHERE birth_year >= :min  AND height <= :maxHeight OUI NON
URL Fetch & Memcache Récupérer du contenu de serveur à serveur En Java, utiliser  java.net.URLConnection  Fonctionne en HTTPS et en POST Mémoire cache distribuée persistente Cache optimiste  Service stable, robuste et très spécialisé
Images et messagerie Pour les envois, on utilise  JavaMail (javax.mail) L’expéditeur est le compte administrateur Une URL particulière reçoit le courrier entrant Stockez les images. Transformez les !  (rotation, translation, « j’ai de la chance »)
Votre application se connecte aux messageries instantannées compatibles XMPP (Google Talk) Une URL particulière traite les messages entrants anything @ app-id .appspotchat.com [email_address] Messagerie instantannée
Traitements réguliers : CRON cron: - description: daily summary job   url: /tasks/summary   schedule: every 24 hours - description: monday morning mailout   url: /mail/weekly   schedule: every monday 9:00   timezone: Australia/NSW Planifiez l’appel d’URL
Pour les traitements lourds : Tâches et files d’attente (expérimental) Pour les traitement lourds : Découper le traitement en tâches Confiez les tâches à des files d’attente Les tâches seront effectuées plus tard : En fonction des ressources disponibles De vos priorités
Ajouts récents Import et export de masse  (expérimental en python) Secure Data Connector : Accès sécurisé à vos données en intranet
Démarrer en douceur…. L’application typiquement gratuite : 500 Mo de stockage 2 Go par jour de bande passante ~5M page vues par mois 6.5 heures de CPU par jour 1 Go storage 650 000 URL Fetch calls 2,000 emails 1 Go de bande passante par jour N tâches
Ressources:  code.google.com/appengine code.google.com/p/googleappengine http://groups.google.com/group/                                 google-appengine                                  google-appengine-java                                 google-appengine-python  http://appgallery.appspot.com
Appengine+GWT : l’intégration complète +
AJAX... C’est quoi ? A synchronous  J avaScript  A nd  X ML JavaScript permet de faire des appels serveurs asynchrones JavaScript permet ensuite de modifier le contenu de la page avec les éléments récupérés
La changement de point de vue Ajax
La dérive à éviter Un petit bout de script pour faire un effet sympathique Un succès inattendu qui appelle plus de fonctionnalités De plus en plus de développements Ajax Prise en compte de plus en plus de navigateurs Hum.. Çà commence à rudement se compliquer ! Result: “Un code spaghetti”
Google Web Toolkit : l’objectif  Enrichir l’expérience des internautes en permettant aux développeurs d’utiliser les outils Java pour construire des applications AJAX supportées par tous les navigateurs.
Google Web Toolkit pour faire court Ecrivez l’application dans votre environnement de développement Java favori (netbeans, eclipse, intellij,…) Débuggez à l’aide d’un navigateur spécial  (hosted mode) Compilez le code Java en JAVASCRIPT+HTML optimisé Déployez un ensemble de pages HTML/Javascript  sans plugin, ni modification du serveur applicatif Open Source sous Apache 2.0
Google Web Toolkit : les fonctionnalités Librairies compatibles avec tous les navigateurs : Interface utilisateur (DOM, widgets, ...) Communication Client/Serveur (XHR, RPC, JSON, ...) Infrastructure applicative Historique, Tests unitaires, Internationalisation, … Services extérieurs  Gadgets, Gears, Google Maps,… Intégration de javascript natif (JSNI)
Comment çà marche ?
Code against Java UI libraries Google Web Toolkit Weekly Report 09/01/2008 - 09/08/200   Google Web Toolkit Weekly Report 09/01/2008 - 09/08/200   Comment çà marche ?
Code against Java UI libraries The compiler translates Java source to highly-optimized JS Comment çà marche ?
Code against Java UI libraries The compiler translates Java source to highly-optimized JS Generates browser-compliant JS + HTML files Comment çà marche ?
A chacun son code optimisé Optimisé pour le développeur Optimisé pour chaque navigateur
Les Avantages GWT : des applications performantes Le code est optimisé pour chaque navigateur Le code évite les fuites mémoires  Deferred Binding, le résultat de la compilation est : - un package propre à chaque langue, navigateur - un script qui détecte le package à utiliser    vous ne téléchargez que la partie utile
Deferred Binding en image
Les Avantages GWT : support de l’historique du navigateur tabPanel.add( new  HTML( &quot;<h1>Page 1 Content</h1>&quot; ),  &quot; Page 1 &quot; ); tabPanel.add( new  HTML( &quot;<h1>Page 2 Content</h1>&quot; ),  &quot; Page 2 &quot; ); tabPanel.addTabListener( new  TabListener() { @Override public   void  onTabSelected(SourcesTabEvents sender,  int  tabIndex) { // Push an item onto the history stack History. newItem ( &quot;page&quot;  + tabIndex); } History.addHistoryListener( new  HistoryListener() { public   void  onHistoryChanged(String historyToken) { if (tokenIsValid(historyToken)) {  tabPanel.selectTab(getTabIndex(historyToken)); } } };
Les Avantages GWT : des développements plus rapides Toutes les fonctionnalités des IDE sont disponibles (refactoring, templates, debug) Google Plugin for Eclipse  Supporte à la fois GWT et App Engine Tests unitaires possibles en utilisant : Standard JUnit TestCase  GWTTestCase HTMLUnit tests Selenium tests Debugger en Java
Pour résumer  Google Web Toolkit est la solution idéale, car : Les applications Ajax produites sont très optimisées Le développeur n’a plus à se soucier de : Browser quirk headaches Memory leaks History support Code réutilisable Développements plus rapide (outils standards) Débug en java
Les librairies existantes GWT  ( http://code.google.com/webtoolkit/ )   Incubator    ( http://code.google.com/p/google-web-toolkit-incubator/ ) Smart GWT  ( http://code.google.com/p/smartgwt/ ) GWT-Ext  ( http://code.google.com/p/gwt-ext/ ) IT Mill Toolkit  ( http://www.itmill.com/ ) GWT mosaic  ( http://code.google.com/p/gwt-mosaic/ ) Ext GWT  ( http://extjs.com/products/gxt/ ) Advanced GWT Components ( http://advanced-gwt.sourceforge.net/ ) 
GWT 2.0 : chargement progressif Size of Initial JavaScript Download (KB) 375 750 1125 1500 0 7x Decrease In Initial Download Size with runAsync() 1400 KB 200 KB 1125
Developer-guided code splitting with runAsync public void  onMySettingsLinkClicked()   { GWT.runAsync( new  RunAsyncCallback() { public void  onSuccess() { new  MySettingsDialog().show(); } public void  onFailure(Throwable ohNo) { // indicate that something went wrong, // usually a connectivity or server problem } Split point Runs after a short  (but improbable) delay Runs if required script  cannot be downloaded
GWT 2.0: ImageBundle Pour afficher 11 images, on ne va pas charger 11 fichiers différents, mais un seul
Qui utilise GWT ?
Google Wave
Google Health
Mobile
Lombardi Blueprint Google Web Toolkit
ContactOffice Google Web Toolkit
Faites un tour dans la galerie GWT ! Google Web Toolkit http://gwtgallery.appspot.com/

GtugDakar AppEngine, Gwt

  • 1.
    Google App EngineUne introduction L’infrastructure de Google pour servir vos applications.
  • 2.
    Agenda Les applicationsen ligne et la montée en charge AppEngine : solution intégrée sur l’infrastructure Google Les différents services Google Web Toolkit l’intégration complète - le principe - la version 2.0 - qui l’utilise
  • 3.
    Evolutions typiques d’uneappplication en ligne 1
  • 4.
    Evolutions typiques d’uneappplication en ligne 2
  • 5.
    Evolutions typiques d’uneappplication en ligne 3
  • 6.
    Evolutions typiques d’uneappplication en ligne 5 …
  • 7.
    LiveJournal circa 2007&quot;LiveJournal: Behind the Scenes“ par Brad Fitzpatrick's USENIX '07 talk:
  • 8.
    Beaucoup de travailet d’itérations… Une application en ligne signifie : Prévision des évolutions de traffic et d’usage Planifier les ressources pour les montées en charge Mise à jour et applications des patchs logiciels Des personnes dédiées à l’exploitation Licenses des services Montées de version
  • 9.
    Google App EngineEcrire une application capable de servir gratuitement 5 000 000 pages vues / mois. L’infrastructure Google accueille votre application et gère les authentifications, la montée en charge, la distribution des ressources, etc…
  • 10.
    Google App Engine: Les éléments clés du design Utiliser les technologies mises au point par Google Fournir un environnement intégré Données distribuées Des services spécialisés Séparation étanche entre les applications
  • 11.
    Promouvoir l’usage d’applicationssans états Promouvoir la création de services spécialisés Traiter beaucoup de requêtes “légères” Encourager les réponses rapides Google App Engine : Les bonnes pratiques
  • 12.
    LiveJournal circa 2007Frontends Storage Application Servers Memcache Static File Servers &quot;LiveJournal: Behind the Scenes“ par Brad Fitzpatrick's USENIX '07 talk:
  • 13.
  • 14.
    Profitez de l’infrastructureGoogle Traitements Parrallèles Montée en charge prévue dès le départ Disponibilité globale Configuration automatique (donc pas de configuration) Sécurisation des applications par défaut
  • 15.
    Pour quels typesd’application ? Des utilisateurs authentifiés, des droits d’accès Des données propres à ces utilisateurs Des interfaces WEB pour manipuler et présenter celles-ci. Un grand nombre de consultations et de mises à jour simples Quelques traitements lourds en tâche de fond Des interconnexions internet ou intranet
  • 16.
    Pourquoi Google AppEngine ? Montée en charge Performance Standards Coûts réduits Intégration Services Distribution
  • 17.
    Un exemple Poserdes questions au président Obama via une application sur AppEngine.
  • 18.
    Ces derniers 18mois… Apr 2008 Support de Python May 2008 Memcache, Images API Jul 2008 Logs export Aug 2008 Batch write/delete Oct 2008 HTTPS support Dec 2008 Console d’administration, Quotas Feb 2009 Facturation, Fichiers + gros Apr 2009 Support de Java , DB import, cron, SDC May 2009 Key-only queries Jun 2009 Task queues Aug 2009 Kindless queries Sep 2009 XMPP Oct 2009 Incoming Email
  • 19.
    Java ou Python? Vous êtes libres ! La même infrastructure Les mêmes services spécialisés La même console d’administration
  • 20.
    Ou un autrelangage ? La communauté a implémenté le support d’autres langages via la JVM Java Scala JRuby (Ruby) Groovy Quercus (PHP) Rhino (JavaScript) Jython (Python) Duke, the Java mascot Copyright © Sun Microsystems Inc., all rights reserved.
  • 21.
  • 22.
    Un contrôle détaillédes ressources consommées Deux types de quotas : fixes & facturables Ces quotas sont calculés sur une période de 24h On contrôle en plus la consommation de ressources par minute Vous définissez un budget quotidien pour les quotas facturables Les APIs permettent de connaître l’état de son compte à tout instant
  • 23.
    Les ressources mesuréeshttp://code.google.com/appengine/docs/quotas.html
  • 24.
    Définir ses structuresde données Dans le Datastore on peut stocker des entités. Une entité se définit par : Son genre (Kind) Son identifiant Un ensemble de propriétés On peut exécuter des requêtes sur les entités d’un genre donné avec des critères sur les valeurs des différentes propriétés et un ordre de tri. AppEngine maintient un index pour chaque type de requête qu’on peut exécuter dans l’application.
  • 25.
    Le stockage dedonnées s’appuie sur BigTable Sort Machine #2 Machine #3 Machine #1 Big Table n’est pas : Une base de données Une base de données distribuée Mais plutôt : Un tableau trié réparti sur plusieurs machines
  • 26.
    Récupérer les donnéesvia le bon index SELECT * FROM Grandparent Kind index Prefix = Grandparent Scan!
  • 27.
    Requêtes sur unepropriété WHERE name >= 'B' and name < 'C' ORDER BY name RANGE = [Parent name B, Parent name C) Scan! 
  • 28.
    Comment créer lesindex ? La configuration des index se fait via un fichier XML. L’environnement de développement génère le fichier de configuration adéquat en fonction des requêtes exécutées par l’application.
  • 29.
    Concevoir le modèlede données Critère de comparaison sur une seule propriété à la fois Toutes les entités d’un même genre n’ont pas forcément les mêmes propriétés. On ne peut pas mettre un critère sur une propriété qui n’est pas définie. Si on a un critère d’inégalité, il faut trier la réponse selon ce critère SELECT * FROM Person WHERE birth_year >= :min AND birth_year <= :max SELECT * FROM Person WHERE birth_year >= :min AND height <= :maxHeight OUI NON
  • 30.
    URL Fetch &Memcache Récupérer du contenu de serveur à serveur En Java, utiliser  java.net.URLConnection  Fonctionne en HTTPS et en POST Mémoire cache distribuée persistente Cache optimiste Service stable, robuste et très spécialisé
  • 31.
    Images et messageriePour les envois, on utilise  JavaMail (javax.mail) L’expéditeur est le compte administrateur Une URL particulière reçoit le courrier entrant Stockez les images. Transformez les ! (rotation, translation, « j’ai de la chance »)
  • 32.
    Votre application seconnecte aux messageries instantannées compatibles XMPP (Google Talk) Une URL particulière traite les messages entrants anything @ app-id .appspotchat.com [email_address] Messagerie instantannée
  • 33.
    Traitements réguliers :CRON cron: - description: daily summary job   url: /tasks/summary   schedule: every 24 hours - description: monday morning mailout   url: /mail/weekly   schedule: every monday 9:00   timezone: Australia/NSW Planifiez l’appel d’URL
  • 34.
    Pour les traitementslourds : Tâches et files d’attente (expérimental) Pour les traitement lourds : Découper le traitement en tâches Confiez les tâches à des files d’attente Les tâches seront effectuées plus tard : En fonction des ressources disponibles De vos priorités
  • 35.
    Ajouts récents Importet export de masse (expérimental en python) Secure Data Connector : Accès sécurisé à vos données en intranet
  • 36.
    Démarrer en douceur….L’application typiquement gratuite : 500 Mo de stockage 2 Go par jour de bande passante ~5M page vues par mois 6.5 heures de CPU par jour 1 Go storage 650 000 URL Fetch calls 2,000 emails 1 Go de bande passante par jour N tâches
  • 37.
    Ressources: code.google.com/appenginecode.google.com/p/googleappengine http://groups.google.com/group/                                 google-appengine                                 google-appengine-java                                 google-appengine-python http://appgallery.appspot.com
  • 38.
  • 39.
    AJAX... C’est quoi? A synchronous J avaScript A nd X ML JavaScript permet de faire des appels serveurs asynchrones JavaScript permet ensuite de modifier le contenu de la page avec les éléments récupérés
  • 40.
    La changement depoint de vue Ajax
  • 41.
    La dérive àéviter Un petit bout de script pour faire un effet sympathique Un succès inattendu qui appelle plus de fonctionnalités De plus en plus de développements Ajax Prise en compte de plus en plus de navigateurs Hum.. Çà commence à rudement se compliquer ! Result: “Un code spaghetti”
  • 42.
    Google Web Toolkit: l’objectif Enrichir l’expérience des internautes en permettant aux développeurs d’utiliser les outils Java pour construire des applications AJAX supportées par tous les navigateurs.
  • 43.
    Google Web Toolkitpour faire court Ecrivez l’application dans votre environnement de développement Java favori (netbeans, eclipse, intellij,…) Débuggez à l’aide d’un navigateur spécial (hosted mode) Compilez le code Java en JAVASCRIPT+HTML optimisé Déployez un ensemble de pages HTML/Javascript sans plugin, ni modification du serveur applicatif Open Source sous Apache 2.0
  • 44.
    Google Web Toolkit: les fonctionnalités Librairies compatibles avec tous les navigateurs : Interface utilisateur (DOM, widgets, ...) Communication Client/Serveur (XHR, RPC, JSON, ...) Infrastructure applicative Historique, Tests unitaires, Internationalisation, … Services extérieurs Gadgets, Gears, Google Maps,… Intégration de javascript natif (JSNI)
  • 45.
  • 46.
    Code against JavaUI libraries Google Web Toolkit Weekly Report 09/01/2008 - 09/08/200 Google Web Toolkit Weekly Report 09/01/2008 - 09/08/200 Comment çà marche ?
  • 47.
    Code against JavaUI libraries The compiler translates Java source to highly-optimized JS Comment çà marche ?
  • 48.
    Code against JavaUI libraries The compiler translates Java source to highly-optimized JS Generates browser-compliant JS + HTML files Comment çà marche ?
  • 49.
    A chacun soncode optimisé Optimisé pour le développeur Optimisé pour chaque navigateur
  • 50.
    Les Avantages GWT: des applications performantes Le code est optimisé pour chaque navigateur Le code évite les fuites mémoires Deferred Binding, le résultat de la compilation est : - un package propre à chaque langue, navigateur - un script qui détecte le package à utiliser  vous ne téléchargez que la partie utile
  • 51.
  • 52.
    Les Avantages GWT: support de l’historique du navigateur tabPanel.add( new HTML( &quot;<h1>Page 1 Content</h1>&quot; ), &quot; Page 1 &quot; ); tabPanel.add( new HTML( &quot;<h1>Page 2 Content</h1>&quot; ), &quot; Page 2 &quot; ); tabPanel.addTabListener( new TabListener() { @Override public void onTabSelected(SourcesTabEvents sender, int tabIndex) { // Push an item onto the history stack History. newItem ( &quot;page&quot; + tabIndex); } History.addHistoryListener( new HistoryListener() { public void onHistoryChanged(String historyToken) { if (tokenIsValid(historyToken)) { tabPanel.selectTab(getTabIndex(historyToken)); } } };
  • 53.
    Les Avantages GWT: des développements plus rapides Toutes les fonctionnalités des IDE sont disponibles (refactoring, templates, debug) Google Plugin for Eclipse Supporte à la fois GWT et App Engine Tests unitaires possibles en utilisant : Standard JUnit TestCase GWTTestCase HTMLUnit tests Selenium tests Debugger en Java
  • 54.
    Pour résumer Google Web Toolkit est la solution idéale, car : Les applications Ajax produites sont très optimisées Le développeur n’a plus à se soucier de : Browser quirk headaches Memory leaks History support Code réutilisable Développements plus rapide (outils standards) Débug en java
  • 55.
    Les librairies existantesGWT  ( http://code.google.com/webtoolkit/ ) Incubator  ( http://code.google.com/p/google-web-toolkit-incubator/ ) Smart GWT  ( http://code.google.com/p/smartgwt/ ) GWT-Ext ( http://code.google.com/p/gwt-ext/ ) IT Mill Toolkit  ( http://www.itmill.com/ ) GWT mosaic  ( http://code.google.com/p/gwt-mosaic/ ) Ext GWT  ( http://extjs.com/products/gxt/ ) Advanced GWT Components ( http://advanced-gwt.sourceforge.net/ ) 
  • 56.
    GWT 2.0 :chargement progressif Size of Initial JavaScript Download (KB) 375 750 1125 1500 0 7x Decrease In Initial Download Size with runAsync() 1400 KB 200 KB 1125
  • 57.
    Developer-guided code splittingwith runAsync public void onMySettingsLinkClicked() { GWT.runAsync( new RunAsyncCallback() { public void onSuccess() { new MySettingsDialog().show(); } public void onFailure(Throwable ohNo) { // indicate that something went wrong, // usually a connectivity or server problem } Split point Runs after a short (but improbable) delay Runs if required script cannot be downloaded
  • 58.
    GWT 2.0: ImageBundlePour afficher 11 images, on ne va pas charger 11 fichiers différents, mais un seul
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
    Faites un tourdans la galerie GWT ! Google Web Toolkit http://gwtgallery.appspot.com/

Notes de l'éditeur

  • #4 CONFIG PATH OF REQUEST SCALABLE your DB is consuming resources that you could be using to serve traffic RELIABLE Next step?
  • #5 CONFIG PATH OF REQUEST SCALABLE your DB is consuming resources that you could be using to serve traffic RELIABLE Next step?
  • #6 CONFIG PATH OF REQUEST SCALABLE your DB is consuming resources that you could be using to serve traffic RELIABLE Next step?
  • #7 CONFIG PATH OF REQUEST SCALABLE your DB is consuming resources that you could be using to serve traffic RELIABLE Next step?
  • #8 Brad Fitzpatrick presented the LiveJournal LAMP stack in his talk at USENIX &apos;07 - similar to app engine But let&apos;s take a step back and look at the steps that most developers, including those at LiveJournal take to get to this stage.
  • #11 We learned the hard way how to make webapps scale. We have a lot of experience with this stuff It led us to have these design motivations. explain statelessness and specialization
  • #13 Brad Fitzpatrick presented the LiveJournal LAMP stack in his talk at USENIX &apos;07 - similar to app engine But let&apos;s take a step back and look at the steps that most developers, including those at LiveJournal take to get to this stage.
  • #14 * Here is a high level view of the Google App Engine Stack - standard web three tier topology - Go over components and what they do * Frontend * Application (app) Servers * App Master * Memcache - distributed in-memory cache. Good  * Datastore * various other apis - There&apos;s a lot of stuff going on here, so let&apos;s start with a familiar example ___________________ different art here primary colors are distracting Explain what memcache is and what it&apos;s good for
  • #20 Beneficios son los mismos del python
  • #44 I&apos;m guessing most people have a rough idea of what GWT can do, but I want to quickly hit the hight points on this slide having way too much text.
  • #45 I&apos;m guessing most people have a rough idea of what GWT can do, but I want to quickly hit the hight points on this slide having way too much text.