【发布时间】:2017-09-23 02:41:36
【问题描述】:
我想知道将数据从 gRPC 服务器推送到客户端是否是个好主意。基本上我想在 gRPC 中使用 pub/sub 模式。 我这样做的方式是在我从不关闭的服务器实现上返回一个响应流。然后,客户端有一个永无止境的 goroutine 负责读取这个流。
这是一个例子:
service Service {
rpc RegularChanges (Void) returns (stream Change) {}
}
在服务器端:
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
}
在客户端:
for {
change, err := streamChanges.Recv()
if err != nil {
log.Fatalf("Error retrieving change")
} else {
log.Println(change)
}
}
我刚开始使用 go 和 gRPC,但我知道它基于 HTTP2,因此它应该支持推送数据。但是,我不确定这是否应该使用 gRPC。
【问题讨论】: