是否可以使用gRPC从服务器向客户端执行RPC请求?

时间:2018-11-01 09:58:18

标签: c# .net-core grpc

前言:

我以前没有使用过gRPC。我只是先研究这项技术,然后尝试了解我是否可以在项目中使用它。 我将C#与net core 2.1一起使用,如果它对某些事情很重要。

问题:

我有一个服务器和多个客户端,我需要从服务器到客户端执行rpc请求。 gRPC是否可用?如果是的话,那我该怎么办呢?

3 个答案:

答案 0 :(得分:1)

服务器启动的请求不是gRPC的一流功能,但是,使用流语义始终可以实现这种PRC拓扑。

例如,流程为:
1)所有客户端都与服务器建立了长期存在的流式RPC
2)服务器现在可以将消息发送到这些流上的每个客户端,就好像每个消息都是单独的RPC

答案 1 :(得分:0)

使用gRPC,服务器无法启动与客户端的联系。但是,客户端可以将初始rpc发送到服务器,然后等待其响应,直到服务器具有所需的资源,如下所示:

using (var call = client.InitialContact(clientID))
{
    var responseStream = call.ResponseStream;
    while (await responseStream.MoveNext()){
        //do something if there is a response
    }
}

答案 2 :(得分:0)

来自https://groups.google.com/forum/#!topic/grpc-io/wAF9T0nQcH0的答案

答案作者:Josh Humphries (Josh,如果您要阅读本主题,请在此处发布您的答案,我会接受并删除我的副本)

您可以使用双向流,其中服务器在流上发送的每条消息都将有来自客户端的一条消息作为答复。实际的请求和响应类型都可以具有一个:响应消息在每个实际的RPC操作(及其请求类型)的oneof中有一个选项;请求消息(由客户端发送)实际上将定义响应类型。您可以在服务器反射服务中看到类似这样的示例。但是,这是普通的客户端到服务器的RPC。您只需交换请求和响应类型(让服务器成为首先通过发送“响应”消息并获得“请求”作为回复来发起请求的服务器)。

为进行正常拆除,服务器仅需停止使用流来发送请求,等待对所有未完成操作的答复,然后关闭流/终止RPC。当客户端关闭时,它可能会停止接受来自服务器的消息(在收到每一个消息之后,立即按照“关闭”的行发送错误消息)。

如果您要支持乱序执行(例如,可以以与接收服务器请求不同的顺序发送客户端答复),则请求和响应模式将需要具有带有某种请求ID的信封以进行关联回复他们的原始请求。

此外:我一直在研究您可能会发现有用的东西-隧道gRPC的通用机制。通过gRPC服务设置隧道,该服务提供与低级gRPC传输相同的功能。有一些有趣的用例,但是服务器到客户端的用例是最有趣的IMO。如果您有好奇心,可以在进行中的工作中浏览一下https://github.com/jhump/grpctunnel。 (不幸的是,我不知道什么时候才能真正完成这个库,但是它可能有一些有趣的想法/代码可供您使用。)