2016-07-21 8 views
2

Ich habe PHP-Anwendung, die Kafka-Nachrichten verbraucht. Das Problem ist, wie man weiß, dass es neue Nachrichten in Kafka gibt? Die erste Lösung besteht darin, einen Benutzer in PHP zu erstellen und ihn dann in einer Schleife auszuführen, um neue Nachrichten zu prüfen. So etwas wie dasKafka - wie man nach neuen Nachrichten sucht

<?php 

namespace MyAppBundle\Command; 

use MyAppBundle\EventSourcing\EventSerializer\JSONEventSerializer; 
use MyAppBundle\Service\EventProjectorService; 
use MyAppBundle\Service\KafkaService; 
use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand; 
use Symfony\Component\Console\Input\InputInterface; 
use Symfony\Component\Console\Output\OutputInterface; 
use Symfony\Component\Process\Exception\RuntimeException; 

class EventCommand extends ContainerAwareCommand 
{ 
    protected function configure() 
    { 
     $this 
      ->setName('events:fetch'); 
    } 

    protected function execute(InputInterface $input, OutputInterface $output) 
    { 
     /** @var KafkaService $kafkaService */ 
     $kafkaService = $this->getContainer()->get('store_locator.kafka_service'); 
     /** @var EventProjectorService $eventProjector */ 
     $eventProjector = $this->getContainer()->get('store_locator.event_projector'); 

     while(1){ 
      $messages = $kafkaService->fetchEvents(); 

      foreach ($messages as $message) { 
       $eventProjector->aggregate($message); 
      } 
     } 
     $output->writeln("Finish"); 
    } 
} 

Aber ich mag es nicht ... Gibt es einen anderen Weg?

Wenn es keinen besseren Weg gibt, wie man es am Laufen hält? Zum Beispiel wenn etwas fehlschlägt.

+0

Ich bin im Moment auf der Suche nach einer Symfony/Kafka-Lösung. Gibt es eine Chance, dass Sie Ihren Kafka-Service-Code teilen können? – nealio82

+0

@Nealio Ich weiß nicht, was Sie genau brauchen, aber ich benutze 'nmred/kafka-php' Paket und implementiere alles wie in der README beschrieben. – PiotrCh

Antwort

1

Soweit ich weiß gibt es keine besseren Möglichkeiten als endlos zu schleifen und ständig nach neuen Nachrichten zu suchen. Ein gängiger Ansatz besteht darin, dass sich die Aufgabe nach einer bestimmten Zeit oder nach einer bestimmten Anzahl von Iterationen selbst beendet und dann so etwas wie supervisord verwendet wird, um den Tod zu erkennen und den Verbraucher wiederzubeleben, damit er nicht alle Ressourcen verbraucht.

+0

Ich habe ähnliche Ergebnisse, daher kann ich davon ausgehen, dass dies die beste Lösung ist: 1. Verwenden Sie supervisord, um sicherzustellen, dass der Dienst läuft 2. Konfigurieren Sie ordnungsgemäß Logger (optional) 3. Töten Sie und starten Sie den Dienst von Zeit zu Zeit. – PiotrCh

Verwandte Themen