Click here to load reader

Node.js dans les nuages

  • View
    438

  • Download
    1

Embed Size (px)

Text of Node.js dans les nuages

  • Node.js dans les nuages

  • /me

    Jean-Sbastien FRANCK@jsebfranckhttp://jsebfranck.blogspot.fr/

  • Use case

    Le frontend est prt. Comment on va en prod ?

    Backend 1

    Backend 2

    Backend 3

  • #1 la v0 est prte

    il faut la mettre en ligne

  • On fait tout la main ?

    EC2 / Load balancer / Route 53 git clone / npm install / node server.js upstart ? forever ? ...

  • Hosting dapplication web Surcouche de plusieurs services AWS Interface web simple Cration automatise de linfra Machines optimises pour Node.js

  • Elastic Beanstalk support

  • Load balancer

    Backend 1

    S3v1.zipv2.zip

    conf.zip

    Console / API

    USER

    Backend 2

    Backend 3

    EC2

    Elastic Beanstalk

    DEV /OPS

    Infra v0

    Route 53DNS

  • #2 jai suivi le fichier Word de

    dploiement, mais jai cass la prod

  • Script de dploiement en Node.js awsUtil.uploadArchiveToS3(params.filename, params.remoteFilename).then(function() {

    return awsUtil. createApplicationVersion(params.versionLabel, params.description, params.remoteFilename);

    }).then(function(versionDetails) {

    return awsUtil. updateEnvironmentVersion(params.environment, versionDetails.versionLabel);

    }).then(function() {

    return awsUtil. waitEnvironmentToBeReady(params.environment);

    }).then(function() {

    defered.resolve('Deployment is finished.')

    }).catch(function(err) {

    defered.reject(err);

    });

  • Load balancer

    Backend 1

    S3v1.zipv2.zip

    conf.zip

    Console / API

    USER

    Backend 2

    Backend 3

    EC2

    Elastic Beanstalk

    DEV /OPS

    Infra avec usine logicielle

    Route 53DNS

    EC2

  • #3 la V1 est mise en ligne et les premiers utilisateurs arrivent : le site devient

    trs lent

  • Optimiser le codeEn local :

    Trouver les limites

    Analyser

    Optimiser

    Valider

  • class MySimulation extends Simulation {

    val httpProtocol = http.baseURL("http://localhost:3000");

    val scn = scenario("My scenario").exec(http("GET /myPage").get("/myPage"));

    setUp(scn.inject(constantUsersPerSec(10) during (1 minutes))).protocols(httpProtocol)

    }

  • Optimisations

    Redis / Elasticache Clustering Descripteurs de fichiers Templates swig en cache Refactoring divers

  • Dimensionnement de linfra

    Objectifs : dterminer le meilleur rapport performances / cots quel type dinstance EC2 ? quel type de cache ?

    Tests Gatling sur linfra AWS partir dune instance EC2

  • RsultatsNode : 2 x t2.medium, cache : m3.medium600 pages / seconde pendant 10 minutes

  • Scalabilit linaire

    2x t2.medium : 600 pages / seconde 4x t2.medium : 1200 pages / seconde 8x t2.medium : 2400 pages / seconde

    600 pages par seconde = en thorie 1,5 milliards de pages par mois

  • Load balancer EC2 t2.medium

    x2

    Backend 1S3

    v1.zipv2.zip

    conf.zip

    Console / API

    USER

    Elasticache

    Redis

    EC2

    Backend 2

    Backend 3

    EC2 t2.medium

    x2

    Elastic Beanstalk

    DEV /OPS

    Infra avec 2xt2.medium, cache et tests Gatling

    Route 53DNS

  • #4 le boss nest pas content

    dune feature, il aurait voulu une dmo sur un autre environnement

  • E.Beanstalk : les environnements

  • Pipeline dans jenkins

    Build Test Deploy

    Promote Promote

  • Script de promotion en Node.jsawsUtil.getEnvironmentInfo(params.source).then(function(environment) {

    return awsUtil. updateEnvironmentVersion(params.target, environment.version);

    }).then(function() {

    return awsUtil. waitEnvironmentToBeReady(params.target);

    }).then(function() {

    logger.info(%s has been updated from %s, params.target, params.source);

    }).catch(function(err) {

    logger.error(err);

    });

  • #5 premier spot TV,

    le site ne rpond plus

  • E.Beanstalk : Auto Scaling Group

    if (load > x) addInstance();

    Configurable sur : usage CPU usage rseau usage disque latence ...

  • Exemple de configuration :

    Entre 2 et 4 instances EC2

    if (latency > 2) addInstance();

    if (latency < 1) removeInstance();

    E.Beanstalk : Auto Scaling Group

  • Source : http://aws.amazon.com/fr/architecture/

  • Auto scaling group

    Load balancer EC2 t2.medium

    x2

    Backend 1S3

    v1.zipv2.zip

    conf.zip

    Console / API

    USER

    Elasticache

    Redis

    EC2

    Backend 2

    Backend 3

    EC2 t2.medium

    x2

    Elastic Beanstalk

    DEV /OPS

    Infra avec Auto Scaling Group

    Route 53DNS

  • #6le site se fait attaquer

  • Scurit

    AWS : tokens & security groups npm retire npm outdated Helmet : middlewares pour Express HTTPS https://www.owasp.org/

  • #7les pages mettent trop de temps safficher sur une

    connexion mobile

  • Intgration avec WebPageTest

  • Optimiser les pages Web Diminuer le nombre de requtes Des requtes moins lourdes Cacher les requtes

    => Concatnation, minification, cache-control, inliner les images, nettoyage du code mort, above the fold...

  • Content Delivery Network

    AWS Cloudfront En point dentre de la webapp Rapproche lutilisateur des serveurs Exemple pour la France :

    Data centers proches : Dublin et Francfort CDN proches : Paris et Marseille

  • Cache busting pour les assets

    Module Node Connect-cachify

  • Auto scaling group

    Load balancer EC2 t2.medium

    x2

    Backend 1S3

    v1.zipv2.zip

    conf.zip

    Console / API

    USER

    Elasticache

    RedisCloudfrontCDN

    EC2

    Backend 2

    Backend 3

    EC2 t2.medium

    x2

    Elastic Beanstalk

    DEV /OPS

    Infra avec CDN

    Route 53DNS

  • #8lors dun dploiement en

    pleine journe, il y a un pic derreurs

  • Test Gatling lors dun dploiement

    1% de requtes KO, jusqu 30 secondes de latence

  • E.Beanstalk : Zero Downtime Deployment

    Mise jour des serveurs un par un :

  • Aprs configuration

    ~0% de requtes KO, jusqu 5 secondes de latence

  • Avec le CDN

    Aucun impact notable !

  • #9le site est down tout le

    dimanche sans que personne ne sen rende

    compte

  • Elastic Beanstalk : Cloudwatch

    Alertes configurables

  • App Performance Management

    Alertes configurables

    + Health check

  • Agrgation des logs

    Intgration facile avec Winston

  • +

  • Auto scaling group

    Load balancer EC2 t2.medium

    x2

    Backend 1S3

    v1.zipv2.zip

    conf.zip

    Console / API

    USER

    Elasticache

    RedisCloudfrontCDN

    EC2

    Backend 2

    Backend 3

    EC2 t2.medium

    x2

    Elastic Beanstalk

    DEV /OPS

    Infra avec monitoring

    Route 53DNS

    CloudwatchMonitoring

  • #10le boss veut de la visibilit

    sur les cots

  • Bnfices du cloud

    On ne paye que ce que lon consomme

  • Bnfices du cloud

    Pas de maintenance de data-center En quelques clics :

    Augmentation / rduction des ressources Mise en place de nouvelles infras Dploiement linternational

    => On se concentre sur le mtier

  • Cots AWS

    Billing accessible

    Pricing Elastic Beanstalk = pricing des services utiliss

  • Cots mensuelsCots

    Usine logicielle & Dev 2 instances small : 2 * 20$ / mois

    Preprod 2 instances medium : 2 * 41$ / mois

    Production 2 instances medium : 2 * 41$ / mois

    Cache 2 noeuds medium : 2 * 70$ / mois

    CDN 10 millions de pages vues 500KB : ~700$ / mois

    Papertrail (Logs) 16GB cherchables sur 2 semaines : 150$ / mois

    Newrelic (APM) 2 hosts : 180$ / mois

    Total ~1400$ / mois

  • Auto scaling group

    Load balancer EC2 t2.medium

    x2

    Backend 1S3

    v1.zipv2.zip

    conf.zip

    Console / API

    USER

    Elasticache

    RedisCloudfrontCDN

    EC2

    Backend 2

    Backend 3

    EC2 t2.medium

    x2

    Elastic Beanstalk

    DEV /OPS

    Merci ! @jsebfranck

    Route 53DNS

    CloudwatchMonitoring

Search related