2017-11-19 1 views
4

Ich arbeite an einer App, die die Web-Komponente (besucht über Browser) und Hintergrund Task-Processing-Komponente, an die Web-Komponente einige lang laufenden Sachen delegiert.Symfony App bleibt beim Holen von EntityManager

Ich habe gerade ein Problem gefunden, als ich meinen Webbrowser nur aktualisiert, um es unbegrenzt laden zu finden (zuerst in AJAX entdeckt, aber später in normaler Anfrage).

Es sah nicht wirklich offensichtlich, aber sobald ich den Hintergrund heruntergefahren Symfony Befehl, der auch EntityManager nutzt der Browser wird entsperrt und geht mit der Anfrage.

Meine App verwendet RabbitMQ, um Jobanforderungen zu speichern, die von der Webkomponente veröffentlicht werden. Der Befehl Symfony verwendet denselben "Backbone", um RabbitMQ Consumer zu erstellen und diese Jobs konsumieren.

ich versucht, ohne Erfolg:

  • Apache Neustarten
  • Neuformulierung RabbitMQ
  • Purging RabbitMQ Warteschlange
  • verschiedenen EntityManagers Verwendung für Web- und Befehls

I OldSoundRabbitMqBundle verwenden (link), um die Kommunikation zwischen diesen beiden zu erleichtern.

Die Webkomponente bleibt hängen, unabhängig von der aufgerufenen Aktion (nicht bezogen auf RabbitMQ Producer).

Hat jemand auf ähnliches Problem stolperte?

Das passiert auf Dev-Box, ich habe es nicht geschafft, es auf einem Produktionsserver zu drehen, noch würde ich, bis ich mehr darüber herausfinden.

Antwort

2

Es scheint, dass ich den Sperrmechanismus in Postgres missbraucht habe. Tatsächlich ist die Task-Verarbeitungskomponente eine lang andauernde Task, aber da es der Symfony-Befehl ist, wird die Doctrine-Verbindung so früh wie möglich eingerichtet.

Jetzt kommt der schwierige Teil: ich die LOCK TABLE Anweisung von den gleichzeitigen Zugriff einige Tische entfernt zu sperren (EXCLUSIVE Typ). Ohne die Verbindung zu schließen (nicht Entity Manager), bleiben diese Sperren intakt, bis ich den Befehl (jede 10. Aufgabe) neu starte.

Dies war die Ursache.

Ich untersuche immer noch einige Edge-Fälle, aber seit ich zum Advisory Locking gewechselt habe, hatte ich keine Lock-ups mehr.

Verwandte Themen