Adobe Commerce & Message Queue Lösungen – integration review


Author Photo
Alex Lyzun
Lead Developer Adobe Commerce

Adobe Commerce Queuing Systems Integration Review

Adobe Commerce (Magento) verfügt über ein großartiges Framework, das seit Version 2.1.0 verfügbar ist und "Magento Message Queue Framework (MMQF)" heißt. Seit dem ersten Release hat es sich drastisch verbessert mit dem Ergebnis, dass viele Module und Integrationen heute auf die Verwendung von MMQF als Teil ihrer Funktionalität angewiesen sind.

Heute unterstützt Magento 2 verschiedene Warteschlangensysteme:

  • Magento's Datenbank-Queue-Implementierung
  • RabbitMQ 

Die wichtigste Frage, die uns immer wieder gestellt wird, ist: "Welche anderen Warteschlangensysteme werden von Magento unterstützt?"

Das Ziel dieses Artikels ist es, einen genaueren Blick auf andere existierende Queuing-Lösungen zu werfen und eine fundierte Einschätzung der Kandidaten vorzunehmen, die sich leicht in Magento integrieren lassen und daher möglicherweise in naher Zukunft als Teil einer Magento-Kernimplementierung verwendet werden können.


Verarbeitung von Nachrichtenwarteschlangen in Adobe Commerce

Eine einfache Erklärung, wie die Nachrichtenverarbeitung (basierend auf RabbitMQ) in Magento funktioniert, ist in diesem Diagramm dargestellt.

Source: Adobe Commerce Developer Guides

Grundlage für Warteschlangenimplementierungen auf MMQF ist  

\Magento\Framework\MessageQueue\QueueInterface

Beide Standardimplementierungen von Magento (DB und RabbitMQ) implementieren diese Schnittstelle.

Schauen wir uns die Schnittstelle anhand eines Flusses genauer an.

Dieser Fluss stellt die aktuelle Queue-Implementierung dar, und wie wir sehen, nutzt jeder Dienst seine eigene Funktionalität, aber beide verwenden die Queue-Schnittstelle:

Magento Queue Interface

  

Queue Interface

In der nachstehenden Tabelle werden alle Methoden beschrieben, die von dem jeweiligen Warteschlangenanbieter implementiert werden sollen, und es wird erläutert, welche Funktionalität von diesen Methoden erwartet wird.

MethodPurpose / Description
dequeue()Get a single message from the queue
acknowledge()Acknowledge message delivery
subscribe()

Wait for messages and dispatch them, this is based on pub/sub mechanism, consumes the messages through callbacks, until connection is closed

reject()Reject message, messages gets returned to the queue
push()

Push message to queue directly without using exchange; it uses publish behind the scenes

Es fällt auf, dass jede Implementierung ihre eigene Logik verwirklicht, die vom verwendeten Warteschlangensystem abhängt:

  • DB nutzt die Verwendung eigener Tabellen in der Datenbank
  • RabbitMQ implementiert die Verbindung zum Dienst und führt die erforderlichen Aktionen aus

Auf der anderen Seite haben wir Konsumenten, die die Nachricht aus der Warteschlange abholen und sie entsprechend der Konfiguration verarbeiten.


Überblick der verfügbaren Message Queue Lösungen

Werfen wir einen Blick darauf, welche anderen Warteschlangentechnologien es gibt und ob wir sie in naher Zukunft in Magento verwenden können. Innerhalb der Messaging-Technologien können wir sie auch in die folgenden Kategorien einteilen, die auf verschiedenen Anwendungsfällen basieren.

Use Case TypeObjectives
Portable systems or Standard based protocolsEither these systems follow industry standard protocols, or the projects are portable like Kafka
High throughput & data streamingStreaming for near real-time use cases is the key here, or very high throughput
Serverless & rule-based event streaming / routingThese are modern systems built with intelligent routing in mind, they also support serverless functions in their ecosystem like Adobe I/O Runtime and Adobe I/O Events
Interservice communication or MicroservicesThird party connectivity, extensibility and message delivery
Third party connectivity, extensibility and message deliverySuitable for large organizations, usually developed internally for wide scale use cases; they encapsulate modern extensibility requirements like out of process extension functions or in-process extensibility. They may also include message delivery via web-hooks.
Source: Github User Content

  

Message Queue Technologien – Überblick

