gRPC – Cómo funciona II
Introducción
En esta entrada, veremos por un lado los diferentes tipos de datos que tenemos en gRPC y su equivalencia a C# en el caso de programación con ASP.NET Core 3, y por otro lado, los diferentes tipos de servicios que tenemos a la hora de trabajar con gRPC.
C# Types vs .proto Types
La mejor forma de ver la equivalencia de tipos entre los aceptados por protobuf y los equivalentes (en este caso) en C# es verlo en la siguiente tabla:
C# Type | .proto Type |
double | double |
float | float |
int | int32 sint32 sfixed32 |
long | int64 sint64 sfixed64 |
uint | uint32 fixed32 |
ulong | uint64 fixed64 |
bool | bool |
string | string |
ByteString | bytes |
En esta tabla, vemos cada tipo de C# y su equivalente natural en un fichero protobuf (.proto).
Para ver las equivalencias en otros lenguajes de programación, te invito a visitar la página web oficial de Google al respecto en este enlace.
Tipos de servicios
A la hora de trabajar con gRPC, debemos tener en cuenta que existen diferentes tipos de servicios, cada uno de los cuales se ajustará a nuestras necesidades.
En nosotros está entender todos ellos primero, para poder elegir el que queramos utilizar después.
Dentro de gRPC existen 4 tipos de servicios.
Unary RPCs o Request Response
Es el que más conocemos de HTTP/1.x.
El cliente envía al servidor una petición simple.
El cliente recibe desde el servidor una respuesta simple.
Un ejemplo de Unary RPC en protobuf sería:
rpc Unary(MyRequest) returns (MyResponse);
Server Streaming RPCs o Server-to-Client Streaming
El cliente envía una petición al servidor.
El servidor enviará datos constantes y continuados (streams) al cliente.
El cliente lee los streams devueltos por el servidor hasta que no tiene más mensajes.
gRPC garantiza en este caso el orden de los mensajes dentro de la petición.
Un ejemplo de Server Streaming RPC en protobuf sería:
rpc ServerStreaming(MyRequest) returns (stream MyResponse);
Client Streaming RPCs o Client-to-Server Streaming
El cliente escribe una secuencia de mensajes que envía al servidor por stream.
El servidor leerá toda la secuencia de mensajes según le van llegando.
Una vez que el cliente envía todos los mensajes, espera la respuesta del servidor.
gRPC garantiza también en este caso el orden de los mensajes dentro de la petición.
Un ejemplo de Client Streaming RPC en protobuf sería:
rpc ClientStreaming(stream MyRequest) returns (MyResponse);
Bidirectional Streaming RPCs
Los dos extremos envían una secuencia de mensajes con un stream de lectura/escritura.
Los streams aquí, operan de forma independiente.
Cliente y Servidor pueden leer y escribir en cualquier orden.
Un ejemplo de Bidirectional Streaming RPC en protobuf sería:
rpc BidirectionalStreaming(stream MyRequest) returns (stream MyResponse);
Como podemos apreciar, hay una palabra clave utilizada en la definición del servicio (stream) que nos permitirá indicar si es Streaming o no, ya sea en la request como en la response o en ambos casos.
El propio Framework de gRPC nos ayudará a tratar esos streams, lo cual nos facilita mucho la vida.
Status Codes o Error Handling
Los Status Codes para el manejo de errores y respuestas correctas se reducen en gRPC a 17 tipos de Status Codes.
Estos, son los que se indican a continuación:
0 | OK | 200 OK |
1 | CANCELED | 499 Client Closed Request |
2 | UNKNOWN | 500 Internet Server Error |
3 | INVALID_ARGUMENT | 400 Bad Request |
4 | DEADLINE_EXCEEDED | 504 Gateway Timeout |
5 | NOT_FOUND | 404 Not Found |
6 | ALREADY_EXISTS | 409 Conflict |
7 | PERMISSION_DENIED | 403 Forbidden |
8 | RESOURCE_EXHAUSTED | 429 Too Many Requests |
9 | FAILED_PRECONDITION | 400 Bad Request |
10 | ABORTED | 409 Conflict |
11 | OUT_OF_RANGE | 400 Bad Request |
12 | UNIMPLEMENTED | 501 Not Implemented |
13 | INTERNAL | 500 Internal Server Error |
14 | UNAVAILABLE | 503 Service Unavailable |
15 | DATA_LOSS | 500 Internet Server Error |
16 | UNAUTHENTICATED | 401 Unauthorized |
Cada uno de estos tipos de respuesta está definido a un caso concreto.
Cada uno de estos tipos de respuesta tiene también un numeral concreto indicado en la tabla (como si fuera un enumerado en .NET).
La gestión de errores puede llegar a ser bastante tediosa tanto a nivel de cliente como de servidor.
Si quieres acceder a la información sobre Status Codes, podrás hacerlo en este enlace.
Para acceder a los Status Codes de C# podrás hacerlo directamente en este enlace.
Happy Coding!