Saltar al contenido principal

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

DestinoTipoFunción
WebhookEndpoint HTTPEnvía cada evento como JSON mediante POST a cualquier URL HTTPS
SnowflakeAlmacén de datosCarga eventos continuamente en una tabla de Snowflake
BigQueryAlmacén de datosTransmite eventos a un conjunto de datos de BigQuery
Amazon RedshiftAlmacén de datosCarga eventos en un clúster de Amazon Redshift
Amazon S3Almacenamiento de objetosEscribe archivos JSON / NDJSON por lotes en un bucket
KafkaFlujo de eventosPublica eventos en un tema de Kafka
MixpanelAnalítica de productoReenvía eventos a un proyecto de Mixpanel
AmplitudeAnalítica de productoReenví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

  1. Ve a Datos → Streaming de datos y haz clic en Crear flujo.
  2. Asigna un nombre al flujo - se mostrará en la lista - y elige un destino.
  3. Completa los campos de conexión del destino.
  4. Elige el formato de carga útil: JSON (un objeto por evento) o NDJSON (una línea por evento).
  5. Selecciona los eventos que quieres transmitir (ver abajo).
  6. 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(), como purchase o page_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().

GrupoEventos
Mensajeríamessage.sent, message.delivered, message.opened, message.clicked, message.failed, message.bounced, message.complained, message.spamreport, message.deferred, message.unsubscribed, message.queued, message.skipped
Respuestas entrantessms.message.received, whatsapp.message.received
In-appin_app.displayed, in_app.clicked, in_app.dismissed, in_app.converted
Recorridoscanvas.experiment.entered, canvas.ai_decision.entered
Campañascampaign.sent, campaign.abtest.winner_declared, campaign.ai_decision.entered
Comercio electrónicoOrder Completed
Identidad$identify, $alias
Los eventos de mensajería no dependen del canal

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:

DestinoQué hacemos
Amplitudese envía como insert_id - Amplitude elimina duplicados automáticamente
Mixpanelse envía como $insert_id - Mixpanel elimina duplicados automáticamente
S3un lote reenviado se escribe en la misma clave de objeto, sobrescribiendo en lugar de añadir un segundo archivo
BigQuery, Snowflake, Redshiftelimina duplicados por eventId al cargar, p. ej. ROW_NUMBER() OVER (PARTITION BY eventId)
Webhookignora 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.