Frage

Während diese Frage eventmachine markiert ist, generic BSD-Socket-Lösungen in jeder Sprache sind zu sehr geschätzt.


Einige Hintergrundinformationen:

Ich habe eine Anwendung auf einem TCP-Socket hören. Es wird gestartet und heruntergefahren mit einem normalen System-V-Init-Skript Stil.

Mein Problem ist, dass es einige Zeit starten muss, bevor es bereit ist, die TCP-Socket-Service. Es ist nicht allzu lange, vielleicht nur 5 Sekunden, aber das ist 5 Sekunden zu lang, wenn ein Neustart während eines Arbeitstages durchgeführt werden muss. Es ist auch wichtig, dass bestehende Verbindungen offen bleiben und fertig sind normal.

Gründe für einen Neustart der Anwendung sind Patches, Upgrades und dergleichen. Ich finde mich leider in der Position, dass jeder einmal in einer Weile, ich brauche diese Art der Sache in der Produktion zu tun.


Die Frage:

Ich bin auf der Suche nach einer Möglichkeit, eine saubere Übergabe des TCP-Listening-Socket zu tun, von einem Prozess zum anderem, und als Ergebnis nur einen Bruchteil einer Sekunde von Ausfallzeiten bekommen. Ich mag Anschlüsse / Buchsen bestehende offen zu bleiben und die Verarbeitung in dem alten Prozess zu beenden, während der neue Prozess neue connectinos beginnt Wartung.

Gibt es eine bewährte Methode, dies zu tun BSD-Sockets? (Bonuspunkte für eine Lösung eventmachine.)

Gibt es vielleicht Open-Source-Bibliotheken gibt diese Implementierung, dass ich wie es ist verwendet werden kann, oder als Referenz verwenden? (Auch nicht-Ruby und nicht-Lösungen geschätzt eventmachine auch!)

War es hilfreich?

Lösung

Es gibt ein paar Möglichkeiten, dies ohne Ausfallzeiten zu tun, mit entsprechenden Änderungen an das Server-Programm.

Eine davon ist eine Neustart-Fähigkeit in dem Server selbst, zum Beispiel beim Empfang eines bestimmten Signals oder anderer Nachricht zu implementieren. Das Programm würde dann seine neue Version exec, die Dateideskriptor Nummer des Abhörsocket vorbei z.B. als Argument. Diese Buchse hätte die FD_CLOEXEC Flag gelöscht (Standardeinstellung), so dass es vererbt werden. Da die anderen Buchsen durch den ursprünglichen Prozess gewartet werden wird fortgesetzt und sollte nicht auf den neuen Prozess weitergegeben werden, sollte die Flagge auf diejenigen zum Beispiel eingestellt werden mit fcntl() . Nach gabeln und execing den neuen Prozess, kann der ursprüngliche Prozess voran gehen und die Abhörsocket, da der neue Prozess jetzt in den Dienst ohne Unterbrechung in der Nähe auf diesem Sockel zu hören.

Eine alternative Methode, wenn Sie den neuen Server selbst fork und exec nicht die alten Server wollen zu müssen, wäre ein Unix-Domain-Socket zwischen dem alten und neuen Server-Prozess zu kommunizieren. Ein neuer Server-Prozess könnte prüfen für eine solche Buchse in einem bekannten Ort im Dateisystem, wenn es gestartet wird. Falls vorhanden, würde der neue Server mit dieser Buchse verbinden und verlangt, dass die alten Server Übertragung seiner Abhörsocket als Zusatzdaten mit SCM_RIGHTS. Ein Beispiel hierfür ist am Ende des CMSG (3) .

Andere Tipps

Jean-Paul Calderone hat eine Präsentation im Jahr 2004 auf einer ganzheitlichen Lösung für Ihr Problem mit Verdreht, einschließlich Socket-Migration und andere Fragen ausführlich beschrieben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top