Frage

In RPC Semantik wo Erlang Hoffnung hat für die besten, SUN RPC mit at-mindestens einmal und Java RMI mit at-most-once, aber niemand hat genau einmal Semantik.

Warum ist es nicht machbar scheint genau einmal Semantik zu haben?

Zum Beispiel, wenn der Kunde hält eine eindeutig markierte Anforderung erneut gesendet wird, bis eine Antwort empfangen wird und ein Server verfolgt alle behandelten Anfragen, um eine Anforderung nicht zu duplizieren. Wäre das nicht genau einmal sein?

War es hilfreich?

Lösung

Überlegen Sie, was passiert, wenn der Server abstürzt zwischen der Anforderung der Durchführung und Aufnahme, dass er die Anforderung durchgeführt hat?

können Sie erhalten at-most-once durch die Anforderung der Aufnahme, dann ausführt. wenn Sie einen Crash zwischen den beiden bekommen, dann haben Sie (fälschlicherweise) aufgezeichnet als durchgeführt, so dass Sie es nicht wieder tun. Daher at-most-once

Seltsamer, dieser (mit Timeouts) ist patentiert: http://www.freepatentsonline.com/7162512 .html . Außer wie ich oben argumentieren, garantiert sie nicht genau einmal.

Sie erhalten bei der kleinsten einmal durch sie durchgeführt wird, dann die Aufnahme es. Wenn Sie einen Absturz zwischen den beiden bekommen, werden Sie es erneut ausführen, wenn der Antrag wiederholt wird.

Aber es ist nicht wirklich möglich, zu sagen „genau einmal“ unter allen Umständen

(Es gibt ähnliche Szenarien für Netzwerkfehler statt Server abstürzt)

Andere Tipps

High-End-Messaging-Busse, wie IBM WebSphere MQ genau einmal Anlieferung Sie vorgeben zu bieten. In der Tat ist dies das Standardverhalten (wie der letzte Mal, dass ich WMQ verwendet ...). Sie erreichen dies mit Write-Ahead-Logs und eine Vielzahl von Techniken zu verriegeln.

Natürlich, ich zweifle nicht daran, dass irgendwo in ihrem juristischen Dokumenten begraben „genau einmal“ ist eigentlich definiert „bedeuten Nachricht, einmal kann nicht geliefert werden oder kann, mehr als einmal. Oder viel. Oder weniger als Null .“ um den Rücken zu decken, aber es funktioniert in der überwiegenden Mehrzahl der Fälle, darunter den Rauswurf von Stromkabeln, wobei Achsen Infrastruktur zu vernetzen, etc.

Ich denke, die Antwort ist, dass Sie eine unbegrenzte Menge an Zeit brauchen würden, um diese Semantik zu bekommen, weil der Kunde für ein endgültiges Ergebnis vom Server warten würde, die nie kommen. Diese Anforderung ist nicht praktikabel auf realen Netzwerken.

Wenn der Kunde jemals versucht aufgibt (oder wenn der Server über einen längeren Zeitraum untergeht entweder vor Abschluss der Transaktion oder vor signalisiert, dass es abgeschlossen ist, je nachdem, was um es tut diese Dinge), dann kann es keine Möglichkeit für der Kunde zu wissen, ob die Anforderung empfangen wurde und behandelt werden. In der Praxis RPC-Systeme können zum Beispiel wollen Standard-TCP-Timeouts respektieren, so will nicht für einen endgültigen Erfolg oder Misserfolg von dem Server zu warten haben.

Das ist eine Vermutung aber: Ich habe noch nie ein RPC-Protokoll entworfen

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