Cómo diseñar el patrón de publicación-suscripción adecuadamente en GRPC?

Dmitry Zagorulkin:

Estoy tratando de poner en práctica subpatrón pub usando GRPC pero yo estoy confundiendo un poco acerca de cómo hacerlo correctamente.

mi proto: rpc call (google.protobuf.Empty) returns (stream Data);

cliente:

asynStub.call(Empty.getDefaultInstance(), new StreamObserver<Data>() {
         @Override
         public void onNext(Data value) {
           // process a data

         @Override
         public void onError(Throwable t) {

         }

         @Override
         public void onCompleted() {

         }
       });

   } catch (StatusRuntimeException e) {
     LOG.warn("RPC failed: {}", e.getStatus());
   }

   Thread.currentThread().join();

servicio de servidor:

public class Sender extends DataServiceGrpc.DataServiceImplBase implements Runnable {
  private final BlockingQueue<Data> queue;
  private final static HashSet<StreamObserver<Data>> observers = new LinkedHashSet<>();

  public Sender(BlockingQueue<Data> queue) {
    this.queue = queue;
  }

  @Override
  public void data(Empty request, StreamObserver<Data> responseObserver) {
    observers.add(responseObserver);
  }

  @Override
  public void run() {
    while (!Thread.currentThread().isInterrupted()) {
      try {
        // waiting for first element
        Data data = queue.take();
        // send head element
        observers.forEach(o -> o.onNext(data));

      } catch (InterruptedException e) {
        LOG.error("error: ", e);
        Thread.currentThread().interrupt();
      }
    }
  }
}

Cómo eliminar clientes de observadores globales correctamente? Cómo recibido algún tipo de señal cuando cae la conexión?
¿Cómo manejar las reconexiones de cliente-servidor? Cómo forzar la reconexión del cliente cuando la conexión falla?

¡Gracias por adelantado!

Carl Mastrangelo:

En la ejecución de su servicio:

  @Override
  public void data(Empty request, StreamObserver<Data> responseObserver) {
    observers.add(responseObserver);
  }

Es necesario para obtener el contexto de la petición actual, y escuchar para la cancelación . Para una sola petición, llamadas de respuesta múltiple (también conocido como servidor de streaming) el código generado GRPC se simplifica a pasar en el la solicitud directamente. Esto significa que cont tienen acceso directo a la subyacente ServerCall.Listener, que es la forma que normalmente se escucha a los clientes de desconexión y cancelación.

En su lugar, cada llamada ha GRPC una Contextasociada a ella, lo que lleva a la cancelación y otras señales de petición con ámbito. Para su caso, sólo tiene que escuchar para la cancelación añadiendo su propio oyente, que luego se elimina de forma segura el observador respuesta real de la unidad de hash vinculado.


En cuanto a reconexiones: GRPC clientes se volverá a conectar automáticamente si se rompe la conexión, pero por lo general no van a volver a intentar la RPC a menos que sea seguro hacerlo. En el caso de la RPC servidor de streaming, normalmente no es seguro hacerlo, por lo que tendrá que volver a intentar la RPC en su cliente directamente.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=186494&siteId=1
Recomendado
Clasificación