Pergunta

Temos alguns serviços utilizando SunRPC no Linux (Rhel 4/5) que gostaríamos de acelerar.

Nossa chamada RPC não exige valor de retorno, embora, pela natureza do RPC, um ACK seja sempre enviado de qualquer maneira. Isso introduz a latência que recentemente se tornou um problema - quando atropelado por um transporte confiável (TCP), esperamos evitar a latência introduzida pela resposta do RPC.

Documentos aqui Indica Solaris tem a palavra -chave "Oneway", permitindo que, embora o Linux/Glibc não pareça apoiar isso.

Existe alguma maneira de permitir que "streaming" ou mensagens unidirecionais com o SunRPC no Linux?

Foi útil?

Solução

Existem duas alterações que devem ser feitas no padrão clnt_call() invocação para obter uma chamada de RPC assíncrona (ou "em lotes"): o argumento que é o ponteiro para a função XDR para a estrutura de dados da resposta deve ser NULL e o argumento do tempo limite deve ser zero, ou seja,

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

Outras dicas

Se a sua biblioteca RPC não suportar a comunicação "Oneway", você sempre poderá usar o Padrão do pool de threads Emular o tipo de invocação "Fogo e esquecer" em seu programa. Em vez de enviar a chamada remota diretamente (e, assim, bloquear até receber uma resposta), você enquadia um comando Isso faz a chamada remota em um encadeamento diferente e permite que você continue com sua execução.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top