Я создаю службу, которая должна отправлять события всем подписавшимся потребителям способом Pub / Sub, например. отправить одно событие на всем подключенным в данный момент клиентам .
Для этого я использую Protobuf со следующим прототипом:
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
на сервере, поэтому я хочу, чтобы этот поток был долгоживущим , чтобыиметь возможность отправлять сообщения позже.