El problema fundamental que Jetstream v2 aborda es la gestión de la consistencia y la disponibilidad de datos en un sistema distribuido de gran escala, específicamente en el contexto de un 'firehose' de eventos. Tradicionalmente, consumir un flujo de datos en tiempo real (live tail) y luego integrar datos históricos ha requerido una lógica compleja de 'backfill' por parte del cliente, lo que introduce latencia, complejidad operativa y puntos de fallo. Jetstream v2 resuelve esto al ofrecer un mecanismo unificado para acceder tanto al estado actual como al histórico de la red, eliminando la necesidad de que los consumidores gestionen la sincronización inicial.
Esto es crucial en arquitecturas de eventos donde la resiliencia y la capacidad de reconstruir el estado son primordiales. La capacidad de 'replay' desde cualquier punto en el tiempo es un patrón bien establecido en sistemas de bases de datos (Write-Ahead Logs, event sourcing) y sistemas de mensajería (Kafka, Pulsar), pero su aplicación a un 'firehose' público descentralizado como el AT Protocol presenta desafíos únicos de escala y acceso. La solución de Bluesky busca democratizar este acceso, permitiendo a los desarrolladores construir aplicaciones más robustas y con menos esfuerzo de infraestructura.
Arquitectura del Sistema
Jetstream v2 se basa en una arquitectura de streaming de eventos que combina un 'live tail' en tiempo real con un archivo histórico comprimido de toda la red AT Protocol. Los componentes clave incluyen:
1. Jetstream Instances: Servidores que exponen el 'live tail' a través de WebSockets (wss://jetstream.us-west.bsky.network, wss://jetstream.us-east.bsky.network) y ahora también los endpoints para el 'Network Replay'.
2. Network Replay: Un mecanismo que permite a los clientes solicitar un 'slice' específico del historial de la red. Los clientes POSTean filtros a un endpoint planSnapshot, que devuelve segmentos sellados. Estos segmentos se descargan vía HTTP (usando listSegments y getSegment). Una vez consumidos, el cliente se conecta al WebSocket en vivo para una transición sin interrupciones.
3. Archivo Comprimido: Jetstream mantiene un archivo histórico de toda la red, que es la fuente para el 'Network Replay'. Este archivo es 'stateless' desde la perspectiva del servidor, lo que significa que no hay cursores por consumidor ni suscripciones persistentes en el lado del servidor, simplificando la escalabilidad.
4. API Tokens: Para gestionar el ancho de banda intensivo del acceso a los archivos históricos, se requiere un token de API para las solicitudes de 'Network Replay', mientras que el 'live tail' permanece sin autenticación.
5. SDKs (TypeScript y Go): Clientes que abstraen la complejidad de la conexión, reconexión, deduplicación, gestión de cursores y decodificación de eventos, proporcionando una interfaz for await para consumir eventos tipados.
La interacción se basa en protocolos estándar: WebSockets para el streaming en vivo y HTTP para la recuperación de datos históricos. La arquitectura desacopla el acceso a datos en tiempo real del acceso a datos históricos, pero los unifica a través de una interfaz de consumo consistente (JSON), permitiendo a los clientes construir lógicas de procesamiento que pueden operar indistintamente sobre datos pasados y presentes.
Flujo de Network Replay y Sincronización en Vivo
- 1 Cliente POSTea filtros a `planSnapshot` (HTTP, requiere token)
- 2 Jetstream Genera plan de segmentos sellados del archivo histórico
- 3 Cliente Descarga segmentos sellados vía HTTP (`listSegments`, `getSegment`)
- 4 Cliente Procesa datos históricos de los segmentos descargados
- 5 Cliente Conecta WebSocket al 'live tail' de Jetstream v2
- 6 Jetstream Envía eventos en tiempo real vía WebSocket
- 7 Cliente Procesa eventos en vivo, continuando desde el final del historial
| Capa | Tecnología | Justificación |
|---|---|---|
| messaging | AT Protocol | Protocolo de red descentralizado subyacente para la transmisión de datos |
| networking | WebSocket | Proporciona el canal de comunicación bidireccional para el 'live tail' de eventos en tiempo real vs Server-Sent Events (SSE), Long Polling |
| networking | HTTP | Utilizado para la descarga de segmentos históricos y la interacción con la API de planificación de snapshots |
| data-processing | Jetstream (Bluesky) | Servicio de streaming de datos que gestiona el 'live tail' y el archivo histórico de la red vs Apache Kafka, Apache Pulsar, NATS JetStream Instancias distribuidas geográficamente (us-west, us-east) |
| compute | TypeScript SDK | Cliente para desarrolladores que abstrae la complejidad de consumir el flujo de Jetstream, incluyendo reconexión, deduplicación y gestión de cursores |
| compute | Go SDK | Cliente para desarrolladores que abstrae la complejidad de consumir el flujo de Jetstream, incluyendo reconexión, deduplicación y gestión de cursores |
Trade-offs
Ganancias
- ▲ Facilidad de acceso a datos históricos
- ▲ Reducción de la complejidad del cliente para el 'backfill'
- ▲ Resiliencia de aplicaciones (recuperación de fallos)
- ▲ Capacidad de análisis de datos históricos a gran escala
Costes
- ▲ Ancho de banda del servidor para el 'replay' histórico
- △ Requisito de token de API para acceso histórico
import { Jetstream } from '@bsky/jetstream'
import { app } from '@bsky/sdk/lexicons'
const js = new Jetstream('https://jetstream.us-east.bsky.network')
for await (const evt of js.live({ collections: [app.bsky.feed.post] })) {
if (evt.kind === 'commit' && evt.commit.operation === 'create') {
console.log(evt.commit.collection, evt.commit.record.text)
}
}Fundamentos Teóricos
El concepto de 'Network Replay' y la gestión de flujos de datos históricos se relaciona directamente con los principios de 'event sourcing' y 'log-structured data stores'. La idea de un 'log' inmutable y append-only como fuente de verdad para el estado del sistema fue popularizada por sistemas como el Write-Ahead Log (WAL) en bases de datos (ej. PostgreSQL, MySQL) y la arquitectura de Apache Kafka. Estos sistemas permiten reconstruir el estado en cualquier punto en el tiempo re-procesando el log.
En el ámbito académico, el trabajo de Leslie Lamport sobre 'Relojes Lógicos' (1978) y la importancia del orden causal de los eventos en sistemas distribuidos es fundamental. La capacidad de 'replay' garantiza que los eventos se procesen en el orden correcto, manteniendo la consistencia. Más recientemente, los sistemas de 'stream processing' como Apache Flink o Apache Samza han explorado cómo procesar flujos de datos históricos y en tiempo real de manera unificada, a menudo utilizando un 'log' distribuido como base. El diseño de Jetstream v2, al ofrecer un archivo histórico y un 'live tail' que se pueden unir sin fisuras, refleja estos principios de durabilidad, orden y capacidad de reconstrucción del estado, esenciales para la resiliencia de sistemas distribuidos a gran escala.