Entwickler, der außergewöhnliche CRM- und Laravel-Lösungen liefert

Als erfahrener Entwickler spezialisiere ich mich auf Laravel- und Vue.js-Entwicklung, die Implementierung von Vtiger CRM sowie auf vielfältige WordPress-Projekte. Meine Arbeit zeichnet sich durch kreative, dynamische und benutzerzentrierte Weblösungen aus, die individuell an die Bedürfnisse meiner Kunden angepasst werden.

Willkommen zum nächsten Teil unseres Kurses „Asynchrones Vtiger mit RabbitMQ“. Bisher haben wir Daten von Vtiger an externe Dienste gesendet. Jetzt kehren wir die Richtung um: Wir bringen Vtiger bei, Nachrichten aus RabbitMQ-Queues zu lesen und auf Events von externen Apps zu reagieren – etwa um Kontakte zu erstellen oder zu aktualisieren.

Vtiger und RabbitMQ: Daten aus externen Anwendungen empfangen

Willkommen zum nächsten Teil unseres Kurses „Asynchrones Vtiger mit RabbitMQ“. Bisher haben wir Daten von Vtiger an externe Dienste gesendet. Jetzt kehren wir die Richtung um: Wir bringen Vtiger bei, Nachrichten aus RabbitMQ-Queues zu lesen und auf Events von externen Apps zu reagieren – etwa um Kontakte zu erstellen oder zu aktualisieren.

Die Herausforderung: Echtzeit-Kommunikation

Das passive Abfragen von Queues (z. B. via Cron-Jobs) ist ineffizient. Stattdessen brauchen wir einen kontinuierlichen Listener, der sofort reagiert, sobald eine Nachricht eintrifft. Hier kommt RabbitMQs basic.consume ins Spiel.


Lösung: basic.consume + Supervisor

1. Warum basic.consume statt basic.get?

  • basic.get: Polling-Methode – fragt regelmäßig bei RabbitMQ nach neuen Nachrichten (ressourcenintensiv).
  • basic.consume: Push-Methode – RabbitMQ sendet Nachrichten automatisch, sobald der Consumer verfügbar ist (effizienter).

2. Architektur

  • Vtiger als Consumer: Läuft als Dauerdienst, überwacht eine Queue.
  • Supervisor: Überwacht den Consumer-Prozess und startet ihn bei Abstürzen neu.

Implementierungsschritte

1. Consumer-Skript in Vtiger erstellen

// vtiger/modules/Contacts/RabbitMQConsumer.php  
require_once __DIR__ . '/../../vendor/autoload.php';  
use PhpAmqpLib\Connection\AMQPStreamConnection;  

$connection = new AMQPStreamConnection('localhost', 5672, 'user', 'pass');  
$channel = $connection->channel();  

// Queue deklarieren (dauerhaft)  
$channel->queue_declare('external_contacts', false, true, false, false);  

$callback = function ($msg) {  
    try {  
        $data = json_decode($msg->body, true);  

        // Kontakt erstellen/aktualisieren  
        $contact = Vtiger_Record_Model::getCleanInstance('Contacts');  
        $contact->set('firstname', $data['vorname']);  
        $contact->set('lastname', $data['nachname']);  
        $contact->set('phone', $data['telefon']);  
        $contact->save();  

        $msg->ack(); // Bestätigung an RabbitMQ  
    } catch (Exception $e) {  
        $msg->nack(); // Bei Fehler: Nachricht zurück in die Queue  
        error_log("Fehler: " . $e->getMessage());  
    }  
};  

$channel->basic_consume('external_contacts', '', false, false, false, false, $callback);  

while ($channel->is_consuming()) {  
    $channel->wait();  
}  

$channel->close();  
$connection->close();  

2. Supervisor konfigurieren

Erstellen Sie eine Supervisor-Konfigurationsdatei (/etc/supervisor/conf.d/vtiger_consumer.conf):

[program:vtiger_consumer]  
command=php /pfad/zur/vtiger/modules/Contacts/RabbitMQConsumer.php  
autostart=true  
autorestart=true  
stderr_logfile=/var/log/vtiger_consumer.err.log  
stdout_logfile=/var/log/vtiger_consumer.out.log  


Starten Sie den Dienst:

sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start vtiger_consumer

---

Best Practices
1. Idempotenz: Stellen Sie sicher, dass wiederholte Nachrichten keine Duplikate erzeugen (z. B. über `message_id`-Prüfung).
2. Fehlerbehandlung:
- Nach 3 Fehlversuchen → Nachricht in Dead-Letter-Queue verschieben.
- Loggen Sie Fehler mit Kontext (z. B. `$data`).
3. Sicherheit:
- Nutzen Sie SSL/TLS für die RabbitMQ-Verbindung.
- Validieren Sie Eingabedaten (z. B. Telefonnummernformat).

---

Praxisbeispiel: Kontakt-Synchronisation
Szenario: Eine externe App erstellt einen Kontakt → sendet Nachricht an RabbitMQ → Vtiger verarbeitet sie sofort.

Nachrichtenformat:
{
"message_id": "a1b2c3",
"event_type": "contact_created",
"data": {
"vorname": "Anna",
"nachname": "Müller",
"telefon": "+49123456789"
}
}


Wichtige Hinweise

  • Dauerhafte Queues: Deklarieren Sie Queues mit durable=true, um Nachrichten bei Neustarts zu erhalten.
  • Acknowledgment: Bestätigen Sie Nachrichten erst nach erfolgreicher Verarbeitung ($msg->ack()).
  • Skalierung: Starten Sie mehrere Consumer bei hohem Aufkommen.

Im Video zeige ich:

  • Wie Sie den Consumer in Vtiger debuggen.
  • Konfiguration von Dead-Letter-Queues.
  • Leistungstests unter Last.

Nächste Schritte

  • Teil 5: Automatische Retry-Logik mit Exponential Backoff.
  • Teil 6: Monitoring mit Grafana + Prometheus.

Fragen? Stellen Sie sie in den Kommentaren – ich unterstütze Sie gern! 🚀


„Mit RabbitMQ wird Vtiger zum aufmerksamen Zuhörer – immer bereit, Nachrichten aus der Außenwelt zu empfangen und blitzschnell zu reagieren.“