Fork dell'implementazione di riferimento del protocollo AT con AppView ottimizzato per le prestazioni, indicizzatore firehose basato su Rust, caching Redis e funzionalità community per social networking self-hostato su larga scala.
Questa è la fork di Blacksky dell'implementazione di riferimento del AT Protocol di Bluesky Social PBC. Alimenta l'AppView su api.blacksky.community.
Pubbliciamo questo codice per trasparenza e affinché altre comunità possano beneficiare del lavoro. Questo repository non accetta contributi, issue o PR. Se desideri l'implementazione atproto canonica, utilizza bluesky-social/atproto.
Tutte le modifiche sono in packages/bsky (logica dell'AppView), services/bsky (configurazione runtime) e una migrazione personalizzata. Tutto il resto è upstream.
Il dataplane upstream include un consumatore di firehose TypeScript (subscription.ts) che indicizza gli eventi direttamente. Lo abbiamo sostituito con rsky-wintermute, un indicizzatore Rust, per diverse ragioni:
Il dataplane e l'appview di questo repository funzionano ancora così come sono. Leggono dal database PostgreSQL che wintermute scrive. Semplicemente non avviamo la sottoscrizione al firehose integrata.
Queste sono ampiamente utili per chiunque ospiti un AppView su larga scala.
Ottimizzazione delle query LATERAL JOIN (packages/bsky/src/data-plane/server/routes/feeds.ts)
getTimeline e getListFeed riscritti con LATERAL JOIN di PostgreSQL per forzare l'utilizzo degli indici per utente invece di scansioni complete delle tabelle. Miglioramento significativo per utenti che seguono migliaia di account.Livello di cache Redis (packages/bsky/src/data-plane/server/cache/)
Timestamp perdono il metodo .toDate() dopo il round-trip JSON attraverso Redis, causando un'idratazione incompleta del profilo in caso di cache hit. Attualmente eseguiamo con la cache Redis disabilitata. La soluzione è serializzare i timestamp come stringhe ISO durante la scrittura nella cache e ricostruirli in fase di lettura.Applicazione lato server delle preferenze di notifica (packages/bsky/src/api/app/bsky/notification/listNotifications.ts)
reasons, il server applica le preferenze di notifica salvate dell'utente. Senza questa funzione, le preferenze vengono applicate solo lato client e non hanno effetto.Risoluzione della chiave di firma scaduta nel verificatore di autenticazione (packages/bsky/src/auth-verifier.ts)
forceRefresh, bypassa la cache di identità in memoria del dataplane e risolve il documento DID direttamente dalla directory PLC. Risolve errori di autenticazione dopo la migrazione dell'account quando la chiave di firma viene ruotata ma la cache mantiene la vecchia chiave.Sanitizzazione JSON (packages/bsky/src/data-plane/server/routes/records.ts)
\u0000) e i caratteri di controllo dai record memorizzati prima del parsing JSON. Questi sono validi secondo RFC 8259 ma vengono rifiutati da JSON.parse() di Node.js, causando errori silenziosi di parsing rowToRecord nel dataplane che si manifestano come post mancanti.Infrastruttura per post privati di comunità che risiedono sull'AppView anziché su singoli PDS. Specifica per il funzionamento di Blacksky, ma potrebbe essere di riferimento per altre comunità.
community.blacksky.feed.* con endpoint per submit, get, delete, timeline e visualizzazioni threadcommunity_post separata (migrazione: 20260202T120000000Z-add-community-post.ts)getPostThreadV2 per thread misti di post standard e comunitariBLACKSKY_MEMBERSHIP_DB_URL)Bluesky Relay (bsky.network)
|
v
rsky-wintermute -----> PostgreSQL 17 <----- Palomar
(Indicizzatore Rust) | (Ricerca Go)
- consumatore firehose | |
- backfiller | v
- indicizzatore etichette | OpenSearch
- indicizzatore diretto |
v
bsky-dataplane (gRPC :2585) <--- Redis (opzionale)
|
v
bsky-appview (HTTP :2584)
|
v
Reverse proxy (Caddy/nginx)
| Componente | Sorgente | Scopo |
|---|---|---|
| rsky-wintermute | blacksky-algorithms/rsky | Indicizzatore Rust: consuma eventi, esegue backfill dei repository, indicizza i record in PostgreSQL |
| rsky-relay | blacksky-algorithms/rsky | Relay AT Protocol per ricevere etichette di moderazione dai servizi labeler |
| rsky-video | blacksky-algorithms/rsky | Servizio di upload video: transcodifica tramite Bunny Stream CDN, carica i riferimenti blob nei PDS degli utenti |
| bsky-dataplane | Questo repository (services/bsky) | Livello dati gRPC su PostgreSQL |
| bsky-appview | Questo repository (services/bsky) | Server API HTTP per gli endpoint XRPC app.bsky.* |
| Palomar | blacksky-algorithms/indigo | Ricerca full-text: indicizza profili e post in OpenSearch con potenziamento del conteggio follower |
| palomar-sync | blacksky-algorithms/rsky | Sincronizza conteggi follower e punteggi PageRank da PostgreSQL a OpenSearch |
Wintermute è un servizio Rust monolitico con quattro percorsi di elaborazione paralleli:
bsky.network tramite WebSocket, scrive eventi nelle code Fjall (key-value store embedded)ON CONFLICT per idempotenza