PlatformPub/Sub MechanismConnectivityMessge Ordering / FIFOHigh Throughput Data StreamingRule Based Filter / Routing
AWS EventBridge*Available
(limited to AWS Targets)
*HTTPS (for publishers only)  Available
AWS MQAvailableJMS, NMS, AMQP 1.0, STOMP, MQTT, WebSocket*Available  
AWS SQS HTTPS*Available  
AWS KinesisAvailableHTTP/2 Persistent and HTTP REST*AvailableAvailable 
Apache KafkaAvailableTCP Socket, Kafka Connect, Kafka Streams Apps*AvailableAvailable 
Azure Service BusAvailableAMQP 1.0 and REST*Available  
Adobe I/O*Available
(limited to Adobe Event Providers)
*HTTP Webhooks (for subscribers only, designed for integration with Adobe SaaS solutions)  Available

*Available with some limitations
**Other Aspects to consider (consumer groups, batching, multi-tenant seggregation, message encryption/security, aggregation, counting, scheduling, dead-letter queue)

  

Integrationsmöglichkeiten mit MMQF

Da die Basis für alle Queueing-Implementierungen in Magento das MMQF und das QueueInterface ist, werden wir prüfen, welche Lösungen das bestehende Interface implementieren und einfach in die bestehende Magento-Architektur integriert werden können.


AWS EventBridge

AWS EventBridge ist ein serverless Event-Bus, der den Empfang von Daten von Ihrer Anwendung und von Drittanbietern an AWS Services erleichtert. Derzeit scheint es, dass die Ziele speziell AWS Services sind. Diese Ziele werden über spezifische Regeln definiert. 

Weitere Informationen finden Sie hier: https://docs.aws.amazon.com/eventbridge/index.html  

Und mehr über verfügbare Ziele finden Sie hier: https://docs.aws.amazon.com/eventbridge/latest/APIReference/API_PutTargets.html  

Aber sehen wir uns an, ob wir die AWS-Integration mit dem MMQF-Framework nutzen können:

MethodEvaluationImplementation Readiness
dequeue()Not Possible or N/AMultiple Targets can be set, to receive the messages when they are available asynchronously. There is no concept of fetching the message from the Event Bus on-demand, its more of a serverless architecture.
acknowledge()Not Possible or N/AThere is no need to acknowledge the message, AWS internally makesure that the Target receives the message.
subscribe()Not Possible or N/AAWS related Targets can be set or subscribed for the EventBus based on the Rules; but we cannot set PHP Callback as Functions.
reject()Not Possible or N/AThe concept is not available or used.
push()AvailablePutEvents or PutPartnerEvents functions can be used for this purpose.

  


AWS MQ

AWS MQ ist ein Message Broker, der auf dem beliebten Apache ActiveMQ basiert. Er unterstützt mehrere Protokolle für die Konnektivität, zum Beispiel AMQP, JMS, STOMP, NMS, MQTT und WebSocket.

Die meisten Funktionen sind verfügbar, da Magento mit RabbitMQ ebenfalls das AMQP-Protokoll verwendet, aber die Protokollversion ist unterschiedlich: RabbitMQ verwendet 0.9 und Amazon MQ verwendet AMQP 1.0; daher würde jede Migration eine Portierung der Warteschlangen von RabbitMQ auf AWS MQ erfordern.

Sie können hier mehr darüber lesen: https://aws.amazon.com/amazon-mq/

In diesem Fall sieht alles viel besser aus. Der Grund ist wiederum, dass MMQF bereits AMQP verwendet

MethodEvaluationImplementation Readiness
dequeue()Availablereceive()
acknowledge()Availableaccept() / release()
subscribe()*WorkaroundLong Polling might need to be implemented, unless we find a good library that supports AMQP 1.0 in PHP; Java has full support though.
reject()Availablereject()
push()AvailablesendMessage(Message, Destination)

  


AWS SQS

AWS SQS ist eine verteilte und fehlertolerante Warteschlangentechnologie, die Punkt-zu-Punkt-Konnektivität bietet. Sie kann mit SNS verwendet werden, um einen Veröffentlichungs- und Abonnementmechanismus hinzuzufügen. Eine einzelne Nachricht wird auf mehreren SQS-Servern repliziert.

Weitere Informationen: https://aws.amazon.com/sqs/

SQS kann, wie wir sehen, auch das nächste Warteschlangensystem in Magento sein, obwohl es einige Anstrengungen erfordert, um in MMQF implementiert zu werden.

