In Symfony applicaties lijkt dit heel erg op een event-based systeem - maar dan over verschillende threads en niet op de standaard PHP single-threaded manier van werken. PHP kan natuurlijk altijd maar over 1 thread werken, daarom wordt dit effectief door een ander proces opgevangen. Het originele proces stopt bij afleveren van het bericht op de bus.
Een van de grote voordelen van een message is dat het asynchroon is, de sender wacht niet op antwoord van de receiver. Een ander voordeel is dat ze betrouwbaar zijn, als de verwerker stopt met antwoorden dan wacht de message in de bus tot die wel opgepikt kan worden.
Dit zijn de grote veranderingen tegenover het Event systeem.
Voordelen:
- Betere applicatie structuur want niet alles moet op dezelfde plek, dit is deels ook een voordeel van het event systeem. Maar daar moet alles nog steeds in dezelfde applicatie leven. Een message die via een bus komt moet niet in dezelfde applicatie en zelfs niet in dezelfde taal afgehandeld worden.
- Asynchroon verwerken van data.
- Het is een eenvoudige manier om aan schaal vergroting te doen. Meerdere workers kunnen toegevoegd worden om zware events te verwerken. Op deze manier is het eenvoudig om op te schalen waar mogelijk.
Verder gaat David erg diep in op hoe de Symfony Messenger werkt. Maar er zijn ook een aantal framework-agnostic tips, waaronder deze:
Je message is best klein en bevat alleen de id van het object waar het over gaat. De subscriber gaat dan in de databank dezelfde data terug ophalen. Dit zorgt ervoor dat de receiver altijd de meest recente data heeft. Deze tip werd in de volgende sessie van Samuel Roze tegengesproken, volgens hem kan het soms wel om alle data in de message te stoppen. Interessant dat er toch altijd vanuit eigen achtergrond naar gekeken wordt.
Symfony Messenger heeft daarnaast ook rejuvenation built-in. Dit wil zeggen dat een proces zelf een aantal messages kan verwerken voor het zichzelf afsluit. Dit proces kan daarna door supervisord/docker opnieuw gestart worden.
Als volgende concept ging het over transport decorators, dit is een manier om een message die uitgestuurd wordt te gaan wrappen met extra metadata voor ze effectief op de bus wordt gezet.
David gaf enkele voorbeelden, waaronder deduplicate – dit is een semaphore systeem in Redis. Dit zorgt ervoor dat een product maar 1 keer op de queue gezet kan worden tot het afgehandeld is. Op deze manier kunnen snelle updates er niet voor zorgen dat de queue overbelast geraakt.
In de chat van de talk werd er nog veel gepraat over message architecturen. Een tip was om standaard de doctrine/database transport te gebruiken, dat is makkelijk om mee te starten.
Er zijn nog andere implementaties mogelijk van zodra er opgeschaald wordt, het verhuizen van je messages naar Amazon SQS, Redis, AMQP of Apache Kafka zorgt automatisch voor minder load op je databank.