Les appels en streaming permettent des schémas d'interaction plus complexes que les simples requêtes/réponses, car ils autorisent l'envoi ou la réception de plusieurs messages sur une seule connexion.
Les bibliothèques clientes Cloud pour Java sont compatibles avec trois types d'appels en streaming :
- Streaming côté serveur : le serveur vous renvoie un flux de réponses.
- Streaming côté client : vous envoyez un flux de requêtes au serveur.
- Streaming bidirectionnel : vous pouvez envoyer un flux de requêtes au serveur, et le serveur peut vous renvoyer un flux de réponses.
Les implémentations de streaming sont basées sur les implémentations gRPC-Java pour le streaming côté serveur, côté client et bidirectionnel.
Compatibilité du streaming sur différents transports
Le streaming est entièrement compatible avec gRPC, mais seulement partiellement avec HttpJson. Consultez le tableau suivant pour connaître la compatibilité du streaming.
| Type de streaming | gRPC | HttpJson |
|---|---|---|
| Streaming côté serveur | Compatible | Compatible |
| Streaming côté client | Compatible | Non compatible |
| Streaming bidirectionnel | Compatible | Non compatible |
Les appels unaires (non en streaming) sont compatibles avec gRPC et HttpJson.
Déterminer le type de streaming
Pour déterminer le type de streaming de l'appel, vérifiez le type Callable renvoyé :
ServerStreamingCallable: streaming côté serveur.ClientStreamingCallable: streaming côté client.BidiStreamingCallable: streaming bidirectionnel.
Par exemple, avec Java-Aiplatform et Java-Speech :
// Server Streaming
ServerStreamingCallable<ReadTensorboardBlobDataRequest, ReadTensorboardBlobDataResponse> callable = aiplatformClient.readTensorboardBlobDataCallable();
// Bidirectional Streaming
BidiStreamingCallable<StreamingRecognizeRequest, StreamingRecognizeResponse> callable = speechClient.streamingRecognizeCallable();
Effectuer des appels en streaming
La procédure pour effectuer un appel en streaming diffère selon que vous utilisez le streaming côté serveur ou le streaming bidirectionnel.
Streaming côté serveur
Le streaming côté serveur ne nécessite aucune implémentation supplémentaire. La classe ServerStream vous permet d'itérer le flux de réponses. En utilisant Java-Maps-Routing comme exemple, voici comment appeler 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
}
}
Dans cet exemple, le client envoie une seule ComputeRouteMatrixRequest et reçoit un flux de réponses.
Streaming bidirectionnel
Le streaming bidirectionnel nécessite une implémentation supplémentaire pour effectuer l'appel. En utilisant Java-Speech comme exemple, les étapes suivantes fournissent un exemple d'implémentation pour effectuer un appel en streaming bidirectionnel.
Commencez par implémenter l'interface ResponseObserver en utilisant le code suivant comme guide :
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;
}
}
Ensuite, procédez comme suit :
Créez une instance de l'observateur :
BidiResponseObserver<StreamingRecognizeResponse> responseObserver = new BidiResponseObserver<>();Transmettez l'observateur à l'appelable :
ClientStream<EchoRequest> clientStream = speechClient.streamingRecognizeCallable().splitCall(responseObserver);Envoyez les requêtes au serveur et fermez le flux une fois l'opération terminée :
clientStream.send(StreamingRecognizeRequest.newBuilder().build()); clientStream.send(StreamingRecognizeRequest.newBuilder().build()); // ... other requests ... clientStream.send(StreamingRecognizeRequest.newBuilder().build()); clientStream.closeSend();Parcourez les réponses :
List<StreamingRecognizeResponse> responses = responseObserver.getFuture().get(); for (StreamingRecognizeResponse response : responses) { // Do something with response }
Erreurs de streaming non compatibles
Pour les bibliothèques clientes compatibles avec les transports gRPC et HTTP/JSON, il est possible de configurer accidentellement la bibliothèque cliente pour qu'elle appelle un appel en streaming non compatible. Par exemple, la configuration suivante montre le client HttpJson de Java-Speech effectuant un appel en streaming bidirectionnel :
// 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();
...
}
Cela n'entraîne pas d'erreur de compilation, mais s'affiche comme une erreur d'exécution :
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.