MethodEvaluationImplementation Readiness
dequeue()AvailableReceiveMessage() - possibility with many available options for instance long & short polling.
acknowledge()PossibilityDeleteMessage() for positive acknowledge, by default message locked for Visibility Timeout period for other consumers.
subscribe()WorkaroundReceiveMessage() - Using polling based mechanism, it can be implemented; but not exactly as true callback mechanism.
reject()PossibilityThe messages are auto visible again for consumption, if explicit DeleteMessage() is not called before timeout, as explained above.
push()AvailableSendMessage()

  


AWS Kinesis

AWS Kinesis ist eine auf Streaming basierende distributierte Messaging-Technologie. Sie verwendet den Publish/Subscribe-Mechanismus für eine lose Kopplung zwischen Sendern und Empfängern. Sie ist für einen extrem hohen Durchsatz bei Echtzeitanwendungen ausgelegt.

Streaming und das Konzept des Streams selbst sind die zentrale Idee hinter Kinesis. Es ist dem Apache Kafka sehr ähnlich, mit einigen Unterschieden. Kinesis eignet sich auch für die Implementierung von Event Sourcing und CQRS-Mustern, die häufig in Microservices-Architekturen verwendet werden, da es sofortige Unterstützung für Messaging- und Publish/Subscribe-Mechanismen mit hohem Durchsatz bietet.

Lesen Sie mehr: https://aws.amazon.com/kinesis/

Auch Kinesis sieht wie ein guter Kandidat aus:

MethodEvaluationImplementation Readiness
dequeue()PossibilitygetRecords() - ShardIterator needs to be managed behind the scenes. Stream can be Queue name. It can use getShardIterator(), before the call.
acknowledge()PossibilityNeed to maintain the ShardIterator & SequenceNumber associated with it, using getShardIterator(). We can save NextShardIterator from getRecords() to acknowledge the message.
subscribe()WorkaroundWorkaround - batch reads with long polling can be implemented, example Long Polling Subscribe Mechanism in AWS Kinesis
reject()PossibilityIf we don't move the ShardIterator to NextShardIterator, we are pretty much staying on the same message.
push()PossibilitySince you will have to provide stream, data & partition; we need to have some strategy to for partition selection; and need to maintain these values for Consumers.

  


Apache Kafka

Apache Kafka ist eine weit verbreitete Open-Source-Plattform für Stream-Verarbeitung und Nachrichtenübermittlung. Sie ist dezentralisiert, repliziert und widerstandsfähig (oder fehlertolerant) und kann einen sehr hohen Durchsatz erreichen.

Der Topic- und Publish/Subscribe-Mechanismus ist der Kern von Kafka. Es eignet sich gut für die Implementierung von Event Sourcing und CQRS-Mustern, die häufig in Microservices-Architekturen verwendet werden. Kafka wird auch für eine Vielzahl von Streaming-Anwendungsfällen verwendet, die eine nahezu Echtzeitverarbeitung von Datensätzen erfordern.

Weitere Informationen:  https://kafka.apache.org/

Kafka scheint im Moment die vielversprechendste Lösung zu sein:

MethodEvaluationImplementation Readiness
dequeue()PossibilityInitiate poll () or consume(). If there are records available, the call will immediately returns, otherwise it will wait for specified timeout which can be passed as parameter.
acknowledge()PossibilityThere are several ways to commit the offset, which indicates that a particular consumer has consumed those messages. The way you call commit API controls the delivery semantics.
subscribe()PossibilityThere are multiple ways in which the subscribtion mechanism can be implemented, the default Kafka subscribtion is telling Kafka which topics a consumer is interested in. But we can also subscribe a callback function; and we can use Kafka Stream API to receive messages in near realtime.
reject()PossibilityIf we don't auto-commit or manually commit the offset, then we are not moving the needle.
push()PossibilitySince you will have to provide topic, data & partition; we need to have some strategy to for partition selection; and need to maintain these values for Consumers.

  


Azure Service Bus

Microsoft Azure Service Bus ist ein Managed Service Message Broker für  Enterprise Integrationen. Er unterstützt bekannte Konzepte wie Warteschlangen, Themen, Regeln/Filter und mehr.

Source: Github User Content

Azure Service Bus unterstützt AMQP 1.0 und einige Sprachen, die PHP-Unterstützung ist für das Protokoll wiederum eingeschränkt.

Hauptseite: https://azure.microsoft.com/en-us/services/service-bus/#overview

Da Azure auch das AMQP-Protokoll verwendet, sieht es auch recht optimistisch aus. Und die Tatsache, dass Magento Cloud ebenfalls Microsoft Azure nutzen wird, macht den Einsatz von ASB noch wahrscheinlicher.

