If you liked what you've learned so far, dive in!
Subscribe to get access to this tutorial plus
video, code and script downloads.
With a Subscription, click any sentence in the script to jump to that part of the video!
Login SubscribeLa última opción que quiero mencionar es interesante... pero también puede resultar confusa. Se llama from_transport
.
Si te fijas en messenger.yaml
, este DeleteImagePost
no se enruta a ninguna parte, lo que significa que se maneja de forma sincrónica. Imaginemos que queremos manejarlo de forma asíncrona... y que lo dirigimos al transporte async
. Establece from_transport
en async
..
... lines 1 - 12 | |
class DeleteImagePostHandler implements MessageSubscriberInterface | |
{ | |
... lines 15 - 34 | |
public static function getHandledMessages(): iterable | |
{ | |
yield DeleteImagePost::class => [ | |
... lines 38 - 44 | |
'from_transport' => 'async' | |
]; | |
} | |
} |
y luego dirige temporalmente esta clase a ese transporte en messenger.yaml
.
Ahora, imagina que el mensaje DeleteImagePost
tiene realmente dos manejadores... algo que es muy posible para los eventos. Suponiendo que aún no hayamos añadido esta configuración de from_transport
, si enviaste DeleteImagePost
al transporteasync
, entonces cuando ese mensaje sea leído desde ese transporte por un trabajador, ambos manejadores se ejecutarán uno tras otro.
Pero, ¿qué pasaría si quisieras, más o menos, enviar un manejador de ese mensaje a un transporte, quizá async_priority_high
, y otro manejador a otro transporte? Pues bien, en Messenger no se envían "manejadores"... se envían mensajes... y cuando Messenger consume un mensaje, llama a todos los manejadores de ese mensaje. ¿Significa eso que es imposible hacer que un manejador de un mensaje tenga una prioridad "alta" y otro baja? No Este flujo de trabajo es posible.
En primer lugar, encamina DeleteImagePost
a los dos transportes async
y async_priority_high
framework: | |
messenger: | |
... lines 3 - 34 | |
routing: | |
... lines 36 - 38 | |
'App\Message\Command\DeleteImagePost': [async, async_priority_high] |
Si sólo hiciéramos esto, el mensaje se enviaría a ambos transportes, se consumiría dos veces, y cada manejador sería llamado dos veces... lo cual no es en absoluto lo que queremos... a menos que cada manejador esté horneando galletas... o algo así.
Pero cuando añadimos esta opción from_transport
configurada en async
, significa que este manejador sólo debe ser llamado cuando se consuma un objeto DeleteImagePost
desde el transporteasync
. Si configuramos un segundo manejador con from_transport
establecido en async_priority_high
, ese manejador sólo sería llamado cuando el mensaje se consuma desde ese transporte.
En otras palabras, estás enviando el mensaje a dos transportes, pero cada uno de ellos sabe que sólo debe ejecutar un manejador. Esto permite que tus dos manejadores se pongan en cola y sean ejecutados por los trabajadores de forma independiente el uno del otro. Es una función realmente poderosa... pero como Messenger se centra en el envío de mensajes a los transportes, su uso excesivo puede resultar confuso.
Vamos a comentar esto y a eliminar la configuración de enrutamiento.
... lines 1 - 12 | |
class DeleteImagePostHandler implements MessageSubscriberInterface | |
{ | |
... lines 15 - 34 | |
public static function getHandledMessages(): iterable | |
{ | |
yield DeleteImagePost::class => [ | |
... lines 38 - 44 | |
//'from_transport' => 'async' | |
]; | |
} | |
} |
Eso es básicamente todo en cuanto a las opciones que puedes pasar aquí... aunque siempre puedes consultar MessageSubscriberInterface
: habla de lo que está disponible.
A continuación, vamos a mejorar nuestro juego de colas cambiando el transporte Doctrine por RabbitMQ, también conocido como AMQP. ¡Es muy divertido!
"Houston: no signs of life"
Start the conversation!
// composer.json
{
"require": {
"php": "^7.1.3",
"ext-ctype": "*",
"ext-iconv": "*",
"composer/package-versions-deprecated": "^1.11", // 1.11.99
"doctrine/annotations": "^1.0", // v1.8.0
"doctrine/doctrine-bundle": "^1.6.10", // 1.11.2
"doctrine/doctrine-migrations-bundle": "^1.3|^2.0", // v2.0.0
"doctrine/orm": "^2.5.11", // v2.6.3
"intervention/image": "^2.4", // 2.4.2
"league/flysystem-bundle": "^1.0", // 1.1.0
"phpdocumentor/reflection-docblock": "^3.0|^4.0", // 4.3.1
"sensio/framework-extra-bundle": "^5.3", // v5.3.1
"symfony/console": "4.3.*", // v4.3.2
"symfony/dotenv": "4.3.*", // v4.3.2
"symfony/flex": "^1.9", // v1.18.7
"symfony/framework-bundle": "4.3.*", // v4.3.2
"symfony/messenger": "4.3.*", // v4.3.4
"symfony/property-access": "4.3.*", // v4.3.2
"symfony/property-info": "4.3.*", // v4.3.2
"symfony/serializer": "4.3.*", // v4.3.2
"symfony/validator": "4.3.*", // v4.3.2
"symfony/webpack-encore-bundle": "^1.5", // v1.6.2
"symfony/yaml": "4.3.*" // v4.3.2
},
"require-dev": {
"easycorp/easy-log-handler": "^1.0.7", // v1.0.7
"symfony/debug-bundle": "4.3.*", // v4.3.2
"symfony/maker-bundle": "^1.0", // v1.12.0
"symfony/monolog-bundle": "^3.0", // v3.4.0
"symfony/stopwatch": "4.3.*", // v4.3.2
"symfony/twig-bundle": "4.3.*", // v4.3.2
"symfony/var-dumper": "4.3.*", // v4.3.2
"symfony/web-profiler-bundle": "4.3.*" // v4.3.2
}
}