为了账号安全,请及时绑定邮箱和手机立即绑定

如何在使用gRPC服务器流式处理的云运行中检测已取消/丢失/关闭的连接?

如何在使用gRPC服务器流式处理的云运行中检测已取消/丢失/关闭的连接?

Go
茅侃侃 2022-08-24 10:27:39
我有一个服务器端流媒体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()
查看完整描述

1 回答

?
慕村225694

TA贡献1880条经验 获得超4个赞

我需要在 Cloud Run 中启用 HTTP/2 连接才能正常工作。


查看完整回答
反对 回复 2022-08-24
  • 1 回答
  • 0 关注
  • 107 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信