dimanche 3 juillet 2011

Google App Engine : Présentation

Le Cloud Computing
    Le « cloud computing » ou « Informatique dans les nuages » est un concept qui consiste à centraliser des traitements sur des serveurs distants afin de faire profiter aux entreprises leur puissance de calcul et  leur capacité de stockage. Il dispense ainsi aux services informatiques toutes les tâches complexes liées à la maintenance des infrastructures. Le cloud se matérialise par un réseau d'ordinateurs répartis un peu partout dans le monde et qui fournissent leur service à travers internet. Le système de facturation est semblable à celui de l'électricité : on ne paye que ce qu'on a consommé.

    Les principaux acteurs du domaine sont Amazone (le leader), Google, Microsoft et IBM.

Schéma cloud computing
    Il existe trois catégories de cloud :
IaaS (Infrastructure as a Service) : « J'administre, je développe et je consomme »


Infrastructures maintenues
Entreprise
Logiciels : applications, runtimes, intégration SOA, base de données, serveur
Fournisseur cloud
Matériels : serveurs, réseaux, stockage,
   
    Exemple : Amazon Web Services

PaaS (Platform as a Service) : « Je développe et je consomme »


Infrastructures maintenues
Entreprise
applications
Fournisseur cloud
Matériels + runtimes, intégration SOA, base de données, serveur
   
    Exemple : Google App Engine (Java, Python), Microsoft Azure (.NET)

SaaS (Software as a Service) : L'entreprise est vue comme un consommateur d'applications, le fournisseur maintien toutes les infrastructures matérielles et logicielles du système.

    Exemple : Gmail, Google Docs, ...

Google App Engine (GAE)
    GAE est l'offre PaaS de Google. Actuellement seules trois plateformes sont supportées; Java, Python et Go. Il 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 – BigTable - et une infrastructure réseau capable de satisfaire une demande de trafic élevée. Il offre aussi un service d'authentification et d'envoi de mail, un système de planification de tâches et permet également de maintenir une file d'exécution de tâches.

Schéma Google App Engine



Le sandboxing – terme anglais signifiant « bac à sable » - est une technique qui consiste à confiner un environnement d'exécution - avec les ressources nécessaires – afin de rendre une application autonome et son accès réglementé. L'intérêt principal est de s'assurer que le dysfonctionnement d'une application ne puisse pas impacter le fonctionnement global du système.

 
GAE supporte un certains nombre de librairies pour les plateformes citées plus haut mais il met en même temps des restrictions sur tout ce qui peut-être susceptible de compromettre le sandboxing :
  • Un programme ne peut pas effectuer d'appel système
  • Un programme ne peut pas faire d'écriture sur le système de fichier
  • La durée maximale d'exécution d'un processus est de 30 secondes. Au delà le processus est simplement tué
  • Les applications ne peuvent communiquer qu'à travers des requêtes http/https sur des ports standards.
BigTable




L'ACID (Atomicité, Consistance, Isolation, Durabilité ) est un concept qui met l'accent sur un ensemble de propriétés qui garantissent la réussite d'une transaction. Une transaction est une opération atomique (indivisible) , même si elle peut inclure plusieurs actions, comme dans un virement bancaire où l'on intervient sur deux comptes.

    Le but du NoSQL (Not Only SQL) - apparu en 1998 - est de trouver une alternative aux bases de données relationnelles qui, à cause de la rigidité de leur caractère ACID, répondent à peine aux  besoins de performance relatifs à la croissance exponentielle des trafics des sites webs. Ses principaux acteurs sont les géants de l'Internet, notamment Google, Amazone et Facebook. Plusieurs implémentations du NoSQL existent actuellement comme Cassandra, Riak, Hbase, MongoDB, BigTable. La première tentative de classification dévoile quatre familles :
  • les bases de données de type « Clé valeur »
  • les bases de données « Orientées colonne »
  • les bases de données « Orientées document »
  • les bases de données « Orientées graphe »
    La structure de BigTable n'est ni objet, ni relationnelle. C'est une base de données NoSQL qui appartient à la famille des bases de données de type « Orientées colonnes ». C'est le moteur de persistance qu'utilise Google pour ses propres besoins (moteur de recherche, stockage de mails, géolocalisation, Google finance, …). La première publication officielle que Google a fait  à son sujet  date de 2006,   dans « Bigtable: A Distributed Storage System for Structured Data ». C'est en ces termes qu'il dévoile dans les premières lignes de l'introduction les principales caractéristiques; c'est un Map dont les propriétés sont les suivantes :

    - il est multidimensionnel : par opposition aux RDBM une donnée n'est pas représentée sur deux dimensions mais trois, une ligne, une colonne et le timestamp :

        (row:string, column:string, time:int64)→ string

    La colonne est une cellule qui représente l'unité de données

        exemple de colonne en notation JSON

{
name: "e-mail",
value: "yakhya.dabo@gmail.com",
timestamp: 123456789
}
    Le timestamp est généré automatiquement par le système et correspond à une version de la colonne. Ce qui fait qu'on peut avoir dans la base plusieurs versions de la même colonne, la dernière étant celle qui est accessible par défaut.

    - les colonnes sont regroupées en blocs appelés « Famille de colonnes». C'est la structure qui se rapproche le plus du concept de « Table » dans une représentation relationnelle. Les lignes d'une famille de colonnes n'ont pas nécessairement des colonnes identiques.

    Exemple : la Famille de colonne User en notation JSON
User = { 
    Yakhya: { // la clé de la ligne
        // les colonnes de la lignes 
        firstName {name: ''firstName'' , value: "Yakhya", timestamp: 12345}
        lastName {name: ''lastName'' , value: "DABO", timestamp: 1234005}
    }, 

    Lamine: { // la clé de la ligne
        // les colonnes de la lignes 
        firstName {name: ''firstName'' , value: "Lamine", timestamp: 12345}
        lastName {name: ''lastName'' , value: "Deme", timestamp: 123405}
        age {name: ''age'' , value: "40", timestamp: 14005}
    },
}
    - il est Ordonné : les données sont triées sur  le nom de la colonne par ordre lexicographique. Le tri se fait de manière permanente, après chaque opération d'ajout ou de suppression les données sont réorganisées.

    Exemple :
street: {name: "street", value: "1234 x street"},
city: {name: "city", value: "san francisco"},
zip: {name: "zip", value: "94107"}
    donne
city: {name: "city", value: "san francisco"},
street: {name: "street", value: "1234 x street"},
zip: {name: "zip", value: "94107"}
    Pour s'assurer d'avoir les colonnes d'une même famille de colonnes ensemble, les noms des colonnes sont préfixes par le nom de la famille de colonnes (family:column).    

Le DataStore
    C'est une API publique qui – comme une sur-couche -  permet l'accès la base de données Bigtable. Il en fournit une version simplifiée, par exemple on n'a pas accès au timestamp. Il implémente aussi des fonctionnalités – très limitées comparées à celles que l'on trouve dans les SGBD/R - qui n'existent pas en natif, comme les index et les  jointures.

Schéma Datastore

    Un tableau de correspondance entre les quatre modèles :

Orienté Objet
SGBD/R
BigTable : Orienté colonnes
DataStore
Classe
Table
Famille de colonnes
Kind
Objet
Enregistrement
Ligne
Entity
Attribut
Colonne
Colonne
Property

API d'accès aux données
    Google propose plusieurs frameworks 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. D'autres librairies comme Objectify développées par des tiers peuvent également être utilisées pour faire de l'accès aux données.