【发布时间】:2019-10-29 20:09:19
【问题描述】:
我正在构建需要以 Pub/Sub 方式向所有订阅的消费者发送事件的服务,例如。向所有当前连接的客户端发送一个事件。
我为此使用 Protobuf,并带有以下 proto 定义:
service EventsService {
rpc ListenForEvents (AgentProcess) returns (stream Event) {}
}
服务器和客户端都是用 Go 编写的。
我的问题是,当客户端启动连接时,流它不是长期存在的,例如。当服务器从ListenForEvents 方法返回时:
func (e EventsService) ListenForEvents(process *pb.AgentProcess, listener pb.EventsService_ListenForEventsServer) error {
//persist listener here so it can be used later when backend needs to send some messages to client
return nil
}
然后客户端几乎立即收到EOF 错误,这意味着服务器可能关闭了连接。
我该怎么做才能让客户端长时间订阅服务器? 主要问题是当客户端调用服务器上的ListenForEvents 方法时我可能没有任何东西可以发送给客户端,这就是为什么我希望这个流长期存在 以后可以发送消息。
【问题讨论】: