Cette prez a été faite par Ludovic Champenois. La veille on a eu droit à 3h de Travaux Pratiques pour mettre en place un site sur Google App Engine.
Petit Rappel …
GAEest l’offre PaaS (Platform As A Service) de Google (première release). Il peut être considéré comme un Serveur d’Applications Cloud. Actuellement il supporte trois plateformes : Java, Python et Go. GAE offre un environnement d’exécution aux applications qu’il héberge en mettant à leur disposition un serveur web, un serveur de données pour la persistance –DataStore – et une infrastructure réseau conçue pour gérer la montée en charge du trafic, par la multiplication du nombre d’instances de serveurs en fonction de la demande (scalabilité).
Il utilise la technique du sandboxing pour assurer le fonctionnement normal de plusieurs applications sur le même serveur. Les librairies qui compromettent le sandboxing ne sont pas supportées, pas d’écriture sur le système de fichier, pas d’appel système, …
Google est le premier consommateur de GAE : Google Earth, Google Finance, Gmail, … sont tous des services qui utilisent la plateforme.
Pour les développeurs il y a un SDK à partir duquel on peut développer, tester et déployer et un console d’administration pour gérer les paramètres de l’application (nom du site, nombre d’instances de serveur activer, log, droits utilisateurs, … ).
Les Services et API
Ils peuvent être classés dans quatre catégories :
- Networking : pour l’envoie de mail, la recherche d’URL (activité principale de Google)
- Compute :: pour gérer les files d’attente, les tâche de fond, …
- Storage : pour le stockage des données. Au début seul le NoSQL était supporté, mais avec la nouvelle release, on peut bien faire du MySQL ! Dans le service de stockage il y a aussi la gestion du cache et des contenus statiques.
- Autres Services : le Map Reduce (pour la distribution), le Full Text Search (pour la recherche de texte dans des pages web), le traitement d’image, le système d’authentification, …
Acces aux données avec Objectify
D’abord un tableau de correspondance entre les quatre modèles :
Google propose plusieurs API pour l’accès aux données du Datastore : JPA (Java Persistent API) qui permet de faire de la persistance sur une base de données relationnelle, JDO (Java Data Object) avec qui on peut faire du mapping sur n’importe quel type de base de données (relationnelle, objet, XML, …) et les API de bas niveau.
Objectify développées par des tiers peut également être utilisés pour faire de l’accès aux données. Il fournit une abstraction plus élevée, par rapport à JPA et JDO.
Exemple
Création du modèle
public class President {
@Id
public Long id = null;
public String name;
public String image;
public boolean active;
public President(){}
Création du DAO
(on peut en avoir un seul pour tous les modèles)
public class ObjectifyDAO extends DAOBase {
static {
ObjectifyService.register(Comment.class);
ObjectifyService.register(President.class);
}
}
Stockage
public static void store(String name, String image) {
ObjectifyDAO dao = new ObjectifyDAO();
dao.ofy().put(new President(name, image));
}
Lecture
public static President getPresident() {
return new ObjectifyDAO().ofy().query(President.class).filter("active", true).get();
}
public static ListgetPresidents() {
ObjectifyDAO dao = new ObjectifyDAO();
return dao.ofy().query(President.class).order("-date").limit(100).list();
}
Bien concevoir pour sauver son portefeuille
Le système de facturation dépend du temps de consommation du CPU. Pour optimiser les couts d’une application la solution serait de limiter les accès disques par l’utilisation du cache (Mem Cache) et de faire un choix optimal des indexes pour limiter les résultats des requêtes .
Exemple
Stockage cache
public static void storeInCache(String name, String image) {
ObjectifyDAO dao = new ObjectifyDAO();
dao.ofy().put(new President(name, image));
MemcacheServiceFactory.getMemcacheService().delete("PresidentKey"); //kill cache
}
Lecture cache
public static ListretrieveAllCached(){
MemcacheService cache = MemcacheServiceFactory.getMemcacheService();
List presidents = (List)cache.get("PresidentKey");
if (presidents == null) {
presidents = getPresidents(); // read from datastore
if (presidents != null)
cache.put("PresidentKey", presidents); // store in memcache
}
return presidents;
}