RabbitMQ zur verteilten Bearbeitung von Aufgaben und Entkopplung von Applikationsteilen
Kommentare

Für Symfony2 gibt es ein IcansLoggingBundle [15], das eine PHP-Bibilothek (IcansLoggingComponent [16]) nutzt, die auf Monolog aufsetzt und eine einfache Möglichkeit bietet, aus einer PHP und/oder Symfony2-Applikation

Für Symfony2 gibt es ein IcansLoggingBundle [15], das eine PHP-Bibilothek (IcansLoggingComponent [16]) nutzt, die auf Monolog aufsetzt und eine einfache Möglichkeit bietet, aus einer PHP und/oder Symfony2-Applikation für das Logging auf RabbitMQ zuzugreifen.

Symfony2 und RabbitMQ

Mit Symfony2 ist ein PHP-Framework erschienen, das sehr modular designt ist. Es gibt viele Schnittstellen, um in einen Request-Ablauf einzugreifen und Veränderungen an Objekten ohne harte Abhängigkeiten zum Framework durchzuführen. Zudem bietet Symfony2 einfache Möglichkeiten, neue Funktionalitäten zu einem Projekt hinzuzufügen. Dabei sind diese Funktionalitäten in eigenen Modulen den sog. Bundles untergebracht. Verschiedene Ebenen des Frameworks können in einem Bundle genutzt werden, um das Bundle zu konfigurieren oder auf bestimmte Laufzeitevents zu reagieren. Die Liste der verfügbaren Bundles ist sehr lang. Die Entscheidung zur Nutzung von Drittanbieter-Bundles birgt viele Chancen:

  • Schnelles Hinzufügen von neuer Funktionalität zum Projekt
  • Größere Nutzer- und Entwicklerbasis zur Weiterentwicklung des Bundles
  • Erweiterbarkeit, da (meist) Open Source
  • Securityupdates (bei gepflegten Sourcen)

und einige Risiken:

  • Bundle wird vom Hauptentwickler nicht mehr weiterentwickelt
  • Bundle wird nicht mehr in der neuen Frameworkversion weiterentwickelt
  • Securityupdates

Im Folgenden wird zunächst das OldSound/RabbitMqBundle vorgestellt, das eine Schnittstelle zwischen Symfony2 und RabbitMQ bereitstellt. Anschließend werden einige Probleme und Lösungen bei der Verwendung von RabbitMQ und PHP beschrieben.

Ein Bundle vorgestellt – OldSound/RabbitMqBundle

Das OldSound/RabbitMqBundle [17] bietet eine einfache Einbindung von RabbitMQ in eine Symfony2-Anwendung. Für die Kommunikation wird hierbei die php-amqplib-Bibliothek [18] verwendet. Nach der Installation lassen sich Connections, Producer und Consumer in der Konfigurationsdatei unter dem Punkt old_sound_rabbit_mq der jeweiligen Anwendung definieren. Die Konfiguration in Listing 1 definiert jeweils eine solche Instanz.

Listing 1
old_sound_rabbit_mq:
    connections:
        default:
            host:      'localhost'
            port:      5672
            user:      'guest'
            password:  'guest'
            vhost:     '/'
    producers:
        upload_video:
            connection: default
            exchange_options: {name: 'upload-video', type: direct}
    consumers:
        upload_video:
            connection: default
            exchange_options:   {name: 'upload-video', type: direct}
            queue_options:      {name: 'upload-video'}
            callback:                upload_video_service

Das Bundle verwendet die Symfony2-Dependency-Injection-Implementierung zur Verwaltung der jeweiligen Instanzen. Alle definierten Producer bzw. Consumer können mittels des Serviceschlüssels old_sound_rabbit_mq.upload_video_producer bzw. old_sound_rabbit_mq.upload_picture_consumer verwendet werden. Der bei Consumern definierte callback stellt wiederum einen Service dar, der aufgerufen wird, sobald der Consumer eine Nachricht abarbeitet. Dieser Service muss das Consumer-Interface implementieren und enthält die jeweilige Businesslogik, die bei einer aufkommenden Nachricht ausgeführt werden soll. Solche Consumer können mittels ./app/console rabbitmq:consumer gestartet werden. Dies kann manuell aber auch als regelmäßiger Task ausgeführt werden.


Themen der folgenden Seiten:

  • Probleme und Lösungen mit PHP-Consumern
  • Generelle Probleme
  • Spezifische Probleme mit RabbitMqBundle
Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -