【问题标题】:gRPC private channelsgRPC 私有通道
【发布时间】:2018-08-20 04:41:20
【问题描述】:

是否可以只从 gRPC 服务器流式传输到某些客户端?

我相信我正在寻找类似于 Pusher 的东西,您可以在其中为客户提供一个频道,并且您可以发布只有有权访问该频道的客户才能看到的消息。

我正在努力理解我们需要采取哪些步骤来做这样的事情。

考虑 web-sockets 我相信我们可以存储每个客户端连接,然后我们可以找到该连接并发送消息。我们如何使用gRPC 做类似的事情?

【问题讨论】:

    标签: go grpc


    【解决方案1】:

    据我了解这个问题。您希望将消息发送到 gRPC 中的特定客户端。在 gRPC 中使用 Server side streamingBi-directional 流式传输非常有可能。

    例如:

    定义服务器端流式传输或双向流式传输 api

    rpc ListFeatures(Rectangle) returns (stream Feature) {}
    

    在服务器端:

    func ListFeatures(rect *pb.Rectangle, stream pb.RouteGuide_ListFeaturesServer) error {
      // Save this stream instance in the server on a map or other suitable data structure
      // so that you can query for this stream instance later
      // This will act same like your websocket session
    }
    

    当您想向特定客户发送内容时,请获取 流实例并执行

    err := stream.Send(feature); // Any times as required
    

    在客户端,它将等待这样的消息

    stream, err := client.ListFeatures(ctx, rect)
    
    for {
        feature, err := stream.Recv()
        ...
        // handle message here
    }
    

    对于双向流 rpc 也可以做同样的事情。我希望这能回答你的问题

    【讨论】:

    • 您能否指导如何保持客户端中的连接打开,以便客户端可以接收来自流服务器的进一步响应?
    • feature, err := stream.Recv() 这基本上是一个阻塞调用,它一直等到它收到来自服务器的消息。而这个等待是在无限的for loop 内,所以它会无限期地等待服务器发送消息。唯一的问题是这段代码应该在go routine 中,这样它就可以异步接收来自服务器的消息,而客户端可以在主线程中做其他事情。
    • 我想在 C++ 中做同样的事情,但是当我将代码放入 while 循环时它会中断。你能指导我吗?
    • 谢谢你想通了。还有一个帮助,你能指导我如何阻止客户端超时 ClientContext::set_deadline is not working .
    猜你喜欢
    • 2020-04-08
    • 1970-01-01
    • 2021-09-14
    • 1970-01-01
    • 2022-11-03
    • 2020-07-14
    • 2020-09-27
    • 2017-10-09
    • 2021-11-25
    相关资源
    最近更新 更多