Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Retour d'expérience sur l'utilisation de RabbitMQ chez BlaBlaCar

Retour d'expérience sur l'utilisation de RabbitMQ chez BlaBlaCar

Passage en revue de différents use cases intégrant RabbitMQ; l'oubli de mot de passe, la publication asynchrone et les tâches crons.
Mise en évidence des problèmes rencontrés et solutions apportées.

Présentation faite au sfPot de Paris le 12 mars 2013.

Olivier Dolbeau

March 13, 2013
Tweet

More Decks by Olivier Dolbeau

Other Decks in Programming

Transcript

  1. AMQP - RabbitMQ
    Retour d’expérience
    Olivier Dolbeau
    @odolbeau

    View Slide

  2. Blablacar – Quelques chiffres
    Nos utilisateurs :!
    •  3 millions (bientôt !)!
    •  France, Espagne, Angleterre, Italie, Benelux, Pologne...!
    Archi :!
    •  PHP 5.3 - Mysql 5.5 (percona)!
    •  2 serveurs frontaux (+ 4 virtuals spares)!
    •  2 MySQL masters + 4 slaves!
    •  sf2, Redis, ElasticSearch, …!

    View Slide

  3. Sommaire
    •  Présentation d’AMQP!
    •  Présentation de RabbitMQ!
    •  Cas pratique: mot de passe oublié!
    •  Gains de l’asynchrone!
    •  Cas pratique: publication asynchrone!
    •  Problèmes rencontrés / Solutions!
    •  Tâches crons!
    •  Conclusion!

    View Slide

  4. AMQP - Signification
    Advanced!
    Message!
    Queuing!
    Protocol!

    View Slide

  5. AMQP - Définition
    « L’objectif d’AMQP est de standardiser les échanges entre
    serveurs de messages en se basant sur les principes
    suivants : orienté message, utilisation de files d’attente,
    routage (point à point et par diffusion/abonnement), fiabilité
    et sécurité. »"

    View Slide

  6. AMQP – Concrètement

    View Slide

  7. AMQP - Produits
    StormMQ

    View Slide

  8. RabbitMQ - Définition
    « You can think about it as a post office:
    when you send mail to the post box you're
    pretty sure that Mr. Postman will eventually
    deliver the mail to your recipient. Using this
    metaphor RabbitMQ is a post box, a post
    office and a postman. »"

    View Slide

  9. Cas pratique – mot de passe oublié

    View Slide

  10. MDP oublié – Contexte 1/2
    Simple!
    !
    !
    Génération d’un token!
    !
    Envoi d’un email!

    View Slide

  11. MDP oublié – Contexte 2/2
    LENT !!
    !
    !
    A cause de l’envoi d’email:!
    !
    Rendu de la page lent!
    Client pas content!

    View Slide

  12. MDP oublié – Envoi à RabbitMQ
    C’est faux !
    mot de passe
    Email envoyé !
    Message json
    Générique
    Structuré
    Simple

    View Slide

  13. MDP oublié – Traitement du message
    dépile
    ack

    View Slide

  14. Gains de l’asynchrone
    Logique métier déplacée!
    !
    Très avantageux:!
    !
    •  Temps de réponse amélioré!
    •  Charge serveur diminuée!
    •  Séparation des différentes logiques:!
    •  Les frontaux génèrent des pages!
    •  Les workers s’occupent du métier!

    View Slide

  15. Cas d’utilisation
    •  Envoi d’emails / SMS!
    •  Suppression de compte!
    •  Création d’alertes (recherches)!
    •  Enregistrement de l’historique des recherches!
    •  Log des actions utilisateurs!
    •  Publication de trajets!

    View Slide

  16. Cas pratique – publication asynchrone

    View Slide

  17. Publi asynchrone – le pourquoi du comment
    Enjeux:!
    •  Logique métier complexe!
    •  Temps de traitement conséquent!
    •  Nombreuses écritures en base!
    •  Envoi de mail!
    •  Mise à jour de Redis, ElasticSearch, etc.!
    Implémentation!
    •  Informations publiées dans RabbitMQ!
    •  Forcément, traitement asynchrone!
    •  Ajax pour checker si le trajet a bien été publié!

    View Slide

  18. Publication - Schéma
    publication
    wait
    message
    Ok ?

    View Slide

  19. AMQP – Rappel

    View Slide

  20. Fanout Exchange

    View Slide

  21. Topic Exchange

    View Slide

  22. Direct Exchange

    View Slide

  23. RabbitMQ chez BlaBlaCar
    Exchange
    key1
    queue
    key2
    key3

    Type: direct
    Par exemple: Mot de passe oublié.
    Exchange: User
    Routing key: password_forgotten
    Routé dans la queue: User

    View Slide

  24. Difficultés – Gestion des workers
    Problèmes!
    •  PHP !!
    •  Fuites mémoires!
    •  Arrêt / Redémarrage (dans le cas de MEP notamment)!
    Solutions!
    •  Crash régulier des workers!
    •  Tous les x messages traités!
    •  Toutes les x minutes!
    •  Lancement du Garbage Collector manuel!
    •  Gestion des signaux avec pcntl!

    View Slide

  25. Difficultés – Perte de messages 1/3
    La sécurité des messages est garantie… lorsqu’ils sont
    dans RabbitMQ.!
    •  Une exception dans un traitement ?!
    •  Un crash bête et méchant ?!
    => MESSAGE PERDU ?!!

    View Slide

  26. Difficultés – Perte de messages 2/3

    View Slide

  27. Difficultés – Perte de messages 3/3
    key1
    queue
    dl queue_dl
    key2
    key3

    Exchange

    View Slide

  28. Difficultés – Vitesse 1/3
    •  RabbitMQ est rapide.!
    TRES
    rapide !

    View Slide

  29. Problème de réplication
    inscription message
    write
    NACK
    completed !

    View Slide

  30. Difficultés – Vitesse 2/3

    View Slide

  31. Difficultés – Vitesse 3/3
    key1
    queue
    dl queue_dl
    key2
    key3

    Exchange
    queue_delay

    View Slide

  32. Cas d’utilisation
    •  Envoi d’emails / SMS!
    •  Suppression de compte!
    •  Création d’alertes (recherches)!
    •  Enregistrement de l’historique des recherches!
    •  Log des actions utilisateurs!
    •  Publication asynchrone!
    •  Tâches crons!

    View Slide

  33. Tâches cron – fonctionnement classique

    View Slide

  34. Crons - Publication dans RabbitMQ

    View Slide

  35. Cron - Consommation des messages

    View Slide

  36. Gains de l’asynchrone dans les crons
    Logique métier déplacée!
    !
    Très avantageux:!
    !
    •  Vitesse des crons améliorée!
    •  Traitements unitaires VS traitements par lots!
    •  Séparation des différentes logiques:!
    •  Les crons sélectionnent les enregistrements!
    •  Les workers s’occupent du métier!
    •  Plus souple!
    •  Plus d’enregistrements à traiter = plus de workers!

    View Slide

  37. Crons - Gestion du lock 1/2

    View Slide

  38. Crons - Gestion du lock 2/2

    View Slide

  39. Conclusion
    RabbitMQ Rocks !!
    •  Rapide !!
    •  Séparation des responsabilités!
    •  Gestion des priorités!
    •  Traitement unitaire!

    View Slide

  40. Et plus encore…
    Autres avantages:!
    •  Possibilité de routing extrêmement avancé!
    •  Langage agnostique!
    •  HA!
    Autres problèmes:!
    •  Kernel sf2 modifié -> capl!
    •  Gestion des connections BDD, Redis, etc.!
    •  Monolog: conserve tous les logs par défaut!

    View Slide

  41. Questions
    ?!
    On
    recrute !

    View Slide