Slide 1

Slide 1 text

Symfony Messenger 4.3 Symfony User Group Köln Von Thomas Wolf, www.foto-tw.de, CC BY-SA 3.0 de, https://commons.wikimedia.org/w/index.php?curid=62082470

Slide 2

Slide 2 text

Denis Brumann @dbrumann [email protected]

Slide 3

Slide 3 text

Message Bus Handler

Slide 4

Slide 4 text

Message

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

No content

Slide 7

Slide 7 text

No content

Slide 8

Slide 8 text

framework-agnostic data object

Slide 9

Slide 9 text

Bus

Slide 10

Slide 10 text

No content

Slide 11

Slide 11 text

No content

Slide 12

Slide 12 text

Handler

Slide 13

Slide 13 text

No content

Slide 14

Slide 14 text

No content

Slide 15

Slide 15 text

framework-agnostic service reacting to a specific message

Slide 16

Slide 16 text

No content

Slide 17

Slide 17 text

send receive

Slide 18

Slide 18 text

Transport

Slide 19

Slide 19 text

Sender Receiver

Slide 20

Slide 20 text

No content

Slide 21

Slide 21 text

No content

Slide 22

Slide 22 text

No content

Slide 23

Slide 23 text

framework: messenger: transports: sync: 'sync://null' async: '%env(MESSENGER_TRANSPORT_DSN)%' routing: App\Message\RegisterUserMessage: 'async'

Slide 24

Slide 24 text

framework: messenger: transports: sync: 'sync://null' async: 'amqp://root:s3cr3t@myhost/%2f/topic' routing: App\Message\RegisterUserMessage: 'async'

Slide 25

Slide 25 text

No content

Slide 26

Slide 26 text

AMQP (RabbitMQ) Doctrine Redis

Slide 27

Slide 27 text

No content

Slide 28

Slide 28 text

No content

Slide 29

Slide 29 text

No content

Slide 30

Slide 30 text

bin/console messenger:setup-transports

Slide 31

Slide 31 text

send

Slide 32

Slide 32 text

bin/console messenger:consume receive

Slide 33

Slide 33 text

Usage: messenger:consume [options] [--] [...] messenger:consume-messages Arguments: receivers Names of the receivers/transports to consume in order of priority [default: ["async"]] 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 --sleep=SLEEP Seconds to sleep before asking for new messages after no messages were found [default: 1] -b, --bus=BUS Name of the bus to which received messages should be dispatched (if not passed, bus is determine automatically.

Slide 34

Slide 34 text

send receive

Slide 35

Slide 35 text

Failing Messages

Slide 36

Slide 36 text

framework: messenger: ... # default configuration retry_strategy: max_retries: 3 delay: 1000 # delay for first retry multiplier: 2 # multiply delay with each try max_delay: 0 # service: null # id for custom RetryStrategy

Slide 37

Slide 37 text

UnrecoverableMessageHandlingException

Slide 38

Slide 38 text

framework: messenger: failure_transport: 'failed' transports: failed: 'doctrine://default?queue_name=failed' routing: ...

Slide 39

Slide 39 text

bin/console messenger:failed:show bin/console messenger:failed:retry bin/console messenger:failed:remove

Slide 40

Slide 40 text

No content

Slide 41

Slide 41 text

Middleware

Slide 42

Slide 42 text

add_bus_name_stamp_middleware dispatch_after_current_bus send_message handle_message failed_message_processing_middleware

Slide 43

Slide 43 text

add_bus_name_stamp_middleware dispatch_after_current_bus send_message handle_message failed_message_processing_middleware your middleware your middleware your middleware

Slide 44

Slide 44 text

framework: messenger: buses: event_bus: default_middleware: 'allow_no_handlers' middleware: - 'messenger.middleware.validation'

Slide 45

Slide 45 text

ReceivedStamp HandledStamp

Slide 46

Slide 46 text

No content

Slide 47

Slide 47 text

No content

Slide 48

Slide 48 text

No content

Slide 49

Slide 49 text

Messages Buses Handlers & Transports

Slide 50

Slide 50 text

Which messages are sent over which transport? config/packages/messenger.yaml framework : messenger : routing

Slide 51

Slide 51 text

How to limit a transport to a bus? config/packages/messenger.yaml framework : messenger : routing

Slide 52

Slide 52 text

Which Handler processes a message? Service Tag messenger.message_handler

Slide 53

Slide 53 text

Which Handler processes a message? name: 'messenger.message_handler', handles: '*', # which message(s) to handle bus: 'event_bus', # restrict handler to specific bus method: 'handleEvent', # method to be called on handler priority: 1, # prioritize handler over others from_transport: 'async', # handle only received messages

Slide 54

Slide 54 text

Which Handler processes a message?

Slide 55

Slide 55 text

Which bus is injected into a service? config/packages/services.yaml Argument Binding

Slide 56

Slide 56 text

Which bus is injected into a service? framework: messenger: default_bus: 'first_bus' buses: first_bus: middleware: - 'messenger.middleware.validation' second_bus: ...

Slide 57

Slide 57 text

Which bus is injected into a service? services: _defaults: bind: $firstBus: 'first_bus' $secondBus: 'second_bus'

Slide 58

Slide 58 text

Which bus is injected into a service?

Slide 59

Slide 59 text

No content

Slide 60

Slide 60 text

Usage examples https://github.com/dbrumann/invite-registration https://github.com/dbrumann/messenger-screenshot-demo https://github.com/dbrumann/dpc2019-workshop