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.

418997665c4a3368515ecf9c3d746b95?s=128

Olivier Dolbeau

March 13, 2013
Tweet

Transcript

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

  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, …!
  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!
  4. AMQP - Signification Advanced! Message! Queuing! Protocol!

  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é. »"
  6. AMQP – Concrètement

  7. AMQP - Produits StormMQ

  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. »"
  9. Cas pratique – mot de passe oublié

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

    token! ! Envoi d’un email!
  11. MDP oublié – Contexte 2/2 LENT !! ! ! A

    cause de l’envoi d’email:! ! Rendu de la page lent! Client pas content!
  12. MDP oublié – Envoi à RabbitMQ C’est faux ! mot

    de passe Email envoyé ! Message json Générique Structuré Simple
  13. MDP oublié – Traitement du message dépile ack

  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!
  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!
  16. Cas pratique – publication asynchrone

  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é!
  18. Publication - Schéma publication wait message Ok ?

  19. AMQP – Rappel

  20. Fanout Exchange

  21. Topic Exchange

  22. Direct Exchange

  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
  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!
  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 ?!!
  26. Difficultés – Perte de messages 2/3

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

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

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

  30. Difficultés – Vitesse 2/3

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

    … Exchange queue_delay
  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!
  33. Tâches cron – fonctionnement classique

  34. Crons - Publication dans RabbitMQ

  35. Cron - Consommation des messages

  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!
  37. Crons - Gestion du lock 1/2

  38. Crons - Gestion du lock 2/2

  39. Conclusion RabbitMQ Rocks !! •  Rapide !! •  Séparation des

    responsabilités! •  Gestion des priorités! •  Traitement unitaire!
  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!
  41. Questions ?! On recrute !