Clément Bertillon
🏆 Certifié Symfony 2, 4
🎉 Certifié Twig
https://twitter.com/BERTILLONClment
https://github.com/skigun
🏆 Certifié AWS
- La migration d'une base de données vers X base de données
- L'utilisation de RabbitMQ chez ProwebCe depuis 3 ans
- La mise en place d'un cluster RabbitMQ
L'occasion de capitaliser sur :
HM
BPM
HM
BPM
$ php -d -memory_limit=1 import_script.php
Volume important
Traitement long
Gestion d'erreurs
1.5 milliards de lignes
Plusieurs jours
Interruption et reprise du traitement et des données
HM
BPM
HM
Product
Stock
Client
GiftVoucher
Order
Accounting
Common
Invoice
Supplier
PaymentMethod
Search
Delivery
bin/console app:legacy:import
bin/console rabbitmq:consume
bin/console rabbitmq:consume
bin/console messenger:consume
bin/console app:legacy:import
bin/console rabbitmq:consume
bin/console rabbitmq:consume
bin/console messenger:consume
HM
Product
Order
Client
bin/console app:legacy:import
bin/console rabbitmq:consume
bin/console rabbitmq:consume
bin/console messenger:consume
HM
{
"id": 42,
"source_entity": "Client",
"operation": "IMPORT"
}
Product
Order
Client
### .env
RABBITMQ_URL=amqp://guest:guest@rabbitmq:5672
## OR
MESSENGER_DSN=amqp://guest:guest@rabbitmq:5672/bpm
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: ~
bin/console rabbitmq:setup-fabric
## OR
bin/console messenger:setup-transports
http://rabbitmq.docker:15672/#/queues
old_sound_rabbit_mq:
consumers:
sync_legacy_db:
idle_timeout: 1800
idle_timeout_exit_code: 0
graceful_max_execution:
timeout: 3600
bin/console rabbitmq:consumer --memory-limit=256
On le fait pas chez ProwebCE...
bin/console rabbitmq:consumer --messages=100
[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
Publisher | Consumer | Mysql | Redis | |
---|---|---|---|---|
Mémoire alloué | ||||
Temps d'execution | ||||
Latence réseau |
Bonus : Nombre de message sur les queues RabbitMQ ?
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
[program:import]
command = bin/console messenger:consume import_queue -m 100
numprocs=10