Частные каналы gRPC

Возможно ли передавать только определенные клиенты с сервера gRPC?

Я считаю, что то, что я ищу, похоже на Pusher, где у вас есть канал для клиента, и вы можете публиковать сообщения, которые могут видеть только клиент, имеющий доступ к этому каналу.

То, с чем я борюсь, - это понять, какие шаги нам нужно предпринять, чтобы сделать что-то подобное.

Думая о веб-сокетах, я считаю, что мы можем хранить каждое клиентское соединение, тогда мы можем найти это соединение и отправлять сообщения. Как мы можем сделать подобное с gRPC?

Ответы

Ответ 1

Как я понял вопрос. Вы хотите отправить сообщение конкретному клиенту в gRPC. Это очень возможно при использовании Server side streaming или Bi-directional потоковой передачи в gRPC.

Например:

Определение потоковой передачи на стороне сервера или биди потоковой передачи api

rpc ListFeatures(Rectangle) returns (stream Feature) {}

На стороне сервера:

func ListFeatures(rect *pb.Rectangle, stream pb.RouteGuide_ListFeaturesServer) error {
  // Save this stream instance in the server on a map or other suitable data structure
  // so that you can query for this stream instance later
  // This will act same like your websocket session
}

Когда вы хотите отправить что-то конкретному клиенту, тогда получите экземпляр потока и выполните

err := stream.Send(feature); // Any times as required

На клиенте он будет ожидать сообщений, подобных этому

stream, err := client.ListFeatures(ctx, rect)

for {
    feature, err := stream.Recv()
    ...
    // handle message here
}

То же самое можно сделать и для bidi streaming rpc. Надеюсь, это ответит на ваш вопрос