Heroku: Web-Dyno vs. Worker-Dyno? Wie viele / welches Verhältnis brauche ich?

81

Ich war neugierig, was der Unterschied zwischen Web- und Worker-Dynos bei Heroku ist. Sie geben auf ihrer Preisseite eine Erklärung mit einem Satz, aber das hat mich nur verwirrt. Woher weiß ich, wie viele ich jeweils auswählen soll? Gibt es ein Verhältnis, das ich anstreben sollte? Ich bin ziemlich neu in diesem Bereich. Kann jemand eine ausführliche Erklärung geben oder auf irgendeine Weise berechnen, wie viele und welche Dynos ich benötigen würde?

Außerdem bin ich verwirrt darüber, was sie mit der Anzahl der Stunden für jeden Prüfstand bedeuten.

http://www.heroku.com/pricing

Ich bin auch auf diesen Artikel gestoßen. Als eine ihrer vorgeschlagenen Lösungen sagten sie, die Anzahl der Dynos zu erhöhen. Auf welche Art von Prüfstand beziehen sie sich hier?

http://devcenter.heroku.com/articles/backlog-too-deep

varatis
quelle

Antworten:

58

Ihr bester Hinweis, wenn Sie mehr Dynos benötigen (auch bekannt als Prozesse auf Cedar), sind Ihre Heroku-Protokolle. Stellen Sie sicher, dass Sie ein Upgrade auf erweiterte Protokollierung durchführen (kostenlos), damit Sie Ihr Protokoll verwalten können.

Sie suchen nach den Einträgen von heroku.router und der Wert, der Sie am meisten interessiert, ist der Warteschlangenwert. Wenn dieser Wert konstant über 0 liegt, ist dies ein gutes Zeichen, dass Sie weitere Dynos hinzufügen müssen. Im Wesentlichen bedeutet dies, dass mehr Anforderungen eingehen, als Ihr Prozess verarbeiten kann, sodass sie in die Warteschlange gestellt werden. Wenn sie zu lange in der Warteschlange stehen, ohne Daten zurückzugeben, tritt eine Zeitüberschreitung auf.

Ich fürchte, es gibt kein ideales Verhältnis. Sie könnten eine App haben, die 100 Anfragen pro Sekunde ausführt und viele Webprozesse benötigt, aber einfach keine Mitarbeiter einsetzt. Sie benötigen nur Arbeitsprozesse, wenn Sie im Hintergrund verarbeiten, z. B. E-Mails senden usw. usw.

ps Zu tiefes Backlog wäre ein Dyno-Webprozess, der es verursachen würde.

UPDATE: Am 26. März 2013 entfernte Heroku Warteschlangen- und Wartefelder aus dem Abmelde-Put.

Warteschlangen- und Wartefelder wurden aus Router-Protokollnachrichten entfernt. Außerdem setzt der Heroku-Router die HTTP-Header X-Heroku-Dynos-In-Use, X-Heroku-Queue-Depth und X-Heroku-Queue-Wait-Time für eingehende Anforderungen nicht mehr.

John Beynon
quelle
12
Um Heroku Router Protokolle zu sehen, tun Sieheroku logs -p router --tail
Nathan Hurst
1
Ich sehe keinen Warteschlangenwert Ich sehe dyno = web.1 connect = 2ms service = 4ms status = 200 bytes = 43
Jaqx
8
Warum haben sie sie entfernt?
Attilio
6
Sie können diese Informationen weiterhin erhalten, indem Sie das Heroku Labs-Add-On aktivieren log-runtime-metrics. Führen Sie dazu den folgenden Befehl aus : heroku labs:enable log-runtime-metrics. Lesen Sie hier mehr: devcenter.heroku.com/articles/log-runtime-metrics
Jeremy Fox
3
stackoverflow.com/a/19965981/1233555 - Heroku hat ein zufälliges Routing durchgeführt, sodass bei einigen Dynos Warteschlangen gestapelt werden können, während andere Dynos frei sind. Vermeiden Sie dies, indem Sie sicherstellen, dass alle Anforderungen in Ihren Webdynos sehr schnell bearbeitet werden.
ChrisPhoenix
15

Dynos sind im Grunde Prozesse, die auf Ihrer Instanz ausgeführt werden. Mit dem neuen Cedar-Stack können sie so eingerichtet werden, dass sie einen beliebigen Shell-Befehl ausführen. Für Webanwendungen haben Sie im Allgemeinen einen Prozess namens "Web", der für die Beantwortung von HTTP-Anfragen von Benutzern verantwortlich ist. Alle anderen Prozesse wurden früher als "Arbeiter" bezeichnet. Diese werden kontinuierlich im Hintergrund ausgeführt, z. B. für Cron, Verarbeitungswarteschlangen und umfangreiche Berechnungen, bei denen Sie Ihre Webprozesse nicht binden möchten. Sie können auch jeden Prozesstyp skalieren, sodass mehrere Prozesse jedes Typs für zusätzliche Parallelität gestartet werden. Die Menge, die Sie verwenden, hängt wirklich von den Anforderungen Ihrer Anwendung und der empfangenen Last ab. Sie können Tools wie das New Relic-Plugin verwenden, um diese Dinge zu überwachen.

