【问题标题】:Grpc C++: How to wait until a unary request has been sent?Grpc C++:如何等到一元请求被发送?
【发布时间】:2021-06-03 14:45:52
【问题描述】:

我正在为 gRPC 一元调用编写一个包装器,但我遇到了一个问题:假设我有一个 ClientAsyncResponseReader 对象,它被创建并像这样启动一个请求

response_reader_ = std::unique_ptr<grpc::ClientAsyncResponseReader<ResponseType>>(
        grpc::internal::ClientAsyncResponseReaderFactory<ResponseType>::Create(
            channel.get(), completion_queue, rpc_method, &client_context_, request, true
        )
);
response_reader_->Finish(
    response_sharedptr_.get(), status_sharedptr_.get(), static_cast<void*>(some_tag)
);
// Set a breakpoint here

所有参数都有效。

我的印象是,当Finish 调用返回时,request 对象肯定会通过网络发送出去。但是,通过在 Finish() 调用之后设置断点(在客户端程序中,要清楚)并检查我的服务器日志,我发现服务器直到我 resume 之后才记录request em> 从断点开始。

这似乎表明我需要等待其他一些事情以确保请求被真正发送出去:而且,执行上述代码的线程在发送请求方面仍然具有某种作用出现断点后。

当然,也许我的假设是错误的,并且服务器没有在请求进入时立即记录它。如果不是,那么显然我没有像我应该的那样理解 gRPC 的语义,所以我希望获得一些更有经验的见解。

你可以看到我的一元调用抽象代码here。应该足够了,但如果需要其他任何东西,我很乐意提供。

编辑:情节变厚了。在服务器的处理程序上为传入请求设置断点后,看起来对 Finish 的调用通常确实“确保”请求已发送出去:except进程发送的第一个请求。我猜grpc::channel 甚至可能在grpc::completion_queue 中维护了一些状态,这会延迟初始请求

【问题讨论】:

    标签: grpc grpc-c++


    【解决方案1】:

    来自文档

    response_reader_ = std::unique_ptr<grpc::ClientAsyncResponseReader<ResponseType>>(
            grpc::internal::ClientAsyncResponseReaderFactory<ResponseType>::Create(
                channel.get(), completion_queue, rpc_method, &client_context_, request, true
            )
    );
    

    这将启动一个调用并写出请求 (start=true)。此函数没有标签参数。因此,完成队列无法通知呼叫开始何时完成。调用 RPC 方法有点复杂,它主要涉及创建网络数据包并将其放入网络中。如果传输暂时失败或通道完全消失或用户做了一些愚蠢的事情,它可能会失败。另一件事,为什么我们需要标签通知是完成队列实际上是一个争用点。所有 RPC 对象都与此对话,可能会发生完成队列不空闲且请求仍处于挂起状态。

    response_reader_->Finish(
        response_sharedptr_.get(), status_sharedptr_.get(), static_cast<void*>(some_tag)
    

    这将请求 RPC 运行时接收服务器的响应。输出是当服务器响应到达时,完成队列将通知客户端。在此刻。我们假设客户端没有错误,一切正常并且请求已经在进行中。所以对于一元 rpc,Finish 调用的状态永远不会是假的。

    这似乎表明我需要等待其他一些事情以确保请求被真正发送出去:而且,执行上述代码的线程在发送请求方面仍然具有某种作用出现断点后。

    也许,您想重用请求对象(我对此做了一些实验)。对我来说,我将请求对象保存在内存中,直到响应到达。无法保证在创建调用后不需要请求对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-06-24
      • 1970-01-01
      • 2021-10-19
      • 1970-01-01
      • 1970-01-01
      • 2019-09-28
      • 2015-03-17
      • 1970-01-01
      相关资源
      最近更新 更多