cours 2/3 - architecture web
DESCRIPTION
Cours donné à l'HETIC aux H4. Architecture Web. Ce cours traite des serveurs web, bases de données, application et scripts ainsi que des CDN.TRANSCRIPT
Architecture web Cours
La saison 2013 n’aura pas lieu.
Reconversion de Alain Afflelou
Des bonnes et mauvaises architectures
Caches et leur importance
Principes du cloud
Load balancers et proxys
Serveurs Web
Applications
Bases de données
CDN
Battle Plan pour aujourd’hui
Serveurs Web
Le client
et le serveur
1989 CERN WWW HTTP HTML Tim Berners-Lee
(aka TimBL)
WWW > Nexus
Ecouter sur le port 80
Analyser les connexions HTTP
Envoyer le contenu demandé
Récupérer les fichiers sur le
disque
Exécuter des scripts /
applications
Gérer plusieurs connexions simultanées
Requête 1 Requête 4 Requête 7
Requ
ête
2
Requ
ête
3
Requête 5
Requête 6
Requête 1
Requête 2 Requête 5
Requête 3
Requête 6
Requête 7
Requête 9
Requête 10
Requête 4 Requête 8
1 2 3 4 5 6 7 8 9 10
Requête 1
Requête 2 Requête 5
Requête 3
Requête 6
Requête 7
Requête 9
Requête 10
Requête 4
Requête 8 1 2 3 4 5 6 7 8 9 10
Requête 8
Apache
Evenements Threads
1 2
3 4
En ligne
Threads
Contenus
1 2
1 2 3 4 5
3 4
5 Evenements
Combien de serveurs web connaissez vous ?
Apache
rambler.ru 500 Millions de page vues
par jour
Igor Sysoev
2002
30% TOP 1000
C10K
V8 Google Javascript Engine
Serveur Web Evenementiel
var http = require('http');! !http.createServer(! function (request, response) {! response.writeHead(200, {'Content-Type': 'text/plain'});! response.end('Hello World\n');! }!).listen(8000);! !console.log('Server running at http://localhost:8000/');!
Push & Long Polling
C’est quoi le long polling ?
Client JS Serveur λ
getNewEvents();
“null”
getNewEvents();
“null”
getNewEvents();
“{ "Message": "Hello World!" }”
Hello World Event
1
2
3
Client JS Node.js
getNewEvents();
“{ "Message": "Hello World!" }”
Hello World Event
Looooong HTTP
Applications
1993 NCSA CGI 1997 RFC-3875
Ken Coar
Common Gateway Interface
http
CGI
Application
stdin stdout
http
Serveur Web
Client
1 requête = 1 process
1996 FastCGI
PHP-FPM Drupal
PHP-FPM Drupal
PHP-FPM Drupal
Bases de données
1964 Ansi/Sparc Prix Turing 1970 SQL IBM
Charles Bachman
Base de données hiérarchiqueBase de données réseauBase de données relationnelleBase de données orientée objetBase de données orientée documentsBase de données XMLBase de données orientée composant
Base de données relationnelle
Normalisation
David Axmark
1995
MyISAM
Pas de transactions
Lock de tables
InnoDB
ACID
Lock de lignes
C’est quoi le acid ?
Atomicité Cohérence Isolation Durabilité
Atomicité
Cohérence
Isolation
Durabilité
SELECT nom FROM personnes WHERE id = 2
for (i=0; i<5000000; i++) { if personne[i].id == 2 break; }
Indexes
SELECT! DISTINCT(node.nid) AS nid,! node_data_field_contenu_1.field_contenu_1_nid AS node_data_field_contenu_1_field_contenu_1_nid,! node.TYPE AS node_type,! node.vid AS node_vid,! node_data_field_contenu_1.field_contenu_2_nid AS node_data_field_contenu_1_field_contenu_2_nid,! node_data_field_contenu_1.field_contenu_3_nid AS node_data_field_contenu_1_field_contenu_3_nid,! node_data_field_contenu_1.field_contenu_4_nid AS node_data_field_contenu_1_field_contenu_4_nid,! node_data_field_contenu_1.field_contenu_5_nid AS node_data_field_contenu_1_field_contenu_5_nid,! node_data_field_contenu_1.field_contenu_6_nid AS node_data_field_contenu_1_field_contenu_6_nid,! node_data_field_date.field_date_value AS node_data_field_date_field_date_value!FROM node node!LEFT JOIN content_field_date node_data_field_date ON node.vid = node_data_field_date.vid!LEFT JOIN content_type_une node_data_field_contenu_1 ON node.vid = node_data_field_contenu_1.vid!WHERE! ((node.TYPE IN ('tagazok')) AND (node.STATUS <> 0))! AND (DATE_FORMAT(STR_TO_DATE(node_data_field_date.field_date_value, '%Y-%m-%dT%T'), '%Y-%m-%d\\T%H:%i:%s')<= '2009-06-30T00:55:00')!ORDER BY node_data_field_date_field_date_value DESC!LIMIT 0,1!
Théorème CAP
Consistency Availability
Partition Tolerance 2
Carlo Strozzi
1998
NoSQL
MongoDB
Cassandra
CouchDB Voldemort
Big Table
HyperTable
use mydb!
j = { name : "mongo" }!k = { x : 3 }!
db.things.insert( j )!db.things.insert( k )!
Collections
db.inventory.find( !{ type: 'food', ! price: { ! $lt: 9.95 } !} )!
Sharding
CDN
Akamai = Intélligent
TelCo CDN
@mtopolov