TME AWS : Amazon Web Services
Objectif: comprendre les services de gestion de données: SQS, SimpleDB, et S3
Préparation
- Vérifiez votre quota de stokage: il vous faut au moins 30 MO.
télécharger l'archive aws-java-sdk-1.6.9_ETU.tgz
- Comprendre l'exemple se trouvant dans : aws-java-sdk-1.6.9/samples/AmazonSimpleQueueService
- Lire l'API java de tous les services d'AWS (ou localement dans votre dossier aws-java-sdk-1.3.25/documentation/javadoc/index.html)
Configurer l'environnement linux:
- Aller dans le répertoire aws-java-sdk-1.6.9, puis saisir:
- source config-java-classpath-2013
- dans Eclipse: aller dans les propriétés du projet, puis java build path, puis add external jar. Ajouter tous les jars se trouvant dans tous les sous-dossiers de third-party ainsi que tous les jars se trouvant dans le dossier lib.
configurer l'accès pour se connecter à AWS en passant par le proxy de l'UFR.
- host="proxy" et port=3128
- voir l'exemple S3Sample.java avec le proxy correctement configuré (lignes 26 puis 63 à 67)
- Ne pas choisir de région : commenter la ligne setRegion
En 2013-2014, commencez par l'exercice 2
Exercice 1 : Cohérence des données avec SimpleDB
- Lire l'exemple SimpleDBSample.java dans le dossier samples/AmazonSimpleDB. Le domaine utilisé est D11. Les droits dont vous disposez vous permettent de manipuler des objects (i.e., créer, modifier et supprimer un item). Par contre, vous n'avez pas les droits pour créer, lister ou supprimer un domaine.
- Lire la syntaxe des requêtes SELECT FROM WHERE. Voir en particulier la fonction itemName() qui peut être utilisée dans une clause WHERE.
Pour lire un seul item, il est possible d'invoquer la méthode getAttributes(GetAttributesRequest), sans poser de requête SELECT.
- Lire la notice d'utilisation des lectures et écritures cohérentes : SimpleDB Consistency Enhancements
Mettre en évidence des situations d'accès incohérent aux données, suivantes :
- On considère l'objet nommé NNN contenant les attributs (produit=1, quantite=0). Chaque étudiant choisit un nom NNN d'item différent.
On considère l'opération Ajout qui consiste à ajouter 1 à la quantité de l'objet NNN. La séquence est :
- lire l'attribut quantite de l'objet nommé NNN.
- modifier la quantité de l'objet en remplaçant la quantité par la nouvelle valeur.
2.1) Lecture d'un état obsolète de la donnée.
- Initialement, créer l'objet NNN avec les attribut (produit=1, quantite=0)
- Ecrire un programme P1 qui effectue 10 opérations AJOUT successives (boucle for). Quelle est la quantité finale ?
- Modifier P1 pour obtenir le programme P2 telle que la quantité finale soit correcte. Voir la méthode setConsistentRead.
2.2) Perte d'écriture lorsque 2 utilisateurs modifient la même donnée en même temps.
- Initialement, l'objet NNN vaut (produit=1, quantite=0). Rmq: l'item est initialisé avant d'exécuter P2. P2 effectue seulement les 10 ajouts successifs.
- Ouvrir 2 terminaux pour exécuter simultanément le programme P2. Quelle est la quantité obtenue ?
Modifier P2 pour obtenir P3 telle que la quantité finale soit bien la somme de tous les ajouts simultanés.
- Voir les classes PutAttributesRequest et UpdateCondition.
- Quelle condition garantit que la quantité peut être modifiée correctement?
- Préciser la stratégie adoptée lorsque cette condition n'est pas vérifiée.
Proposer une autre solution P4 qui consiste à obtenir un verrou sur l'item avant de lire et modifier la quantité du produit.
- Représenter le verrou par un attribut nommé lock valant 0 (libre) ou 1 (occupé).
- Peut-on relâcher le verrou en même temps qu'on écrit la nouvelle quantité ?
2.3) Compromis performance/cohérence
- Chronométrer la durée moyenne pour effectuer une opération AJOUT.
- Comparer la durée d'une lecture avec cohérence avec une lecture sans cohérence. Que concluez vous ?
- Mesurer le temps de réponse obtenu avec P3, puis avec 2 P3 simultanés, puis avec 3 P3 et ainsi de suite. Que concluez vous ?
Exercice 2 : Le service de files d'attentes : SQS
Lire et comprendre l'exemple F1.java dans samples/AmazonSimpleQueueService
Choisir un suffixe ETU (vos initiales) pour identifier vos files d'attente de manière unique.
Créer une file nommée T_ETU et contenant les transactions à traiter. Créer une file nommée R_ETU et contenant la réponse d'une transaction traitée. Utiliser les 2 files entre l'application (A) et un gestionnaire de transactions (G). L'application A ajoute une demande dans la file T_ETU et attend une réponse qui arrivera dans la file R_ETU. Le gestionnaire G lit une demande dans la file T_ETU, traite la demande puis envoie une réponse dans la file R_ETU. Si nécessaire, modifier le délai d'attente pendant lequel une instruction de lecture attend que la file se remplisse (voir la méthode withWaitTimeSeconds).
On suppose que les données sont réparties dans N stores. Proposer une solution pour répartir les demandes des applications dans N files.
Voir la documentation API de SQS
Exercice 3 (facultatif)
Proposer des éléments de solution pour stocker dans S3 les données suivantes :
- une relation quelconque (l'équivalent d'une table SQL)
- un réseau d'amis
- un flux de données RSS
Illustrer l'utilisation de S3 pour gérer le stock des produits d'un magasin :
- Magasin(magasinID, produitID, quantité)
Exercice 4 : Comparaison S3 / SimpleDB
Comparer le niveau de cohérence proposé par S3 avec ceux proposés par le SimpleDB.
Documentation
- Documentation de SQS
- Prise en main de SimpleDB
- Référence rapide pour SimpleDB.
- Le guide de développement pour S3, en anglais
- les concepts principaux de S3
- Lecture/modification conditionnelle de données : SimpleDB Consistency Enhancements
- Lire l'API java de tous les services AWS.
- AWS kit pour java AWS pour java