【问题标题】:Is it OK to use gRPC to push data?使用 gRPC 推送数据可以吗?
【发布时间】: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。

【问题讨论】:

    标签: go grpc


    【解决方案1】:

    gRPC 旨在以这种方式使用。

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

    【讨论】:

    • 您是否有示例或示例实现的链接? :)
    猜你喜欢
    • 2011-03-03
    • 1970-01-01
    • 2021-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-14
    • 2010-11-18
    • 1970-01-01
    相关资源
    最近更新 更多