0

Ich habe zwei Computer, die bestimmte Ereignisse behandeln. Es ist möglich, dass beide das gleiche Ereignis gleichzeitig erkennen. Ich muss entscheiden, welches Peer-Event das einzige Event bleibt (und dann muss der Peer etwas mit dem Event machen). Ich habe kein allgemeines Synchronisierungswerkzeug wie eine Datenbank zur Verfügung.Wie entscheidet man, welche Kopie eines Ereignisses bei der asynchronen Datensynchronisation verwendet werden soll?

Das Problem, wie ich es sehe, geht so:

  • Peer 1: Paket A senden 2
  • Peer 2 zu Peer: Paket A senden 1
  • Peer 2 Peer: incoming Paket A von Peer 1
  • Peer 1: Ein ankommendes Paket von dem Peer-2
  • ... (ich bin in Schwierigkeiten)

Wie entscheidet jeder Peer, welches Paket A zu behalten ist? Beide haben das Paket erzeugt, beide haben es geschickt und nun sehen beide auch, dass der andere Peer ihre eigene Kopie geschickt hat.

Ich muss dies so lösen, dass ein Peer-Paket "vorherrscht", so dass dieser Peer die notwendigen Aktionen ausführen kann.

Meine aktuelle beste Vermutung:

Ich denke, das Paket mit einer Zufallszahl auf „ausstatten“. Wenn das Paket des anderen Peers eine niedrigere Zufallszahl hat, wird es verworfen. Wenn Nummer gleich meins ist, wird der Prozess wiederholt, bis einer der Randoms größer ist oder ein Schluckauf im Netzwerk bewirkt, dass der gesamte Handshake nur von einer Seite durchgeht.

Funktioniert meine vorgeschlagene Lösung sogar? Gibt es eine optimale Lösung?

Antwort

1

Wenn die Peers über IDs verfügen, die anderen Peers bekannt sind, können Sie das Paket, das vom Peer stammt, mit der höheren ID beibehalten.

Wenn sie keine IDs haben, können Sie stattdessen ihre IP-Adresse verwenden. Konvertiere die IP in eine Ganzzahl, vergleiche sie und behalte das Paket vom Sender mit der "höheren" IP.
==> Dies ist aufgrund von NAT möglicherweise nicht zuverlässig genug (doppelte IPs möglich).

Sie können jedes verfügbare Feld Ihres Protokolls oder der zugrunde liegenden Protokolle (Zeitstempel, MAC-Adresse usw.) verwenden.

+0

Ha ha. Und hier erfinde ich ein paar Randoms, wenn ich bereits eindeutige IDs habe: p Das bedeutet natürlich, dass es letztendlich derselbe Peer ist, der die meiste Zeit alles macht, aber ehrlich gesagt sehe ich nicht, dass das schädlich sein könnte. – velis

+0

Hehe, wir waren alle dort;) Aber das Teilen der Arbeit ist eine interessante Einschränkung. Vielleicht kann ein (bereits existierendes und geteiltes) Feld wie task/command-Nr zum Tauschen verwendet werden: Wenn der Befehl gerade ist, funktioniert eine größere ID. Wenn es merkwürdig ist, tut es eine kleinere ID. – 1000ml

Verwandte Themen