Höhere Verfügbarkeit
Wie Chris erwähnt, ist Ihr API-Server die einzige Fehlerquelle in Ihrem Layout. Was Sie einrichten, ist eine Nachrichtenwarteschlangeninfrastruktur, die viele Leute zuvor implementiert haben.
Folgen Sie dem gleichen Weg
Sie erwähnen das Empfangen von Anforderungen auf dem API-Server und fügen den Job in eine MySQL-Datenbank ein, die auf jedem Server ausgeführt wird. Wenn Sie diesen Pfad fortsetzen möchten, empfehle ich, die API-Serverebene zu entfernen und die Worker so zu gestalten, dass sie jeweils Befehle direkt von Ihren API-Benutzern akzeptieren. Sie können so etwas wie Round-Robin-DNS verwenden, um jede API-Benutzerverbindung direkt an einen der verfügbaren Arbeitsknoten zu verteilen (und es erneut zu versuchen, wenn eine Verbindung nicht erfolgreich ist).
Verwenden Sie einen Message Queue Server
Robustere Infrastrukturen für die Nachrichtenwarteschlange verwenden für diesen Zweck entwickelte Software wie ActiveMQ . Sie können die RESTful-API von ActiveMQ verwenden, um POST-Anforderungen von API-Benutzern zu akzeptieren, und inaktive Mitarbeiter können die nächste Nachricht in der Warteschlange abrufen. Dies ist jedoch wahrscheinlich ein Overkill für Ihre Anforderungen - es ist auf Latenz, Geschwindigkeit und Millionen von Nachrichten pro Sekunde ausgelegt.
Verwenden Sie Zookeeper
Als Mittelweg möchten Sie vielleicht Zookeeper betrachten , obwohl es sich nicht speziell um einen Nachrichtenwarteschlangenserver handelt. Wir verwenden at $ work genau für diesen Zweck. Wir haben drei Server (analog zu Ihrem API-Server), auf denen die Zookeeper-Serversoftware ausgeführt wird, und ein Web-Frontend für die Bearbeitung von Anforderungen von Benutzern und Anwendungen. Das Web-Frontend sowie die Zookeeper-Backend-Verbindung zu den Workern verfügen über einen Load Balancer, um sicherzustellen, dass die Warteschlange weiterhin verarbeitet wird, auch wenn ein Server wegen Wartungsarbeiten nicht verfügbar ist. Wenn die Arbeit erledigt ist, teilt der Mitarbeiter dem Zookeeper-Cluster mit, dass der Auftrag abgeschlossen ist. Wenn ein Arbeiter stirbt, wird dieser Job zur Fertigstellung an eine andere Arbeit gesendet.
Andere Bedenken
- Stellen Sie sicher, dass Jobs abgeschlossen sind, falls ein Mitarbeiter nicht antwortet
- Woher weiß die API, dass ein Auftrag abgeschlossen ist, und kann ihn aus der Datenbank des Arbeitnehmers abrufen?
- Versuchen Sie, die Komplexität zu reduzieren. Benötigen Sie einen unabhängigen MySQL-Server auf jedem Worker-Knoten oder können diese mit dem MySQL-Server (oder dem replizierten MySQL-Cluster) auf den API-Servern kommunizieren?
- Sicherheit. Kann jemand einen Job einreichen? Gibt es eine Authentifizierung?
- Welcher Arbeiter sollte den nächsten Job bekommen? Sie erwähnen nicht, ob die Aufgaben voraussichtlich 10 ms oder 1 Stunde dauern werden. Wenn sie schnell sind, sollten Sie Ebenen entfernen, um die Latenz gering zu halten. Wenn sie langsam sind, sollten Sie sehr vorsichtig sein, um sicherzustellen, dass kürzere Anfragen nicht hinter ein paar lang laufenden Anfragen hängen bleiben.