2010-08-31 6 views
4

Nous avons quelques services utilisant SunRPC sous Linux (RHEL 4/5) que nous aimerions accélérer.SunRPC permet la messagerie à sens unique (streaming/batching?)

Notre appel RPC ne nécessite aucune valeur de retour, bien que par la nature de RPC, un accusé de réception est toujours envoyé. Cela introduit une latence qui est récemment devenue un problème: lors d'un transport fiable (TCP), nous espérons éviter la latence introduite par la réponse RPC.

Docs here indique que Solaris a le mot clé "oneway" qui le permet, bien que Linux/glibc ne semble pas le supporter.

Y a-t-il un moyen d'activer le "streaming" ou la messagerie unidirectionnelle avec SunRPC sous Linux?

Répondre

2

Il y a deux changements qui doivent être apportées à la clnt_call() norme invocation afin d'obtenir un asynchrone (ou « en lot ») appel RPC: l'argument qui est le pointeur sur la fonction XDR pour la réponse structure de données doit être NULL et l'argument de temporisation doit être zéro, c.-à-d.

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) { 
    ... 
} 
1

Si votre bibliothèque RPC ne prend pas en charge la communication "oneway", vous pouvez toujours utiliser le Thread Pool Pattern pour émuler le type d'invocation "fire and forget" dans votre programme. Au lieu d'envoyer l'appel distant directement (et donc de bloquer jusqu'à ce que vous receviez une réponse), vous mettez en file d'attente un command qui fait l'appel distant dans un thread différent et vous permet de continuer le programme principal avec son exécution.