LU07.A01 - Discovery Service erstellen

Erstelle einen einfachen Discovery Service auf Basis von Sockets. Die Programmvorlage basiert auf dem Code von https://realpython.com/python-sockets/.

GitHub Classroom Assignment

Ausgangslage

Der Discovery-Service ist ein Python-Skript, welches die Services in unserem verteilten System verwaltet. Die Kommunikation mit diesem Service erfolgt über Sockets.

Das Python-Skript verwaltet die Services in der Klasse Services. Diese Klasse enthält eine Liste von Dictionaries. Für jeden Service wird ein Eintrag in der Liste erstellt.

Key Value Datentyp
uuid UUID des Services String
type Die Art des Services String
ip Unter welcher IP-Adresse ist der Service erreichbar String
port Unter welchem Port ist der Service erreichbar int
heartbeat Zeitpunkt des letzten Herzschlags datetime

Aktionen

register

Jeder Service muss sich beim Starten beim Discovery Service registrieren. Der Discovery-Service erzeugt eine neue UUID für diesen Service und trägt den Service in seine Serviceliste ein. Als heartbeat wird der aktuelle Zeitstempel eingetragen.

heartbeat

Jeder Service muss sich in regelmässigen Abständen (z.B. 5 Sekunden) beim Discovery Service melden. Mit dieser Aktion wird das Attribut heartbeat der bestehenden Registration aktualisiert.

query

Ein Client kann eine Liste aller Services für einen bestimmte Art von Service (type) anfordern. Der Discovery-Service durchsucht seine Serviceliste nach Services mit dem gewünschten type. Entspricht ein Service der gewünschten Art UND der letzte Herzschlag ist weniger als 5 Sekunden alt, so wird dieser Service in die Response aufgenommen. Jeder Service dessen letzter Herzschlag älter als 5 Sekunden ist, wird aus der Serviceliste entfernt.

Testen

Um den Discovery-Service zu testen, steht dir im Repository ein einfacher Socket-Client.

  1. Starte deinen Discovery-Service in PyCharm oder über die Kommandozeile.
  2. Öffne ein separates Terminal und navigiere zum Ordner mit dem Socket-Client.
  3. Starte den Client mit py socket_client.py <IP> <PORT>.

Marcel Suter