Symfony Messenger: Eine Einführung

Symfony Messenger: Eine Einführung

Eine der großen Neuerungen in Symfony 4.1 ist die Messenger-Komponente, die als experimentelles Feature zur Verfügung steht. In meinem Talk möchte ich die Komponente und ihre Funktionsweise an einem praktischen Beispiel vorstellen.

6a1345d8e6dd15b2c78eff0c331963b1?s=128

Denis Brumann

October 26, 2018
Tweet

Transcript

  1. Denis Brumann
 DENIS.BRUMANN@SENSIOLABS.DE
 @DBRUMANN 5 Message Bus Application A Application

    C Application A Application B Application D
  2. Denis Brumann
 DENIS.BRUMANN@SENSIOLABS.DE
 @DBRUMANN 6 Eine Einführung in die Symfony

    Messenger
 Komponente
  3. Denis Brumann
 DENIS.BRUMANN@SENSIOLABS.DE
 @DBRUMANN 6 Denis Brumann 
 DENIS.BRUMANN@SENSIOLABS.DE
 @DBRUMANN

  4. Denis Brumann
 DENIS.BRUMANN@SENSIOLABS.DE
 @DBRUMANN 7

  5. Denis Brumann
 DENIS.BRUMANN@SENSIOLABS.DE
 @DBRUMANN 8

  6. Denis Brumann
 DENIS.BRUMANN@SENSIOLABS.DE
 @DBRUMANN 9 1. Invite-Code prüfen 2. Neuen

    Benutzer anlegen 3. Invite-Code einlösen 4. Neue Invites erstellen 5. Benutzer benachrichtigen Registrierung
  7. Denis Brumann
 DENIS.BRUMANN@SENSIOLABS.DE
 @DBRUMANN 12

  8. Denis Brumann
 DENIS.BRUMANN@SENSIOLABS.DE
 @DBRUMANN 13

  9. Denis Brumann
 DENIS.BRUMANN@SENSIOLABS.DE
 @DBRUMANN 14

  10. Denis Brumann
 DENIS.BRUMANN@SENSIOLABS.DE
 @DBRUMANN 15

  11. Denis Brumann
 DENIS.BRUMANN@SENSIOLABS.DE
 @DBRUMANN 17

  12. Denis Brumann
 DENIS.BRUMANN@SENSIOLABS.DE
 @DBRUMANN 18

  13. Denis Brumann
 DENIS.BRUMANN@SENSIOLABS.DE
 @DBRUMANN 19 Registration
 Facade InvitationProvider::getOpenInvitation() SecurityController::register() UserCreator::create()

    InvitationRedeemer::redeem() InvitationGenerator::generateMultiple() InvitationNotifier::notifyInvitingUser()
  14. Denis Brumann
 DENIS.BRUMANN@SENSIOLABS.DE
 @DBRUMANN 20 - $registration->register($form->getData()); MessageBusInterface $messageBus
 


    + $messageBus->dispatch($form->getData());
  15. Denis Brumann
 DENIS.BRUMANN@SENSIOLABS.DE
 @DBRUMANN 21 Message Bus Delegiert Nachrichten an

    Handler oder versendet sie über den Transport
  16. Denis Brumann
 DENIS.BRUMANN@SENSIOLABS.DE
 @DBRUMANN 22 Message Framework-unabhängige serialisierbare
 Datenklasse

  17. Denis Brumann
 DENIS.BRUMANN@SENSIOLABS.DE
 @DBRUMANN 23 <?php declare(strict_types = 1); namespace

    App\Message; class RegisterUser { public $inviteCode; public $email; public $plainPassword; }
  18. Denis Brumann
 DENIS.BRUMANN@SENSIOLABS.DE
 @DBRUMANN 24

  19. Denis Brumann
 DENIS.BRUMANN@SENSIOLABS.DE
 @DBRUMANN 25 Handler Framework-unabhängige invokable
 Serviceklasse

  20. None
  21. implements MessageHandlerInterface

  22. public function __invoke(RegisterUser $message) implements MessageHandlerInterface

  23. Denis Brumann
 DENIS.BRUMANN@SENSIOLABS.DE
 @DBRUMANN 27 $handler($message); RedeemInvitationHandler __invoke()

  24. Denis Brumann
 DENIS.BRUMANN@SENSIOLABS.DE
 @DBRUMANN 28 InvitationProvider::getOpenInvitation() CreateUser
 Handler RedeemInvitation
 Handler

    GenerateInvitations
 Handler NotifyInviteOwner
 Handler SecurityController::register() Message Bus RegisterUser UserCreator
 create() InvitationRedeemer redeem() InvitationGenerator
 generateMultiple() InvitationNotifier
 notifyInvitingUser()
  25. Denis Brumann
 DENIS.BRUMANN@SENSIOLABS.DE
 @DBRUMANN 29 Create User Redeem Invite Create

    Invites Notify Invite Owner
  26. Denis Brumann
 DENIS.BRUMANN@SENSIOLABS.DE
 @DBRUMANN 30 <?php namespace Symfony\Component\Messenger\Handler; /** *

    Marker interface for message handlers. * * @author Samuel Roze <samuel.roze@gmail.com> * * @experimental in 4.1 */ interface MessageHandlerInterface { }
  27. Denis Brumann
 DENIS.BRUMANN@SENSIOLABS.DE
 @DBRUMANN 31 # config/services.yaml services: … App\Handler\RedeemInvitationHandler:

    tags: - { name: 'messenger.message_handler' }
  28. Denis Brumann
 DENIS.BRUMANN@SENSIOLABS.DE
 @DBRUMANN 32 interface MessageSubscriberInterface extends MessageHandlerInterface {

    /** * yield FirstMessage::class => ['method' => ‘firstMessageMethod']; * yield SecondMessage::class => [ * 'method' => ‘secondMessageMethod', * 'priority' => 20, * ‘bus' => ‘my_bus_name', * ]; */ public static function getHandledMessages(): iterable; }
  29. Denis Brumann
 DENIS.BRUMANN@SENSIOLABS.DE
 @DBRUMANN 33 CreateUser
 Handler RedeemInvitation
 Handler GenerateInvitations


    Handler NotifyInviteOwner
 Handler SecurityController::register() Message Bus RegisterUser RedeemInvitation CreateInvitations NotifyInviteOwner
  30. Denis Brumann
 DENIS.BRUMANN@SENSIOLABS.DE
 @DBRUMANN 34 Das Verhalten des Message Bus

    befindet sich in einem sortierten Middleware-Stack Middleware
  31. Denis Brumann
 DENIS.BRUMANN@SENSIOLABS.DE
 @DBRUMANN 35 AllowNoHandlerMiddleware DoctrineTransactionMiddleware LoggingMiddleware ValidationMiddleware Beispiele

  32. Denis Brumann
 DENIS.BRUMANN@SENSIOLABS.DE
 @DBRUMANN 36 framework: messenger: buses: messenger.bus.default: middleware:

    - App\Middleware\MyMiddleware - App\Middleware\AnotherMiddleware # default_middleware: false Konfiguration
  33. Denis Brumann
 DENIS.BRUMANN@SENSIOLABS.DE
 @DBRUMANN 37 LoggingMiddleware <eigene Middlewares> SendMessageMiddleware HandleMessageMiddleware

    Standard-Reihenfolge
  34. Denis Brumann
 DENIS.BRUMANN@SENSIOLABS.DE
 @DBRUMANN 38

  35. Denis Brumann
 DENIS.BRUMANN@SENSIOLABS.DE
 @DBRUMANN 39

  36. Denis Brumann
 DENIS.BRUMANN@SENSIOLABS.DE
 @DBRUMANN 40 Create User Redeem Invite Create

    Invites Notify Invite Owner
  37. Denis Brumann
 DENIS.BRUMANN@SENSIOLABS.DE
 @DBRUMANN 41 Create User Redeem Invite Create

    Invites Notify Invite Owner
  38. Denis Brumann
 DENIS.BRUMANN@SENSIOLABS.DE
 @DBRUMANN 42 Sendet/Empfängt Nachrichten
 aktuell: nur AMQP


    weitere Transports über Adapter Transport
  39. Denis Brumann
 DENIS.BRUMANN@SENSIOLABS.DE
 @DBRUMANN # config/packages/messenger.yaml framework: messenger: transports:
 amqp:

    '%env(MESSENGER_TRANSPORT_DSN)%'
 routing:
 App\Message\CreateInvitations: amqp App\Message\InvitationRedeemed: amqp 43 amqp://guest:guest@localhost:5672/%2f/messages
  40. Denis Brumann
 DENIS.BRUMANN@SENSIOLABS.DE
 @DBRUMANN 44 [InvalidArgumentException] No transport supports the

    given DSN
 "amqp://guest:guest@shared_queue:5672/%2f/messages".
  41. Denis Brumann
 DENIS.BRUMANN@SENSIOLABS.DE
 @DBRUMANN 45 [InvalidArgumentException] No transport supports the

    given DSN
 "amqp://guest:guest@shared_queue:5672/%2f/messages". AMQP-Extension installieren composer require serializer
  42. Denis Brumann
 DENIS.BRUMANN@SENSIOLABS.DE
 @DBRUMANN 46

  43. Denis Brumann
 DENIS.BRUMANN@SENSIOLABS.DE
 @DBRUMANN 46 headers: type: App\Message\InvitationRedeemed payload: {

    "invitation": "…" }
  44. Denis Brumann
 DENIS.BRUMANN@SENSIOLABS.DE
 @DBRUMANN 47 bin/console messenger:consume-messages Description: Consumes messages

    Usage: messenger:consume-messages [options] [--] <receiver> Arguments: receiver Name of the receiver Options: -l, --limit=LIMIT Limit the number of received messages -m, --memory-limit=MEMORY-LIMIT The memory limit the worker can consume -t, --time-limit=TIME-LIMIT The time limit in seconds the worker can run
  45. Denis Brumann
 DENIS.BRUMANN@SENSIOLABS.DE
 @DBRUMANN 48

  46. Denis Brumann
 DENIS.BRUMANN@SENSIOLABS.DE
 @DBRUMANN 49

  47. Denis Brumann
 DENIS.BRUMANN@SENSIOLABS.DE
 @DBRUMANN 50

  48. Denis Brumann
 DENIS.BRUMANN@SENSIOLABS.DE
 @DBRUMANN 50

  49. Denis Brumann
 DENIS.BRUMANN@SENSIOLABS.DE
 @DBRUMANN 51

  50. Denis Brumann
 DENIS.BRUMANN@SENSIOLABS.DE
 @DBRUMANN 52 Messages enthalten nur skalare Daten


    Im Handler Entities erneut laden Ohne Transport beginnen (synchron) (dev) Messages einzeln konsumieren Good Practices
  51. Denis Brumann
 DENIS.BRUMANN@SENSIOLABS.DE
 @DBRUMANN Vielen Dank