我有一个服务器端流媒体RPC托管在Google Cloud Run上。
具有以下原型定义:
syntax = "proto3";
package test.v1;
service MyService {
// Subscribe to a stream of events.
rpc Subscribe (SubscribeRequest) returns (stream SubscribeResponse) {}
}
message SubscribeRequest {
}
message SubscribeResponse {
}
使用BloomRPC /grpcurl,当我停止该方法时,我得到一个事件,我可以用来优雅地停止某些任务。以下是 Suscribe 方法的一个示例:stream.Context().Done()
func (s *myService) Subscribe(req *pb.SubscribeRequest, stream pb.Instruments_SubscribeServer) error {
// Create a channel for this client.
ch := make(chan *pb.SubscribeResponse)
// Add the channel object 'ch' to a Global list of channels where we have a 'broadcaster' sending
// messages to all connected clients.
// TODO: pass to broadcaster client list.
for {
select {
case <-stream.Context().Done():
close(ch)
fmt.Println("Removed client from global list of channels")
return nil
case res := <-ch:
_ = stream.Send(res)
}
}
}
在客户端,当我在本地测试服务(即在Golang中运行本地gRPC服务器)时,使用BloomRPC / grpcurl,每当我停止BloomRPC / grpcurl连接时,我都会在通道上收到一条消息。这是预期的行为。stream.Context().Done()
但是,以相同的方式(通过BloomRPC / grpcurl)在Cloud Run上运行完全相同的代码,我没有收到消息 - 为什么这在Google Cloud Run上会有所不同?查看 Cloud Run 日志,对 Subscribe 方法的调用基本上会“挂起”,直到请求达到其超时。stream.Context().Done()
慕村225694
相关分类