MethodEvaluationImplementation Readiness
dequeue()Availablereceive()
acknowledge()Availableaccept() / release()
subscribe()*WorkaroundLong Polling might need to be implemented, unless we find a good library that supports AMQP 1.0 for PHP; Java has full support for required features.
reject()Availablereject(errorCondition, errorDescription)
push()AvailablesendMessage(message, destination)

  


Adobe I/O

Adobe I/O ist eine serverlose, ereignisgesteuerte Plattform, mit der Sie benutzerdefinierte Funktionen/Code schnell und ohne Servereinrichtung in der Cloud bereitstellen können. Diese Funktionen werden über HTTP-Anforderungen oder Adobe I/O-Ereignisse ausgeführt. Diese Ereignisse können mit Sequenzen und Kompositionen orchestriert werden. Die Lösung basiert auf dem Apache OpenWhisk-Framework.

Ereignisse werden von Ereignisanbietern innerhalb der Adobe Services ausgelöst, z. B. Creative Cloud Assets, Adobe Experience Manager und Adobe Analytics. Um Ereignisse für Ihre Anwendung zu empfangen, müssen Sie einen Webhook (URL-Endpunkt) registrieren, der angibt, welche Ereignistypen er von welchen Ereignisanbietern empfangen möchte; Adobe sendet Ereignisse über HTTP-POST-Nachrichten an Ihren Webhook.

Homepage: https://www.adobe.io/

In der aktuellen Magento-Implementierung ist es nicht möglich, Adobe I/O zu verwenden. Daher muss ein völlig neuer Dienst entwickelt werden, um diesen zu unterstützen.

MethodEvaluationImplementation Readiness
dequeue()Not Possible or N/AThere is not a concept of explicit fetching of event, rather you define a trigger/event and the actions associated with it.
acknowledge()Not Possible or N/AThis concept is not used, the architecture is funadementally different
subscribe()Not Possible or N/AA PHP callback function is not possible, although a custom webhook (http endpoint) can be configured to be triggered for a particular Event.
reject()Not Possible or N/AThis concept is not used, the architecture is funadementally different
push()Not Possible or N/AEvents are triggered by Adobe SaaS Services in the Adobe Cloud as discussed above.

  


Bewertung und Schlussfolgerung

Vergleicht man alle möglichen Lösungen, so ergibt sich folgendes Bild:

Method(1) AWS EventBridge(2) AWS MQ(3) AWS SQS(4) AWS Kinesis(5) Apache Kafka(6) Azure Service Bus(8) Adobe I/O
dequeue()Not Possible or N/AAvailableAvailablePossibilityPossibilityAvailableNot Possible or N/A
acknowledge()Not Possible or N/AAvailablePossibilityPossibilityPossibilityAvailableNot Possible or N/A
subscribe()Not Possible or N/A*Workaround*Workaround*WorkaroundPossibility*WorkaroundNot Possible or N/A
reject()Not Possible or N/AAvailablePossibilityPossibilityPossibilityAvailableNot Possible or N/A
push()AvailableAvailableAvailablePossibilityPossibilityAvailableNot Possible or N/A

 *Workaround - The function may be available, but full support for PHP (library) is not available.

  

Wie wir sehen können, ist Apache Kafka derzeit der Gewinner dieser Untersuchung. Kafka ist ein sehr beliebtes System, das performant ist und alle Anforderungen abdeckt, die wir mit der wachsenden Komplexität von Magento haben. Auch in den letzten Monaten ist Kafka eine der meistdiskutierten Technologien als nächster Dienst, den Magento für die asynchrone Kommunikation nutzen könnte.

Integratoren und Entwickler können sich jedoch durchaus an AWS MQ, AWS SQS, AWS Kinesis und Azure Service Bus orientieren, da die Integration dieser Dienste nicht allzu viel Aufwand erfordert.

Bei diesen Systemen besteht eines der Hauptprobleme darin, dass AMQP 1.0 nicht vollständig von PHP unterstützt wird, aber es gibt PHP Enqueue- und Symfony-Bibliotheken, die eine Abstraktionsschicht für mehrere Broker bieten.

 Supported Brokers / ProtocolsNotes
EnqueueApache Kafka, AWS SQS/SNS, AMQP 0.9, Database, MongoDB, Redis etc.Enqueue tries to follow JMS specification as close as possible; although this library does not have very good documentation. Theoretically this library can enable multiple brokers for Magento; with only few deviations in terms of configurations.
SymfonyAMQP 0.9, Doctorine, Redis, In Memory, Serializing MessagesThis is more mature framework with active community, also has better documentation
Symfony via Enqueue TransportAdd support for Enqueue Brokers with SymfonyGitHub - sroze/messenger-enqueue-transport: Uses Enqueue with Symfony's Messenger component.

  


