![]() |
|
![]() | "Symfony is a request based framework." ~ Fabien Potencier |
$response = new FanceResponseClass();
echo $response->getOutput();
fastcgi_finish_request();
$service = HeavyLiftingService();
$service->doStuff();
https://gitlab.com/JanGregor/async-processing-slides/tags/symfony-live-london-2017
Queuing
$resque = $this->get('bcc_resque.resque');
$job = new HeavyLiftingJob([
'name' => $name
]);
$resque->enqueue($job);
Queuing
$msg = ['name' => $name];
$this->get('old_sound_rabbit_mq.heavy_lifting_job_producer')
->publish(json_encode($msg));
Queuing
$message = new PlainMessage('HeavyLifting', [
'name' => $name,
]);
$producer->produce($message);
Queuing
$msg = ['name' => $name];
$producer->sendCommand('HeavyLiftingProcessor', json_encode($msg));
Queuing
$message = new HeavyLiftingMessage($name);
$bus->dispatch($message);
class CustomPublisher
{
public function publish($message)
{
$payload = $this->serializer->serialize($message, 'json');
$this->producer->sendCommand('HeavyLiftingProcessor', $payload);
// or (e.g. RabbitMQ bundle)
// $this->producer->publish($payload)
}
}
Just like: HTTP-Clients, Repositories, ...
Consuming
class HeavyLiftingJob implements PerformantJobInterface
{
public function perform($args)
{
echo $args['name'];
}
}
Consuming
class HeavyLiftingService implements ConsumerInterface
{
public function execute(AMQPMessage $msg)
{
$arguments = json_decode($msg->body);
echo $arguments->name;
return ConsumerInterface::MSG_ACK;
}
}
Consuming
class HeavyLiftingReceiver
{
public function heavyLifting(Message $message)
{
$arguments = $message->all();
echo $arguments['name'];
}
}
Consuming
class HeavyLiftingProcessor implements PsrProcessor
{
public function process(PsrMessage $message, PsrContext $session)
{
$arguments = json_decode($message->getBody());
echo $arguments->name;
return self::ACK;
}
}
Consuming
class MyMessageHandler
{
public function __invoke(HeavyLiftingMessage $message)
{
echo $message->name;
}
}
class MyMessageHandler
{
public function __invoke(HeavyLiftingMessage $message)
{
$this->echoService->print($message);
}
}
Just like: Controller, Listener, Commands, ...
class CustomPublisher
{
public function publish($message)
{
$message->uuid = uniqid();
$payload = $this->serializer->serialize($message, 'json');
$this->producer->sendCommand(
'HeavyLiftingProcessor',
$payload
);
$logger->info('Did Published message.', [
'id' => $message->uuid,
'message' => $message,
]);
}
}
class CustomPublisher
{
public function publish($message)
{
$event = new GenericEvent($message);
$this->dispatcher->dispatch('app.publisher.pre_publish', $event);
$payload = $this->serializer->serialize($message, 'json');
$this->producer->sendCommand('HeavyLiftingProcessor', $payload);
$event = new GenericEvent($message);
$this->dispatcher->dispatch('app.publisher.post_publish', $event);
}
}
class CustomConsumer
{
public function consume($message)
{
is_int($message->tries) ? $message->tries++ : $message->tries = 1;
try {
$this->echoService->print($message);
} catch (\Exception $e) {
if ($message->tries >= $this->maxTries) {
$this->deadLetterPublisher->publish($message)
} else {
$this->publisher->publish($message)
}
}
}
}
class CustomConsumer
{
public function consume($message)
{
$this->echoService->print($message);
if ($this->shouldShutdown()) {
exit();
}
}
}
Feedback is important!
![]() |