Le chiamate in streaming consentono pattern di interazione più complessi rispetto alla semplice richiesta/risposta, consentendo l'invio o la ricezione di più messaggi tramite una singola connessione.
Le librerie client di Cloud per Java supportano tre tipi di chiamate di streaming:
- Streaming lato server:il server ti invia un flusso di risposte.
- Streaming client:invii un flusso di richieste al server.
- Streaming bidirezionale: puoi inviare un flusso di richieste al server e il server può inviarti un flusso di risposte.
Le implementazioni di streaming sono modellate in base alle implementazioni gRPC-Java per lo streaming server, client e bidirezionale.
Supporto dello streaming su tutti i trasporti
Lo streaming è completamente supportato quando utilizzi gRPC, ma solo parzialmente per
HttpJson. Per informazioni sul supporto dello streaming, consulta la tabella seguente.
| Tipo di streaming | gRPC | HttpJson |
|---|---|---|
| Server Streaming | Supportato | Supportato |
| Streaming client | Supportato | Non supportata |
| Streaming bidirezionale | Supportato | Non supportata |
Le chiamate unarie (non in streaming) sono supportate sia per gRPC che per HttpJson.
Determinare il tipo di streaming
Per determinare il tipo di streaming della chiamata, controlla il tipo Callable restituito:
ServerStreamingCallable: streaming dal server.ClientStreamingCallable: streaming client.BidiStreamingCallable: streaming bidirezionale.
Ad esempio, utilizzando Java-Aiplatform e Java-Speech:
// Server Streaming
ServerStreamingCallable<ReadTensorboardBlobDataRequest, ReadTensorboardBlobDataResponse> callable = aiplatformClient.readTensorboardBlobDataCallable();
// Bidirectional Streaming
BidiStreamingCallable<StreamingRecognizeRequest, StreamingRecognizeResponse> callable = speechClient.streamingRecognizeCallable();
Effettuare chiamate in streaming
L'effettuazione di una chiamata di streaming varia a seconda che tu stia utilizzando lo streaming lato server o lo streaming bidirezionale.
Streaming lato server
Lo streaming lato server non richiede un'implementazione aggiuntiva. La classe ServerStream
consente di iterare il flusso di risposte. Utilizzando Java-Maps-Routing come esempio, di seguito viene mostrato come chiamare l'API Server Streaming:
try (RoutesClient routesClient = RoutesClient.create()) {
ServerStreamingCallable<ComputeRouteMatrixRequest, RouteMatrixElement> computeRouteMatrix =
routesClient.computeRouteMatrixCallable();
ServerStream<RouteMatrixElement> stream = computeRouteMatrix.call(
ComputeRouteMatrixRequest.newBuilder().build());
for (RouteMatrixElement element : stream) {
// Do something with response
}
}
In questo esempio, il client invia un singolo ComputeRouteMatrixRequest e riceve un flusso di risposte.
Streaming bidirezionale
Lo streaming bidirezionale richiede un'implementazione aggiuntiva per effettuare la chiamata. Utilizzando Java-Speech come esempio, i seguenti passaggi forniscono un'implementazione di esempio per effettuare una chiamata di streaming bidirezionale.
Innanzitutto, implementa l'interfaccia ResponseObserver utilizzando il seguente codice come
linea guida:
class BidiResponseObserver<T> implements ResponseObserver<T> {
private final List<T> responses = new ArrayList<>();
private final SettableApiFuture<List<T>> future = SettableApiFuture.create();
@Override
public void onStart(StreamController controller) {
// no-op
}
@Override
public void onResponse(T response) {
responses.add(response);
}
@Override
public void onError(Throwable t) {
future.setException(t);
}
@Override
public void onComplete() {
future.set(responses);
}
public SettableApiFuture<List<T>> getFuture() {
return future;
}
}
A tale scopo, procedi nel seguente modo:
- Crea un'istanza dell'osservatore:
java BidiResponseObserver<StreamingRecognizeResponse> responseObserver = new BidiResponseObserver<>(); - Passa l'observer al callable:
java ClientStream<EchoRequest> clientStream = speechClient.streamingRecognizeCallable().splitCall(responseObserver); - Invia le richieste al server e chiudi lo stream al termine:
java clientStream.send(StreamingRecognizeRequest.newBuilder().build()); clientStream.send(StreamingRecognizeRequest.newBuilder().build()); // ... other requests ... clientStream.send(StreamingRecognizeRequest.newBuilder().build()); clientStream.closeSend(); Itera le risposte: ```java List
responses = responseObserver.getFuture().get(); for (StreamingRecognizeResponse response : responses) { // Do something with response } ```
Errori di streaming non supportati
Per le librerie client che supportano sia i trasporti gRPC che HTTP/JSON, è possibile configurare accidentalmente la libreria client per richiamare una chiamata di streaming non supportata. Ad esempio, la seguente configurazione mostra
il client HttpJson di Java-Speech che effettua una chiamata di streaming bidirezionale:
// SpeechClient is configured to use HttpJson
try (SpeechClient speechClient = SpeechClient.create(SpeechSettings.newHttpJsonBuilder().build())) {
// Bidi Callable is not supported in HttpJson
BidiStreamingCallable<StreamingRecognizeRequest, StreamingRecognizeResponse> callable = speechClient.streamingRecognizeCallable();
...
}
Ciò non comporta un errore di compilazione, ma viene visualizzato come errore di runtime:
Not implemented: streamingRecognizeCallable(). REST transport is not implemented for this method yet.
Important: The client library MUST be configured with gRPC to use client or bidirectional streaming.