In Java geschriebenes Heartbeat-Protokoll, das über UDP funktioniert
Das Heartbeat-Protokoll basiert auf einer kontinuierlichen Benachrichtigung über ein UDP-Datagramm mit einer Verzögerung von 1000 Millisekunden. Das Payload-Feld enthält die Kennungs-ID des Clients, die aus einer Zeichenfolge wie der MAC-Adresse der aktuell von der Ping-Quelle verwendeten Netzwerkkarten oder einer Kennung wie einem Benutzernamen bestehen kann. Der Server hört die verschiedenen Pings ab, sortiert sie nach der Kennung und verwaltet die verschiedenen Zustände, die sie selbst definieren. Immer wenn der Server feststellt, dass er nach einer Verzögerung von 3000 Millisekunden keinen Ping vom Client erhalten hat, benachrichtigt er den Benutzer dieses Protokolls durch ein Ereignis über den wahrscheinlichen Verbindungsverlust und empfiehlt, den Datenaustausch über eine andere Verbindung einzuschränken oder zu stoppen. abhängiges Protokoll wie TCP. Wenn Sie innerhalb von 5.000 Millisekunden diese Kennung erhalten, wird der Client wieder verbunden, was bedeutet, dass der Datenkommunikationskanal wiederhergestellt werden kann. Andernfalls gilt der Client als vollständig offline. All dies wird wie oben erwähnt über ein Eventmanagement wie unten dargestellt gemeldet:
@ Override
public void onHeartbeat ( HeartbeatEvent event ) {
LOGGER . log ( Level . INFO , () -> "Received heartbeat from " + event . getSource () + " in " + event . getTimeFromPreviousBeat () + " at " + event . getBeatTimeStamp ());
}
@ Override
public void onDeath ( HeartbeatEvent event ) {
LOGGER . log ( Level . INFO , () -> event . getSource () + " died after " + event . getTimeFromPreviousBeat () + " at " + event . getBeatTimeStamp ());
}
@ Override
public void onLossCommunication ( HeartbeatEvent event ) {
LOGGER . log ( Level . INFO , () -> "Communication lost of " + event . getSource () + " in " + event . getTimeFromPreviousBeat () + " at " + event . getBeatTimeStamp ());
}
@ Override
public void onReacquiredCommunication ( HeartbeatEvent event ) {
LOGGER . log ( Level . INFO , () -> "Communication reacquired of " + event . getSource () + " in " + event . getTimeFromPreviousBeat () + " at " + event . getBeatTimeStamp ());
}
@ Override
public void onAcquiredCommunication ( HeartbeatEvent event ) {
LOGGER . log ( Level . INFO , () -> event . getSource () + " connected at " + event . getBeatTimeStamp ());
}
Der obige Beispielcode zeigt die Erfassung verschiedener Ereignisse in den Zuständen eines Clients. Anschließend ist es die Aufgabe derjenigen, die den Listener implementieren, wie folgt zu entscheiden, was bei der Erfassung eines bestimmten Ereignistyps zu tun ist:
public class ServerStart implements HeartbeatListener {
private static final ServerStart thisInstance = new ServerStart ();
public static void main ( String [] args ) {
HeartbeatProtocolManager heartbeatProtocolManager = new HeartbeatProtocolManager ( thisInstance );
heartbeatProtocolManager . addHost ( "Test" , 43210 ); //identifier, port
heartbeatProtocolManager . addHost ( "Test1" , 43211 );
}
@ Override
public void onHeartbeat ( HeartbeatEvent event ) {
LOGGER . log ( Level . INFO , () -> "Received heartbeat from " + event . getSource () + " in " + event . getTimeFromPreviousBeat () + " at " + event . getBeatTimeStamp ());
}
@ Override
public void onDeath ( HeartbeatEvent event ) {
LOGGER . log ( Level . INFO , () -> event . getSource () + " died after " + event . getTimeFromPreviousBeat () + " at " + event . getBeatTimeStamp ());
}
@ Override
public void onLossCommunication ( HeartbeatEvent event ) {
LOGGER . log ( Level . INFO , () -> "Communication lost of " + event . getSource () + " in " + event . getTimeFromPreviousBeat () + " at " + event . getBeatTimeStamp ());
}
@ Override
public void onReacquiredCommunication ( HeartbeatEvent event ) {
LOGGER . log ( Level . INFO , () -> "Communication reacquired of " + event . getSource () + " in " + event . getTimeFromPreviousBeat () + " at " + event . getBeatTimeStamp ());
}
@ Override
public void onAcquiredCommunication ( HeartbeatEvent event ) {
LOGGER . log ( Level . INFO , () -> event . getSource () + " connected at " + event . getBeatTimeStamp ());
}
}
Das generierte Ereignis enthält nicht nur die Nutzlast, sondern auch die im Vergleich zum vorherigen Ereignis verstrichene Verzögerung mit seiner eigenen Nutzlast-ID und dem Zeitstempel des aktuellen Ping-Empfangs.
Die Verwendung dieses Protokolls ermöglicht eine bessere Verwaltung des Status der Verbindungen zwischen Client und Server und eine bessere Kontrolle möglicher Fehler.