Streaming de datos
El streaming de datos reenvía eventos de Joryio a destinos externos casi en tiempo real. Cada flujo vincula un destino a un conjunto de eventos y Joryio entrega por lotes los eventos que coinciden con esa selección.
Ve a Datos → Streaming de datos para gestionar los flujos.
Destinos
| Destino | Tipo | Función |
|---|---|---|
| Webhook | Endpoint HTTP | Envía cada evento como JSON mediante POST a cualquier URL HTTPS |
| Snowflake | Almacén de datos | Carga eventos continuamente en una tabla de Snowflake |
| BigQuery | Almacén de datos | Transmite eventos a un conjunto de datos de BigQuery |
| Amazon Redshift | Almacén de datos | Carga eventos en un clúster de Amazon Redshift |
| Amazon S3 | Almacenamiento de objetos | Escribe archivos JSON / NDJSON por lotes en un bucket |
| Kafka | Flujo de eventos | Publica eventos en un tema de Kafka |
| Mixpanel | Analítica de producto | Reenvía eventos a un proyecto de Mixpanel |
| Amplitude | Analítica de producto | Reenvía eventos a un proyecto de Amplitude |
Campos de conexión
Cada destino solicita sus propios datos de conexión. Los secretos - contraseñas, claves, tokens y JSON de cuentas de servicio - se cifran cuando se almacenan.
- Webhook: URL, secreto de firma (opcional), encabezados adicionales (opcional).
- Snowflake: cuenta, usuario, contraseña, rol, almacén, base de datos, esquema y tabla.
- BigQuery: ID de proyecto, ID de conjunto de datos, ID de tabla y JSON de cuenta de servicio.
- Amazon Redshift: host, puerto, base de datos, usuario, contraseña, esquema y tabla.
- Amazon S3: bucket, prefijo, región, endpoint (opcional, para almacenamiento compatible con S3), ID de clave de acceso y clave de acceso secreta.
- Kafka: brokers, tema, usuario/contraseña SASL y SSL.
- Mixpanel: token de proyecto y región (EE. UU. / UE / India).
- Amplitude: clave API y región (EE. UU. / UE).
Crear un flujo
- Ve a Datos → Streaming de datos y haz clic en Crear flujo.
- Asigna un nombre al flujo - se mostrará en la lista - y elige un destino.
- Completa los campos de conexión del destino.
- Elige el formato de carga útil: JSON (un objeto por evento) o NDJSON (una línea por evento).
- Selecciona los eventos que quieres transmitir (ver abajo).
- Revisa la barra de resumen y haz clic en Crear flujo.
Elegir eventos
Tú controlas exactamente qué eventos recibe cada flujo:
- Todos los eventos: actívalo para transmitir todos los eventos actuales y futuros. Desactívalo para elegir eventos concretos.
- Por grupo: los eventos integrados están agrupados: Mensajería, In-app, Recorridos, Campañas, Comercio electrónico e Identidad. Marca un grupo completo o eventos individuales.
- Eventos personalizados: en Evento personalizado, busca o escribe tus propios eventos registrados - los que envías con
track(), comopurchaseopage_view- . El selector muestra los eventos que tu espacio de trabajo ya ha registrado; también puedes escribir uno que aún no esté registrado y hacer clic en Añadir.
Catálogo de eventos
Estos son los eventos integrados que puedes transmitir. También puedes transmitir cualquier evento personalizado que envíes con track().
| Grupo | Eventos |
|---|---|
| Mensajería | message.sent, message.delivered, message.opened, message.clicked, message.failed, message.bounced, message.complained, message.spamreport, message.deferred, message.unsubscribed, message.queued, message.skipped |
| Respuestas entrantes | sms.message.received, whatsapp.message.received |
| In-app | in_app.displayed, in_app.clicked, in_app.dismissed, in_app.converted |
| Recorridos | canvas.experiment.entered, canvas.ai_decision.entered |
| Campañas | campaign.sent, campaign.abtest.winner_declared, campaign.ai_decision.entered |
| Comercio electrónico | Order Completed |
| Identidad | $identify, $alias |
No existen nombres de eventos por canal, como email.delivered o sms.delivered. Cada envío de Email, SMS, Push, WhatsApp y Webhook emite los mismos eventos message.*, y cada carga útil contiene la propiedad channel: email, sms, push, whatsapp o webhook. Suscríbete una sola vez a message.delivered para recibir entregas de todos los canales y filtra después por la propiedad channel.
Restringir canales en la configuración del flujo (opcional): al seleccionar un evento message.*, aparece un filtro por canal en el formulario de creación o edición. Marca email, sms, push, whatsapp o webhook para transmitir únicamente esos canales, en vez de filtrar después. Déjalo vacío para incluir todos los canales, que es el valor predeterminado. Esto solo afecta a eventos que incluyen la propiedad channel; los eventos sin canal, como canvas.* u Order Completed, no cambian.
Procesamiento por lotes
Los eventos se almacenan temporalmente y se entregan por lotes. Puedes definir:
- Tamaño del lote: cuántos eventos se acumulan antes de enviarlo.
- Intervalo de vaciado: el tiempo máximo que se espera antes de enviar un lote parcial.
Un lote se entrega al alcanzar su tamaño configurado o cuando transcurre el intervalo de vaciado, lo que ocurra primero.
Cómo funciona
Los eventos llegan a los flujos mediante un bus de distribución duradero, independiente del almacenamiento de analítica. Cada flujo ve el flujo completo de eventos de todos los canales; por tanto, un destino sigue recibiendo eventos sin depender de cómo se escriba la analítica.
Cuando un evento coincide con la selección de un flujo, se pone en cola y se entrega al destino en el siguiente lote. Cada entrega incluye el nombre del evento, las propiedades, la marca de tiempo y el identificador de usuario; en los eventos de mensajería, también el channel de origen. Los almacenes y destinos de almacenamiento cargan el lote como filas o archivos; los destinos de analítica de producto reenvían cada evento mediante su API de ingesta; los webhooks reciben un cuerpo JSON o NDJSON.
Cada flujo agrupa eventos según el tamaño de lote y el intervalo de vaciado, y reintenta los envíos fallidos. Si un destino no está disponible, los eventos sin entregar vuelven a la cola y se reenvían cuando se recupera, para que una interrupción no provoque pérdida de datos.
Garantías de entrega y duplicados
La entrega es al menos una vez (at-least-once). En casos poco frecuentes - un reintento tras un fallo de red, o el reinicio de un proceso a mitad de un lote - el mismo evento puede entregarse a tu destino más de una vez.
Es algo deliberado, y es la misma garantía que ofrece cualquier plataforma de streaming. La alternativa, como mucho una vez, significaría descartar un evento en silencio cuando el resultado de la entrega es desconocido; preferimos enviarlo dos veces a perderlo.
Cada evento lleva un eventId estable. Es el mismo valor en cada entrega de ese evento, así que puedes usarlo para eliminar duplicados:
| Destino | Qué hacemos |
|---|---|
| Amplitude | se envía como insert_id - Amplitude elimina duplicados automáticamente |
| Mixpanel | se envía como $insert_id - Mixpanel elimina duplicados automáticamente |
| S3 | un lote reenviado se escribe en la misma clave de objeto, sobrescribiendo en lugar de añadir un segundo archivo |
| BigQuery, Snowflake, Redshift | elimina duplicados por eventId al cargar, p. ej. ROW_NUMBER() OVER (PARTITION BY eventId) |
| Webhook | ignora un eventId que ya hayas procesado |
Para almacenes de datos y almacenamiento, los duplicados son inofensivos si los eliminas al cargar. Para webhooks que actúan sobre cada evento - crear un ticket, cobrar algo - comprueba el eventId antes de actuar.
Supervisión
La lista de flujos muestra los KPI y el estado de cada flujo:
- Activo: entrega con normalidad.
- En pausa: detenido temporalmente; puedes reanudarlo cuando quieras.
- Error: las entregas recientes están fallando; revisa la conexión.
También puedes ver el total entregado, el total fallido, la tasa de entrega y la hora de la última entrega. Abre un flujo para ver sus detalles, editarlo, pausarlo, reanudarlo o eliminarlo.