【发布时间】:2018-08-20 04:41:20
【问题描述】:
是否可以只从 gRPC 服务器流式传输到某些客户端?
我相信我正在寻找类似于 Pusher 的东西,您可以在其中为客户提供一个频道,并且您可以发布只有有权访问该频道的客户才能看到的消息。
我正在努力理解我们需要采取哪些步骤来做这样的事情。
考虑 web-sockets 我相信我们可以存储每个客户端连接,然后我们可以找到该连接并发送消息。我们如何使用gRPC 做类似的事情?
【问题讨论】:
是否可以只从 gRPC 服务器流式传输到某些客户端?
我相信我正在寻找类似于 Pusher 的东西,您可以在其中为客户提供一个频道,并且您可以发布只有有权访问该频道的客户才能看到的消息。
我正在努力理解我们需要采取哪些步骤来做这样的事情。
考虑 web-sockets 我相信我们可以存储每个客户端连接,然后我们可以找到该连接并发送消息。我们如何使用gRPC 做类似的事情?
【问题讨论】:
据我了解这个问题。您希望将消息发送到 gRPC 中的特定客户端。在 gRPC 中使用 Server side streaming 或 Bi-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 中,这样它就可以异步接收来自服务器的消息,而客户端可以在主线程中做其他事情。