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

  • 327