CO-AUTOR:

Author Photo
Tariq Jawed
System Designer, Architect and Product Strategist at Adobe Inc.

Related Articles

  • 2023-03-27
    Comwrap Reply ist Adobe 2023 Digital Experience Emerging Partner of the Year
    Author Photo
    Martin Altmann
    Adobe Practise Lead
    Comwrap Reply wurde mit dem prestigeträchtigen Adobe 2023 Digital Experience Emerging Partner of the Year - Central Europe ausgezeichnet. Mit dieser Auszeichnung werden Unternehmen geehrt, die führende Beiträge zum Geschäft von Adobe geleistet und den Kundenerfolg maßgeblich beeinflusst haben.
  • 2022-05-31
    Reply ist Adobe Solution Partner PLATINUM
    Author Photo
    Martin Altmann
    Adobe Practise Lead
    Adobe zeichnet Reply als Adobe Solution Partner Platinum aus
  • 2022-05-10
    Advanced Routing mit Fastly CDN
    Author Photo
    Alexandr Tihanov
    Senior Developer at comwrap
    Fastly ist ein auf Varnish basierender Dienst, der in Adobe Commerce Cloud (Magento) für die Bereitstellung von Inhalten, Sicherheit und Bildoptimierung verwendet wird. In diesem Artikel beschreibe ich einige der erweiterten Routing-Funktionen für Entwickler.
  • 2022-04-23
    Disaster Recovery in Adobe Commerce Cloud
    Author Photo
    Alex Lyzun
    Lead Developer Adobe Commerce
    Adobe Commerce Cloud verfügt von Haus aus über einen automatischen Sicherungsprozess. Wenn Sie also nach einer Meldung schnell handeln, haben Sie eine gute Chance, Ihr System fast vollständig wiederherzustellen.
  • 2021-12-30
    Wiederkehrende Zahlungen und Kreditkartenverwaltung in Adobe Commerce
    Author Photo
    Sunjay Patel
    Senior Developer at comwrap
    Schritt-für-Schritt-Anleitung zur Umsetzung wiederkehrender Zahlungen für Abonnementgeschäfte in Adobe Commerce mit Payone als PSP
  • 2021-12-15
    VAT Management in Adobe Commerce
    Author Photo
    Oleg Blinnikov
    Senior Developer at comwrap
    Best Practise zum MwSt Handling und zur Validierung der VAT-IDs in B2B Projekten mit Adobe Commerce (Magento)
  • 2021-11-01
    Integration von Adobe Commerce MSI mit externen ERP-Systemen
    Author Photo
    Oleg Blinnikov
    Senior Developer at comwrap
    Eine Erfolgsgeschichte über eine komplexe Integration von Magento MSI mit einem externen ERP-System.
  • 2021-10-15
    Hands-on Adobe Firefly
    Author Photo
    Alex Lyzun
    Lead Developer Adobe Commerce
    Das Projekt Firefly wurde von Adobe Mitte 2020 vorgestellt. Nachdem ich einige Tage mit Firefly experimentiert habe, wurde mir klar, dass es wirklich einen eigenen Artikel verdient hat, und so sind wir hier.
  • 2021-10-15
    Design better B2B digital experiences
    Author Photo
    Alexander Beutel
    Adobe Commerce Practise Lead
    How manufacturers are designing digital experiences for business customers in ways that improve agility and accelerate growth.
  • 2021-10-15
    Design a Digital Experience for B2X
    Author Photo
    Alexander Beutel
    Adobe Commerce Practise Lead
    How manufacturers can create a seamless digital experience—for business buyers, distributors, and maybe even consumers—that accelerates growth.
  • 2021-10-15
    The E-Commerce Experience Wish List
    Author Photo
    Alexander Beutel
    Adobe Commerce Practise Lead
    Learn what consumers want most in a digital customer experience—and how you can deliver it to them.
  • 2021-10-15
    Integrate 3rd party CMS with Adobe Commerce Cloud
    Author Photo
    Alex Lyzun
    Lead Developer Adobe Commerce
    The requirements of any e-commerce system integration are always unique and sometimes even quite exotic. In this Article, I will share our experience and show how you can integrate any CMS (e.g. Wordpress) with Adobe Commerce under a single domain name.