2015-04-23 8 views
5

Ich verwende derzeit den laravel-elasticsearch-Anbieter für meine ES-Abfragen. Ich benutze dies innerhalb eines Jobs, der von meiner Laravel-Queue verarbeitet wird (mit beanstalkd). Das Problem, das ich habe, ist, dass ich in lang laufenden Jobs schließlich nicht mehr in der Lage bin, Daten in elasticsearch einzufügen. Der Job hängt einfach (es werden keine Ausnahmen ausgelöst). Ich habe ihn auf den Code beschränkt, in dem ich einen ES-Aufruf tätige. Ist es möglich, dass meine Verbindung etwas alt wird und sich nicht wieder verbindet? Mein anderer Gedanke ist, dass es etwas damit zu tun hat, eine Fassade zu benutzen, und dass es ein Singleton ist.ElasticSearch-Abfrage hängt in Laravel-Auftragswarteschlange

hier ist, was ich tue, das ist nicht mein genauer Code. aber der Code funktioniert gut, wenn es nicht in einem lang laufenden Job ausgeführt wird.Ich wollte nur einige context.it fügt es gut, es gibt keine Probleme mit dem Code funktioniert, bis es nach einem langen Prozess ausgeführt wird.

UPDATE:

Ich habe das Problem bis auf die Elasticsearch-PHP-Bibliothek verengte eine Verbindung persistierenden. Ich habe meine ES hinter einem Load Balancer, der TCP-Verbindungen nach 5 min. Das Problem ist, dass es in der ES-PHP-Bibliothek keinen Halt gibt. Nach 5 Minuten ist die Verbindung geschlossen, aber sie schließt die Verbindung an meinem Ende nicht. Gibt es eine Möglichkeit, einen keep für elasticsearch-php am Leben zu erhalten? oder ein Anruf zum Zurücksetzen der Verbindung?

//run some functions.... 
$params = array(); 
$params['body'] = array('somefield' => 'some data'); 
$params['index'] = 'my_index'; 
$params['type'] = 'my_type'; 
$params['id'] = 'my_id'; 
$ret = Es::update($params);//this is working just fine 

//long running function here 
$newparams = array(); 
$newparams['body'] = array('somefield' => 'some data'); 
$newparams['index'] = 'my_index'; 
$newparams['type'] = 'my_type'; 
$newparams['id'] = 'my_id'; 
$return = Es::update($newparams);//this will just hang 
+0

sieht aus wie ein Problem mit Job scheitert, anstatt mit ES.behandeln Sie fehlerhafte Jobs? –

+0

Ich bearbeite fehlerhafte Jobs, aber der Job schlägt nicht fehl, er hängt einfach so, als würde er versuchen, ohne Timeout eine Verbindung zum ES herzustellen – arrowill12

Antwort

0

Was ich dieses Problem zu tun am Ende zu beheben war die folgende Einstellung hinzufügen, wenn die ES-Client zu erstellen.

'guzzleOptions' => array(
       'curl.options' => [ 
        CURLOPT_FORBID_REUSE => true 
       ] 
     ), 

hoffe das hilft jemand aus.

4

Versammeln Sie sich, und lassen Sie uns über lang anhaltende Warteschlangenprozesse sprechen.

Laravel-Warteschlangen arbeiten, mit Arbeitern. Diese rentlosen Elfen holen die Aufträge von unserem Warteschlangenservice und bearbeiten sie zeitnah.

Doch nach langen ununterbrochenen Arbeiten beginnen unsere Elfen müde zu werden und zufällig Fehler zu erzeugen. Zu den Fehlertypen zählen Fehler to send mail using SwiftMailer, um Datenbanktransaktionen zu verarbeiten, oder connect to SSL ports.

Was unsere Elfen brauchen, ist ein Energiegetränk, in Form von queue:restart, alle 20 Minuten.

Schritte zur Implementierung:

1) Wenn Sie auf Linux, geben Sie in der Konsole sudo crontab -e

2) Mit vim sind, geben Sie die folgenden Zeilen 0,20,40 * * * * cd /path/to/my/laravel/installation && php artisan queue:restart --env=yourenvironment 1>> /dev/null 2>&1

ersetzen /path/to/my/laravel/installation mit Pfad Ihre Laravel des .

Und yourenvironment mit dem Namen Ihrer Laravel-Umgebung.

Quelle: Ich habe eine ElasticSearch-Installation mit einer Betriebszeit von einem Monat und Laravel-Abfrage und Aktualisierung von Daten in Echtzeit mit dem Shift31-Paket.

Dokumentation: http://laravel.com/docs/5.0/queues#daemon-queue-worker

+0

Wird die Warteschlange nicht neu gestartet, wird der aktuelle Job, der gerade bearbeitet wird, gelöscht? – arrowill12

+0

Ich habe versucht, die Warteschlange neu zu starten, aber kein Glück. Bitte schaue dir mein Update oben an. – arrowill12

+0

Das Neustarten einer Warteschlange wartet, bis der aktuell bearbeitete Job abgeschlossen ist. Daher kein Datenverlust. – Mysteryos