使用gRPC推送数据是否可以?

Mom*_*ain 5 go grpc

我想知道将数据从gRPC服务器推送到客户端是否是一个好主意.基本上我想使用gRPC的pub/sub模式.我这样做的方法是在服务器实现上返回一个我从未关闭的响应流.然后,客户端有一个永无止境的例程负责读取此流.

这是一个例子:

service Service {
    rpc RegularChanges (Void) returns (stream Change) {}
}
Run Code Online (Sandbox Code Playgroud)

在服务器端:

func (self *MyServiceImpl) RegularChanges(in *pb.Void, stream pb.Service_RegularChangesServer) error {

    for {
        d, err := time.ParseDuration("1s")
        if err != nil {
            log.Fatalf("Cannot parse duration")
            break;
        }
        time.Sleep(d)
        stream.Send(&pb.Change{Name:"toto", Description:"status changed"})
    }
    return nil
}
Run Code Online (Sandbox Code Playgroud)

在客户端:

for {
        change, err := streamChanges.Recv()
        if err != nil {
            log.Fatalf("Error retrieving change")
        } else {
            log.Println(change)
        }
}
Run Code Online (Sandbox Code Playgroud)

我刚开始使用go和gRPC,但我知道它基于HTTP2,因此它应该支持推送数据.但是,我不确定这是否应该使用gRPC.

Eri*_*son 8

gRPC旨在以这种方式使用.

您仍应考虑客户端应如何处理故障以及您希望如何在后端之间重新平衡.如果您的连接是通过Internet进行的,您可能还希望通过向客户端和服务器提供KeepaliveParams来启用keepalive来检测连接中断.