2014-02-27 8 views
7

I celerybeat mit RedisToGo Nano-Addon auf Heroku bin mitMaximale Kunden erreicht auf Heroku und Redistogo Nano

Es gibt eine Web-dyno und ein Arbeiter dyno

Die celerybeat Arbeiter in jeder Minute eine Aufgabe auszuführen, eingestellt.

Das Problem ist: Jedes Mal, wenn ich eine neue einsetzen begehen, dynos neu zu starten, und ich erhalte diese Störung

2014-02-27T13:19:31.552352+00:00 app[worker.1]: Traceback (most recent call last): 
2014-02-27T13:19:31.552352+00:00 app[worker.1]: File "/app/.heroku/python/lib/python2.7/site-packages/celery/worker/consumer.py", line 389, in start 
2014-02-27T13:19:31.552352+00:00 app[worker.1]:  self.reset_connection() 
2014-02-27T13:19:31.552352+00:00 app[worker.1]: File "/app/.heroku/python/lib/python2.7/site-packages/celery/worker/consumer.py", line 727, in reset_connection 
2014-02-27T13:19:31.552352+00:00 app[worker.1]:  self.connection = self._open_connection() 
2014-02-27T13:19:31.552352+00:00 app[worker.1]: File "/app/.heroku/python/lib/python2.7/site-packages/celery/worker/consumer.py", line 792, in _open_connection 
2014-02-27T13:19:31.552352+00:00 app[worker.1]:  callback=self.maybe_shutdown) 
2014-02-27T13:18:23.864287+00:00 app[worker.1]:  self.on_connect() 
2014-02-27T13:18:23.864287+00:00 app[worker.1]: File "/app/.heroku/python/lib/python2.7/site-packages/redis/connection.py", line 263, in on_connect 
2014-02-27T13:18:23.864287+00:00 app[worker.1]:  if nativestr(self.read_response()) != 'OK': 
2014-02-27T13:18:23.864287+00:00 app[worker.1]: File "/app/.heroku/python/lib/python2.7/site-packages/redis/connection.py", line 314, in read_response 
2014-02-27T13:18:23.864287+00:00 app[worker.1]:  raise response 
2014-02-27T13:18:23.864287+00:00 app[worker.1]: ResponseError: max number of clients reached 
2014-02-27T13:19:31.552352+00:00 app[worker.1]: File "/app/.heroku/python/lib/python2.7/site-packages/kombu/connection.py", line 272, in ensure_connection 
2014-02-27T13:19:31.552352+00:00 app[worker.1]:  interval_start, interval_step, interval_max, callback) 
2014-02-27T13:19:31.552591+00:00 app[worker.1]: File "/app/.heroku/python/lib/python2.7/site-packages/kombu/utils/__init__.py", line 218, in retry_over_time 
2014-02-27T13:19:31.552591+00:00 app[worker.1]:  return fun(*args, **kwargs) 
2014-02-27T13:19:31.552591+00:00 app[worker.1]: File "/app/.heroku/python/lib/python2.7/site-packages/kombu/connection.py", line 162, in connect 
2014-02-27T13:19:31.552591+00:00 app[worker.1]:  return self.connection 
2014-02-27T13:19:31.552591+00:00 app[worker.1]: File "/app/.heroku/python/lib/python2.7/site-packages/kombu/connection.py", line 617, in connection 
2014-02-27T13:18:23.870811+00:00 app[worker.1]: [2014-02-27 13:18:23,870: ERROR/MainProcess] consumer: Connection to broker lost. Trying to re-establish the connection... 

und diese Protokolle gehen endlos. bis ich beide Dynos stoppe und sie neu starte.

Es ist ein Problem geworden, weil es fast jedes Mal passiert, wenn ein neues Commit bereitgestellt wird.

Irgendwelche Ideen, warum dies geschieht und wie man das löst?

Antwort

9

Der nano redistogo Plan deckt gleichzeitige Redis-Verbindungen bei ab.

Die Anzahl der verwendeten Redis Connects hängt von Ihren Front-End- und Sellerie-Einstellungen ab. Es klingt, als ob Sie > = 5 redis Verbindungen für Ihren Produktionstack verwenden.

Wenn Sie neuen Code bereitstellen, spinnt Heroku einen völlig neuen Stapel. Dies bedeutet, dass Sie zum Zeitpunkt der Bereitstellung > = 10 Redis-Verbindungen verwenden.

Es gibt zwei Möglichkeiten, dieses Problem zu beheben:

  • die maximale Anzahl von redistogo Verbindungen erhöhen erlaubt, durch zu einem größeren Plan Upgrade ($$$)
  • die Anzahl der verwendeten Anschlüsse für Ihren Stack verringern (verringern Sie die Parallelität von Sellerie oder redis Verbindungen von Ihrem Web-Arbeiter verwendet)

Dies ist eine einfache Frage der Ressourcen Erschöpfung. Ich würde nur für einen größeren RedisToGo-Plan bezahlen.

+0

+1 @Winfield ist wahrscheinlich richtig, Sie können den Befehl 'info' ausgeben, um die Anzahl der momentan' connected_clients' zu erhalten, die Sie gegen das Limit Ihrer aktuellen Instanz überprüfen können. die Verbindung, die Sie zum Ausgeben von 'info' verwenden, zählt ebenfalls. Ich arbeite übrigens bei redistogo nur per E-Mail an [email protected], wenn Sie Hilfe bei der Fehlerbehebung Ihrer Instanz benötigen. – mogramer

+0

Gibt es eine Möglichkeit, redis/heroku beim Deploy alle Verbindungen auf dem alten Stack zu schließen? – Erik

+1

Das Problem ist Timing - Ihre neuen Dynos kommen auf, während die alten untergehen. Vor allem, wenn Sie den Preboot für Zero-Downtime-Bereitstellungen verwenden. Der einzige Weg, um sicherzustellen, dass alle alten Verbindungen und Ressourcen freigegeben werden, bevor die neuen verwendet werden, besteht darin, die gesamte Site während der Deploy-Vorgänge herunterzufahren - und ich bezweifle, dass Sie das wollen. – Winfield

Verwandte Themen