Asynchrones TYPO3 mit Symfony Messenger für Hintergrundjobs

Seit TYPO3 12.2 können Entwickler die leistungsstarke Symfony Messenger-Komponente nutzen, die direkt in den TYPO3 Kern integriert ist. Diese bahnbrechende Funktion ermöglicht die asynchrone Verarbeitung zeitaufwändiger Aufgaben und verbessert so die Benutzerfreundlichkeit und Systemleistung.

Was ist der Symfony Messenger in TYPO3?

Die Nachrichtenbus-Lösung von TYPO3 basiert auf symfony/messenger und kann Nachrichten zur sofortigen Bearbeitung (synchron) oder über Transporte wie Warteschlangen (asynchron) zur späteren Bearbeitung senden. Aus Gründen der Abwärtskompatibilität verwendet die Standardimplementierung den synchronen Transport.

Warum sollte man Hintergrundjobs in TYPO3 verwenden?

Hintergrundjobs sind unerlässlich für:

  • E-Mail-Verarbeitung - Versenden von Newslettern ohne das Frontend zu blockieren
  • Bildoptimierung - Hochgeladene Bilder asynchron verarbeiten
  • Datenimporte - Effiziente Verarbeitung von großen CSV-Importen
  • Berichtserstellung - Erstellung komplexer Berichte ohne Timeouts
  • Cache-Erwärmung - Caches im Hintergrund neu aufbauen

Einrichten von Symfony Messenger in TYPO3

Schritt 1: Konfigurieren Sie den Nachrichtentransport

Erstellen oder ändern Sie Ihre config/system/additional.php:

<?php
return [
    'EXTENSIONS' => [
        'messenger' => [
            'transports' => [
                'async' => [
                    'dsn' => 'doctrine://default',
                    'options' => [
                        'table_name' => 'messenger_messages',
                        'queue_name' => 'async'
                    ]
                ]
            ]
        ]
    ]
];

Schritt 2: Erstellen einer Nachrichtenklasse

Erstellen Sie eine einfache Nachrichtenklasse in Ihrer Erweiterung:

<?php
declare(strict_types=1);

namespace MyVendor\MyExtension\Message;

final class ProcessImageMessage
{
    public function __construct(
        private readonly int $fileId,
        private readonly string $processingType = 'thumbnail'
    ) {}

    public function getFileId(): int
    {
        return $this->fileId;
    }

    public function getProcessingType(): string
    {
        return $this->processingType;
    }
}

Schritt 3: Erstellen eines Message Handlers

<?php
declare(strict_types=1);

namespace MyVendor\MyExtension\MessageHandler;

use MyVendor\MyExtension\Message\ProcessImageMessage;
use TYPO3\CMS\Core\Messaging\AbstractMessage;

final class ProcessImageMessageHandler
{
    public function __invoke(ProcessImageMessage $message): void
    {
        // Your background processing logic here
        $fileId = $message->getFileId();
        $processingType = $message->getProcessingType();
        
        // Process the image
        $this->processImage($fileId, $processingType);
    }

    private function processImage(int $fileId, string $type): void
    {
        // Image processing implementation
        // This runs in the background!
    }
}

Schritt 4: Registrieren Sie den Handler

Fügen Sie zu Ihrer Configuration/Services.yaml:

services:
  MyVendor\MyExtension\MessageHandler\ProcessImageMessageHandler:
    tags:
      - name: messenger.message_handler
        handles: MyVendor\MyExtension\Message\ProcessImageMessage

Schritt 5: Routing konfigurieren

Fügen Sie die Routing-Konfiguration hinzu, um Nachrichten an den asynchronen Transport zu senden:

framework:
  messenger:
    routing:
      'MyVendor\MyExtension\Message\ProcessImageMessage': async

Versenden von Nachrichten

Versenden Sie in Ihrem Controller oder Dienst Nachrichten an die Warteschlange:

<?php
use TYPO3\CMS\Core\Messaging\MessageBus;
use MyVendor\MyExtension\Message\ProcessImageMessage;

class ImageController 
{
    public function __construct(
        private readonly MessageBus $messageBus
    ) {}

    public function uploadAction(): void
    {
        // Handle file upload
        $fileId = 123;
        
        // Dispatch to background queue
        $this->messageBus->dispatch(
            new ProcessImageMessage($fileId, 'thumbnail')
        );
        
        // User sees immediate response
        // Processing happens in background
    }
}

Verarbeitung der Warteschlange

Das Warteschlangensystem enthält einen asynchronen Modus, um zeitaufwändige Aufgaben effizienter zu bearbeiten. Führen Sie den Worker aus, um Nachrichten in der Warteschlange zu verarbeiten:

# Process messages from the async transport
php bin/console messenger:consume async

# Process with limits
php bin/console messenger:consume async --limit=10 --time-limit=3600

Best Practices für TYPO3-Hintergrundaufträge

1.Fehlerbehandlung Implementieren Sie in Ihren Nachrichten-Handlern immer eine ordnungsgemäße Fehlerbehandlung, um endlose Wiederholungsschleifen zu vermeiden.
2.Ressourcenverwaltung Überwachen Sie die Speichernutzung und die Verarbeitungszeit, um eine Überlastung Ihres Servers zu vermeiden.
3. Überwachung Verwenden Sie den Befehl messenger:stats, um den Zustand der Warteschlange und die Anzahl der Nachrichten zu überwachen.
4. Skalierung Führen Sie für Anwendungen mit hohem Datenaufkommen mehrere Worker aus oder verwenden Sie externe Warteschlangensysteme wie Redis oder RabbitMQ.

Fazit

Mit TYPO3 12 wurde die leistungsstarke Komponente symfony/messenger in den TYPO3 Kern integriert, wodurch Entwickler reaktionsschnellere Anwendungen erstellen können. Durch die Implementierung von Hintergrundaufgaben für zeitaufwändige Vorgänge können Sie die Benutzererfahrung erheblich verbessern und gleichzeitig die Systemleistung aufrechterhalten.

Beginnen Sie mit einfachen Aufgaben wie der E-Mail Verarbeitung und verlagern Sie dann nach und nach komplexe Vorgänge in Hintergrundwarteschlangen. Ihre Benutzer werden die schnelleren Antwortzeiten zu schätzen wissen, und Ihr Server wird Ihnen für die geringere Auslastung dankbar sein.

Die asynchrone Zukunft der TYPO3 Entwicklung ist da   nutzen Sie sie, um bessere, skalierbarere Anwendungen zu entwickeln!

Post a Comment

×

    Got answer to the question you were looking for?