No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Aprovecha el precio especial y haz tu profesión a prueba de IA

Antes: $249

Currency
$209
Suscríbete

Termina en:

0 Días
6 Hrs
52 Min
16 Seg

Implementando streaming del lado del cliente

14/22
Recursos

¿Cómo implementar streaming del lado del cliente con gRPC?

El protocolo gRPC es conocido por su eficiencia y capacidad para manejar grandes cantidades de datos a través de un mecanismo llamado streaming. En esta guía, te mostraremos cómo implementar el streaming del lado del cliente, permitiendo enviar múltiples mensajes al servidor y recibir una sola respuesta. Este método de manejo de datos es especialmente útil en aplicaciones donde el cliente necesita enviar grandes lotes de información y obtener una respuesta consolidada.

¿Cómo crear un mensaje y método RPC para streaming del cliente?

Primero, debemos definir un nuevo mensaje en nuestro archivo proto. Este mensaje, llamado question, contará con varios campos esenciales:

  1. ID de pregunta: Identificará cada pregunta individualmente.
  2. Pregunta y respuesta: Ambos serán campos de tipo varchar, permitiendo almacenar hasta 255 caracteres.
  3. ID de test: Asocia la pregunta a un conjunto de pruebas específico.

A continuación, definimos otro mensaje que servirá como respuesta del servidor:

  • Respuesta del servidor: Un simple indicador booleano que confirma el éxito del procesamiento, señalado por un OK.

Finalmente, declaramos nuestro nuevo método RPC llamado setQuestions. Utilizamos la palabra clave stream para indicar que el cliente enviará un flujo de preguntas al servidor, el cual responderá con un único setQuestionsResponse.

¿Cómo compilar y actualizar el archivo proto?

Una vez definidos los mensajes, es clave compilar el archivo proto para actualizar los paquetes que se utilizarán en el código Go. Usaremos el comando protoc que resultará eficiente si lo tienes fácilmente accesible cada vez que desees ejecutarlo.

protoc --proto_path=PROTOS_PATH --go_out=OUT_PATH --go-grpc_out=OUT_PATH PROTOS_PATH/test.proto

¿Cómo crear la estructura de base de datos y modelos en Go?

Para insertar preguntas en la base de datos, debemos crear una tabla questions. Siguiendo estos pasos garantizarás que cada sesión vaya bien estructurada:

  1. Creación de la tabla: Asegúrate de que la tabla no exista antes de crearla.
  2. Definición de campos: Incluye id, testid, pregunta, y respuesta.
  3. Llave foránea: Esta conectará las preguntas a su respectivo test en la tabla de tests.

En el archivo models.go, crea un nuevo modelo question en Go, conteniendo los mismos campos que hemos definido en la tabla SQL. Asegúrate de implementar correctamente los nombres de las variables y cómo se representarán en JSON.

¿Cómo modificar el repositorio para almacenar preguntas?

Para almacenar preguntas en el repositorio, será necesario agregar el método setQuestion dentro del archivo repository.go. Este se encargará de recibir un contexto y un modelo de tipo question, devolviendo un error en caso de surgir algún problema.

La implementación concreta de setQuestion ocurre en el archivo postgres.go. Asegúrate de modificar la query SQL para adaptar la inserción a la nueva estructura de las preguntas.

const insertQuestionQuery = `INSERT INTO questions (id, testid, question, answer) VALUES ($1, $2, $3, $4)`

¿Cómo implementar el receptor en el servidor?

Para manejar el streaming desde el lado del cliente, implementamos una función receptora en el servidor. Esta función manejará conexiones de streaming indefinidas y seguirá recibiendo preguntas hasta que el cliente cierre la conexión.

El servidor usará el método Receive del stream para obtener mensajes desde el cliente. En caso de recibir un error del tipo endoffile, sabrá que ha terminado el flujo de datos y enviará una respuesta concluyendo la conexión.

¿Cómo probar la implementación con Postman?

Finalmente, ejecuta tu servidor y prueba los nuevos métodos utilizando Postman. Esto te permitirá enviar múltiples preguntas a través de streaming y confirmar que el servidor responde correctamente contrayendo la información en un solo mensaje.

  • Crear test: Envía un test para vincular tus preguntas.
  • Enviar preguntas: Usa el método setQuestions para enviar múltiples preguntas.
  • Finalizar conexión: Marca done para recibir una confirmación de parte del servidor.

Estos pasos ilustran cómo manejar eficientemente un flujo de datos desde el cliente utilizando gRPC. A través de una práctica implementación, podrás experimentar el poder del streaming y mejorar procesos en tus aplicaciones distribuidas. ¡Continúa aprendiendo y explorando el vasto mundo del desarrollo con gRPC!

Aportes 4

Preguntas 0

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Un pequeño script para compilar los proto files 😉

#! /bin/sh

if [ -z "$1" ]; then
    echo "Please specify the file name"
    exit 1
fi

protoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --go-grpc_opt=paths=source_relative $1

Lo guardas como buildProto.sh (o como lo quieras llamar jaja, pero .sh) y luego lo usas así:

./buildProto nombre_del_archivo

PD: Solo funciona para sistemas UNIX (Linux, MacOs), pero seguro que se puede hacer uno similar con Powershell para Windows.

PD2: Puede que al momento de crear el shell script el archivo no tenga los permisos de ejecución, en ese caso puedes cambiar los permisos con:

chmod 777 buildProto.sh

Espero les sirva :wave

Que belleza!

Esto esta hermoso

{ *// Use IntelliSense to learn about possible attributes.* *// Hover to view descriptions of existing attributes.* *// For more information, visit:* [*https://go.microsoft.com/fwlink/?linkid=830387*](https://go.microsoft.com/fwlink/?linkid=830387) "version": "0.2.0", "configurations": \[ { "name": "Launch", "type": "go", "request": "launch", "mode": "auto", "program": "${workspaceFolder}/test-server/main.go", *// "envFile": "${workspaceFolder}/.env",* "args": \[] } ]} ![](https://static.platzi.com/media/user_upload/Captura%20de%20pantalla%202024-07-15%20a%20la%28s%29%2014.18.15-c26e15cb-f1db-4218-8443-36a21f1b82c0.jpg)