SunRPC ermöglichen eine Möglichkeit, Messaging (Streaming / Dosierung?)
Frage
Wir haben einige Dienste nutzen SunRPC auf Linux (RHEL 4/5), dass wir möchten, dass bis beschleunigen.
Unser RPC-Aufruf keinen Rückgabewert benötigen, wenn auch durch die Art der RPC, ein ack sowieso immer gesendet wird. Dies führt Latenz das ist vor kurzem ein Problem werden - wenn sie über einen zuverlässigen Transport (TCP) läuft, würden wir die Latenz durch die RPC-Antwort eingeführt zu vermeiden hoffen
.hier zeigt Solaris hat das „oneway“ Stichwort ermöglicht nur das, obwohl Linux / glibc nicht, dies zu unterstützen scheint.
Gibt es eine Möglichkeit können wir "Streaming" oder One-Way-Messaging mit SunRPC auf Linux?
aktivierenLösung
Es gibt zwei Änderungen, die an den Standard clnt_call()
Aufruf gemacht werden, um muss eine asynchrones (oder „dosierte“) RPC-Aufruf zu erhalten: das Argument, das für die Antwort-Datenstruktur der Zeiger auf die XDR-Funktion ist muss NULL
und das Timeout-Argument Null sein muss, dh
static struct timeval ZERO_TIMEOUT = { 0, 0 };
static char clnt_res;
memset((char*)&clnt_res, 0, sizeof(clnt_res);
if (clnt_call(clnt, messageType, (xdrproc_t)xdr_messageType_t, (caddr_t)argp,
(xdrproc_t)NULL, (caddr_t)&clnt_res, ZERO_TIMEOUT) != RPC_SUCCESS) {
...
}
Andere Tipps
Wenn Ihre RPC-Bibliothek nicht die „oneway“ Kommunikation nicht unterstützt, dann verwenden Sie immer die Thread-Pool-Muster den „fire and forget“ zu emulieren Art Aufruf in Ihrem Programm. Anstatt den Remote-Aufruf zu senden (und somit blockiert, bis Sie eine Antwort erhalten) Sie enqueue einen Befehl das macht den Remote-Aufruf in einem anderen Thread und ermöglicht es Ihnen, Hauptprogramm mit seiner Ausführung fortzusetzen.