Jusqu'où peut-on aller avec RabbitMQ ?
Who am I ?
Clément Bertillon
🏆 Certifié Symfony 2, 4
🎉 Certifié Twig
https://twitter.com/BERTILLONClment
https://github.com/skigun
🏆 Certifié AWS
Retour d'expérience
- L'utilisation de RabbitMQ chez ProwebCe depuis 3 ans
- La mise en place d'un cluster RabbitMQ
- L'incident fin Août
L'occasion de capitaliser sur :
Merci à Ahmed, Guillaume, Loic, Reinis, Alexandre et tout ceux que j'ai oublié
Scénario : Import
HM
BPM
Scénario : Import
HM
BPM
$ php -d -memory_limit=1 import_script.php
Contraintes
Volume important
Traitement long
Gestion d'erreurs
150 millions de lignes
Plusieurs jours
Interruption et reprise du traitement et des données
L'équipe de Dev :
1er Draft
bin/console app:legacy:import
bin/console rabbitmq:consume
bin/console rabbitmq:consume
bin/console rabbitmq:consumer
bin/console app:legacy:import
bin/console rabbitmq:consume
bin/console rabbitmq:consume
bin/console rabbitmq:consumer
HM
BPM
bin/console app:legacy:import
bin/console rabbitmq:consume
bin/console rabbitmq:consume
bin/console rabbitmq:consumer
HM
BPM
{
"id": 42,
"source_entity": "Client",
"operation": "IMPORT"
}
Comment utiliser RabbitMQ
### .env
RABBITMQ_URL=amqp://guest:guest@rabbitmq:5672
## OR
MESSENGER_DSN=amqp://guest:guest@rabbitmq:5672/bpm
Configurer le DSN
Configurer un(e) Vhost directement dans le DSN
# config/packages/messenger.yaml
framework:
messenger:
transports:
sync_legacy_db_import:
dsn: '%env(MESSENGER_DSN)%'
serializer: messenger.transport.symfony_serializer
options:
exchange:
name: sync_legacy_db_import
queues:
sync_legacy_db_import: ~
retry_strategy: ~
Configurer votre Queue
bin/console rabbitmq:setup-fabric
## OR
bin/console messenger:setup-transports
http://rabbitmq.docker:15672/#/queues
Dashboard
Démo
Aller plus loin
Protéger vos consumers peu importe le context !
Bonne pratique
Sur le temps
old_sound_rabbit_mq:
consumers:
sync_legacy_db:
idle_timeout: 1800
idle_timeout_exit_code: 0
graceful_max_execution:
timeout: 3600
Sur la mémoire
bin/console rabbitmq:consumer --memory-limit=256
On le fait pas chez ProwebCE...
Sur le nombre de messages
bin/console rabbitmq:consumer --messages=100
Bonus : Protection pour supervisord
[program:import]
command = bin/console rabbitmq:consumer import_queue -m 100 || (sleep 10s && false)
user = www-data
redirect_stderr = true
numprocs=to_the_moon
process_name=%(program_name)s_%(process_num)02d
Performance
Publisher | Consumer | Mysql | Redis | |
---|---|---|---|---|
Mémoire alloué | ||||
Temps d'execution | ||||
Latence réseau |
Trouver les bottleneck
Bonus : Nombre de message sur les queues RabbitMQ ?
Exemple de latence réseau
Exemple de latence réseau
Si le traitement d'un message nécessite 4 appels à la base de données.
Pour 150 millions x 4 appels multipliés par la latence et divisés par 20 consumers par exemple.
Sur un traitement estimé à 3 jours, ça peut réprésenter 33% du temps passé
Ramené en temps on passe :
4,15 heures sur le Server 1
20,5 heures sur le Server 2
Un consumer par coeur logique maximum
[program:import]
command = bin/console rabbitmq:consumer import_queue -m 100
numprocs=10
Clustering
(HA & Scalability)
Cluster RabbitMQ
RABBITMQ_URL=amqp://guest:guest@rabbitmq-node1:5672
Load Balancer deux approches
- Un loadbalancer en amont du cluster (recommandé)
- Un loadbalancing côté applicatif
On est bon ? On est hautement disponible ?
Le 11 août...
Configurer la replication des queues
Merci
deck
By skigun
deck
- 319