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.phpVolume 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:importbin/console rabbitmq:consumebin/console rabbitmq:consumebin/console messenger:consumebin/console app:legacy:importbin/console rabbitmq:consumebin/console rabbitmq:consumebin/console messenger:consumeHM
Product
Order
Client
bin/console app:legacy:importbin/console rabbitmq:consumebin/console rabbitmq:consumebin/console messenger:consumeHM
{
"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/bpmConfigurer 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-transportshttp://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=256On 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