Jimmy Cuadra
quelle
1
"Dynos sind im Grunde Prozesse, die auf Ihrer Instanz ausgeführt werden." Dies ist eine falsche Aussage. Dyno existiert auf verschiedenen Instanzen.
Neil Middleton
9

Eine Reihe von Personen hat erwähnt, dass kein Verhältnis bekannt ist und dass das Verhältnis von Web-Workern zu Hintergrund-Workern, das Sie möchten, davon abhängt, wie Sie Ihre Anwendung entworfen haben - das ist richtig. Ich dachte jedoch, es könnte nützlich sein, hinzuzufügen, dass Sie als allgemeine Faustregel möchten, dass Ihre Web-Worker - und damit die Controller-Aktionen, die sie ausführen - blitzschnell und sehr leicht sind, um die Latenz in den Antwortzeiten von Browser-Aktionen zu verringern. Wenn es eine Browseraktion gibt, für deren Bereitstellung mehr als beispielsweise eine halbe Sekunde Echtzeit erforderlich ist, möchten Sie wahrscheinlich eine Art System entwickeln, das den Großteil dieser Aktion in eine Warteschlange stellt.

Sie würden dann einen oder mehrere Offline-Worker-Dynos entwerfen, die diese Warteschlange bedienen. Sie können viel länger dauern, da für ihre Ausgabe keine HTTP-Antworten anstehen. Möglicherweise wird auf der Seite, die Sie von der ersten Browseranforderung gerendert haben, die die Aktion ausgelöst hat, Javascript bereitgestellt, das einen Thread startet, der überprüft, ob die Anforderung alle 5 Sekunden abgeschlossen wurde, oder etwas in dieser Richtung.

Ich kann Ihnen immer noch kein Verhältnis geben, mit dem Sie aus dem gleichen Grund arbeiten können, den andere angegeben haben, aber hoffentlich hilft Ihnen dies bei der Entscheidung, wie Sie Ihre App entwerfen. (Ich sollte auch erwähnen, dass dies nur ein Design von vielen gültigen ist.)

eblume
quelle
3

https://stackoverflow.com/a/19965981/1233555 - Heroku hat ein zufälliges Routing durchgeführt, sodass bei einigen Dynos Warteschlangen gestapelt werden können (während sie eine lange Anfrage bedienen), während andere Dynos frei sind. Vermeiden Sie dies, indem Sie sicherstellen, dass alle Anforderungen in Ihren Webdynos sehr schnell bearbeitet werden. Dadurch wird die Anzahl der benötigten Web-Dynos reduziert, während mehr Worker-Dynos erforderlich sind.

Sie müssen sich auch darum kümmern, dass Ihre Web-App Parallelität unterstützt, was nur einige Rails-Konfigurationen tun - versuchen Sie es mit Unicorn oder sorgfältig geschriebenem Code (für E / A, die die EventMachine nicht blockiert) mit Thin.

Sie müssen wahrscheinlich versuchen, anstatt zu berechnen, um zu sehen, wie viele Dynos jeder Art Sie benötigen. Stellen Sie sicher, dass ihr neues Relikt die Dyno-Warteschlange meldet - siehe den obigen Link.

ChrisPhoenix
quelle
1

Die kurze Antwort lautet, dass Sie so viele benötigen, wie Sie benötigen, um Ihre Warteschlangen niedrig zu halten.

Wie John beschreibt, benötigen Sie mehr Dynos, wenn Sie eine Warteschlange in Ihren Protokollen sehen. Wenn Ihre Hintergrundwarteschlangen zu lang werden (wie Sie diese Informationen erhalten, hängt davon ab, was Sie implementiert haben), benötigen Sie mehr Mitarbeiter.

Es gibt kein Verhältnis, da es sehr stark von Ihrem Anwendungsdesign und Ihrer Verwendung abhängt.

Neil Middleton
quelle
1
OK danke. Ich gehe davon aus, dass Sie mit Dynos Web-Dynos meinen. Wie suche ich in meinem Protokoll nach einer Warteschlange? Insbesondere frage ich, wie ich feststellen kann, ob sich beim Lesen meines Protokolls Dinge häufen. Ich bin ein Rails-Entwickler, daher beschäftige ich mich häufig mit dem Ausführen eines lokalen Servers und dem Lesen dieser Protokolle, bin mir jedoch nicht sicher, wie ich eine Warteschlange identifizieren kann, wenn ich eine sehe.
Varatis
1
Meine Antwort beschreibt, wie Sie die Größe der Warteschlange ermitteln können, wenn Sie sich bei Heroku anmelden und nach Router-Einträgen und dem Wert für Warteschlange = suchen. Ihre lokalen Protokolle helfen Ihnen nicht weiter - Sie müssen sie über die heroku logs -fBefehlszeile verwenden.
John Beynon
1
@ JohnBeynon Ok, danke. Ich habe das erst später wieder bemerkt.
Varatis