As chamadas de streaming permitem padrões de interação mais complexos do que simples solicitações/respostas, permitindo que várias mensagens sejam enviadas ou recebidas em uma única conexão.
As bibliotecas de cliente do Cloud para Java são compatíveis com três tipos de chamadas de streaming:
- Streaming do servidor:o servidor envia um stream de respostas para você.
- Streaming do cliente:você envia um stream de solicitações ao servidor.
- Streaming bidirecional:você pode enviar um stream de solicitações ao servidor, e ele pode enviar um stream de respostas para você.
As implementações de streaming são modeladas de acordo com as implementações gRPC-Java para streaming de servidor, cliente e bidirecional.
Suporte a streaming em todos os transportes
O streaming é totalmente compatível com o gRPC, mas apenas parcialmente com
HttpJson. Consulte a tabela a seguir para saber mais sobre a compatibilidade com streaming.
| Tipo de transmissão | gRPC | HttpJson |
|---|---|---|
| Streaming do servidor | Compatível | Compatível |
| Transmissão ao vivo do cliente | Compatível | Incompatível |
| Streaming bidirecional | Compatível | Incompatível |
As chamadas unárias (sem streaming) são compatíveis com gRPC e HttpJson.
Como determinar o tipo de streaming
Para determinar o tipo de streaming da chamada, verifique o tipo Callable retornado:
ServerStreamingCallable:streaming do servidor.ClientStreamingCallable:streaming do cliente.BidiStreamingCallable:streaming bidirecional.
Por exemplo, usando Java-Aiplatform e Java-Speech:
// Server Streaming
ServerStreamingCallable<ReadTensorboardBlobDataRequest, ReadTensorboardBlobDataResponse> callable = aiplatformClient.readTensorboardBlobDataCallable();
// Bidirectional Streaming
BidiStreamingCallable<StreamingRecognizeRequest, StreamingRecognizeResponse> callable = speechClient.streamingRecognizeCallable();
Como fazer chamadas de streaming
Fazer uma chamada de streaming varia dependendo se você está usando streaming do servidor ou bidirecional.
Streaming do servidor
O streaming do servidor não exige implementação adicional. A classe ServerStream permite iterar o fluxo de respostas. Usando Java-Maps-Routing como exemplo, veja a seguir como chamar a 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
}
}
Neste exemplo, o cliente envia um único ComputeRouteMatrixRequest e
recebe um fluxo de respostas.
Streaming bidirecional
O streaming bidirecional exige uma implementação adicional para fazer a chamada. Usando o Java-Speech como exemplo, as etapas a seguir fornecem uma implementação de exemplo para fazer uma chamada de streaming bidirecional.
Primeiro, implemente a interface ResponseObserver usando o seguinte código como uma
diretriz:
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;
}
}
Em seguida, siga estas etapas:
- Crie uma instância do observador:
java BidiResponseObserver<StreamingRecognizeResponse> responseObserver = new BidiResponseObserver<>(); - Transmita o observador para o elemento chamável:
java ClientStream<EchoRequest> clientStream = speechClient.streamingRecognizeCallable().splitCall(responseObserver); - Envie as solicitações ao servidor e feche o stream quando terminar:
java clientStream.send(StreamingRecognizeRequest.newBuilder().build()); clientStream.send(StreamingRecognizeRequest.newBuilder().build()); // ... other requests ... clientStream.send(StreamingRecognizeRequest.newBuilder().build()); clientStream.closeSend(); Itere pelas respostas: ```java List
responses = responseObserver.getFuture().get(); for (StreamingRecognizeResponse response : responses) { // Do something with response } ```
Erros de streaming não compatíveis
Para bibliotecas de cliente que oferecem suporte a transportes gRPC e HTTP/JSON,
é possível configurar acidentalmente a biblioteca de cliente para invocar
uma chamada de streaming não compatível. Por exemplo, a configuração a seguir mostra
o cliente HttpJson do Java-Speech fazendo uma chamada de streaming bidirecional:
// 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();
...
}
Isso não resulta em um erro de compilação, mas aparece como um erro de execução:
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.