Implementación de Streaming del Servidor con gRPC y Protobufs
Clase 15 de 22 • Curso de Go Avanzado: Protobuffers y gRPC
Resumen
¿Cómo implementar streaming del lado del servidor en gRPC con Protobuf?
El streaming del lado del servidor es una técnica poderosa en un entorno de programación asíncrono. Sobre todo, representa una forma eficiente de manejar grandes cantidades de datos o de proporcionar actualizaciones en tiempo real en sistemas distribuidos. En este contexto, vamos a trabajar con gRPC y Protobuf para construir los prototipos necesarios y configurar los servicios.
¿Cómo definimos los mensajes en Protobuf?
Vamos a comenzar definiendo mensajes Protobuf necesarios para nuestra aplicación. Estos mensajes son fundamentales en la comunicación entre cliente y servidor.
Mensajes de solicitud y respuesta
-
EnrollmentRequest: Se utiliza para matricular estudiantes en un examen específico. Los campos necesarios son:
student_id
: ID del estudiante.test_id
: ID del examen.
-
GetStudentsPerTestRequest: Utilizado por el cliente para solicitar los estudiantes inscritos en un examen. El servidor responde con una transmisión de estudiantes:
test_id
: ID del examen solicitado.
¿Cómo crear servicios con streaming en gRPC?
A continuación, definimos los servicios en nuestro archivo Protobuf. Aquí nos centramos en dos funciones RPC.
Servicios RPC
-
EnrollStudents: Permite al cliente enviar un flujo de solicitudes de inscripción que el servidor procesa.
- Recibe un stream de
EnrollmentRequest
. - Responde con un mensaje de aceptación simple, reutilizando estructuras existentes como
SetQuestionResponse
.
- Recibe un stream de
-
GetStudentsPerTest: El servidor responde con un flujo continuo de estudiantes inscritos en un examen.
- Recibe una
GetStudentsPerTestRequest
. - Devuelve un stream de
Student
.
- Recibe una
¿Cómo importar archivos Protobuf externos?
Uno de los grandes beneficios de los Protobuf es la capacidad de importar y reutilizar definiciones existentes. Para esta implementación:
- Importamos el archivo
student.proto
de otro módulo. - Nos aseguramos de que nuestras definiciones de Go estén actualizadas para manejar estas importaciones.
¿Cómo compilar y generar el código para gRPC?
Luego de hacer las modificaciones en el archivo Protobuf, es necesario compilar los paquetes para que gRPC y Protobuf generen los códigos necesarios de servicio y cliente. Asegúrate de mantener el comando de compilación a mano para:
protoc --go_out=. --go-grpc_out=. path/to/your/file.proto
¿Cómo configurar la base de datos para manejar enrollments?
Para gestionar las inscripciones en nuestra base de datos, crearemos una nueva tabla denominada enrollments
:
- Se compone de
student_id
ytest_id
. - Añadimos claves foráneas para garantizar la integridad referencial con las tablas de estudiantes y exámenes.
¿Cómo adaptar el modelo de datos en Go?
A continuación, creamos una estructura de modelo:
type Enrollment struct {
StudentID string
TestID string
}
¿Cómo implementar los métodos en el repositorio de Postgres?
Implementación de las funciones para obtener inscripciones y estudiantes dentro de nuestro repositorio:
- SetEnrollment: Recibe un contexto y un objeto
Enrollment
para almacenar los datos en la tablaenrollments
. - GetStudentsPerTest: Retorna un conjunto de estudiantes inscritos usando un identificador de examen, gracias a la siguiente query SQL:
SELECT id, name, age FROM students
WHERE id IN (
SELECT student_id FROM enrollments WHERE test_id = ?
)
Buenas prácticas al utilizar Protobuf y gRPC
- Modularidad: Importar archivos Protobuf externos para optimizar y mantener la eficacia del código.
- Consistencia: Reutilizar mensajes y estructuras existentes cuando sea posible para reducir la redundancia.
- Mantenimiento: Mantener comandos y archivos actualizados una vez hechas modificaciones significativas.
La creación e implementación de estos servicios y mensajería en streaming son herramientas esenciales para sistemas escalables y fiables. ¡Adelante, sigue aprendiendo y experimentando! Cada clase te proporciona nuevas habilidades para perfeccionar tus conocimientos en programación de servicios.