4

我们有一些在 Linux (RHEL 4/5) 上使用 SunRPC 的服务,我们希望加速这些服务。

我们的 RPC 调用不需要返回值,尽管根据 RPC 的性质,总是会发送一个 ack。这引入了最近成为问题的延迟 - 当通过可靠传输 (TCP) 运行时,我们希望避免 RPC 回复引入的延迟。

此处的文档表明 Solaris 具有启用该功能的“oneway”关键字,尽管 Linux/glibc 似乎不支持这一点。

有什么方法可以在 Linux 上使用 SunRPC 启用“流式传输”或单向消息传递?

4

2 回答 2

2

clnt_call()为了获得异步(或“批处理”)RPC调用,必须对标准调用进行两项更改:作为回复数据结构的XDR函数指针的NULL参数必须是,超时参数必须是零,即

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) {
    ...
}
于 2010-11-19T20:34:38.640 回答
1

如果您的 RPC 库不支持“单向”通信,那么您始终可以使用线程池模式来模拟程序中的“即发即弃”类型的调用。不是直接发送远程调用(因此阻塞,直到你收到答案)你排队一个命令,在不同的线程中进行远程调用,并允许你的主程序继续它的执行。

于 2010-11-19T18:00:25.690 回答