Non riesce ad aprire
Se il servizio coda non è raggiungibile o la coda non esiste, lo script non fa nulla e il negozio rimane pienamente utilizzabile. Un'interruzione della sala d'attesa non blocca mai il negozio.
ADITUS-Queue è una sala d'attesa virtuale autonoma che protegge qualsiasi sito Web, API o servizio online dai picchi di traffico. Si integra perfettamente con la piattaforma di ticketing ADITUS e si distribuisce in modo altrettanto indipendente davanti a qualsiasi applicazione web. I visitatori vengono trattenuti in una sala d'attesa ospitata e ammessi rigorosamente in base all'ordine di arrivo, a una tariffa al minuto configurata. L'integrazione spazia da un singolo collegamento gateway o tag script senza infrastruttura da parte dell'operatore, attraverso l'applicazione nel proxy inverso o CDN, alla semplice API REST.
Novità: la tariffa di ammissione autoregolamentata. La coda legge un controllo dello stato del tuo negozio e regola la tariffa da sola: più visitatori quando il negozio ha spazio, sollievo immediato quando è sotto pressione.
Nonostante la profondità: la configurazione richiede pochi minuti, non giorni. Un collegamento pubblicato o un tag script: nessuna infrastruttura, nessuna distribuzione, nessuna modifica al codice da parte tua.
Proteggi la tua applicazione in meno di 2 minuti: copia il tag script nella tua testa o pubblica il link del gateway. Nessuna modifica all'infrastruttura del tuo server. Solo quando desideri il massimo controllo abiliti le funzionalità avanzate opzionali: tutto il resto in questa pagina è esattamente questo: profondità opzionale per dopo.
Nella console di amministrazione ADITUS: nome, indirizzo del negozio, tariffa di ingresso al minuto. Le impostazioni predefinite ragionevoli coprono tutto il resto.
Pubblica il collegamento del gateway già pronto anziché il collegamento del negozio oppure incolla il tag dello script preparato nella pagina del negozio, esattamente come uno snippet di analisi.
Al di sotto della tariffa di ingresso i visitatori non vedono mai la sala d'attesa. Solo quando si verifica un picco entra in gioco la coda: ospitata, scalata e gestita da noi.
La potenza della coda è un percorso di aggiornamento, non un requisito. Il livello 1 copre da solo la stragrande maggioranza dei casi d’uso.
Quale opzione si adatta dipende da una domanda: è possibile modificare il collegamento del negozio pubblicato? Se sì, il collegamento gateway è la scelta migliore: il traffico non raggiunge mai il negozio prima dell'ingresso. Se l'URL del negozio pubblicato è fisso, il tag script protegge il negozio senza alcuna modifica alla sua pubblicazione. Oltre a questi due, il controllo può essere applicato nel proxy inverso o CDN (sotto), gestito direttamente tramite l'API REST o verificato in qualsiasi linguaggio di backend con una libreria JWT: Node.js, PHP, Java, .NET, Python, Go.
Ogni sala d'attesa fornisce il proprio URL di ingresso. Viene pubblicato ovunque venga altrimenti visualizzato il collegamento al negozio: newsletter, sito Web, social media. La coda prende la richiesta e decide lato server in un unico passaggio: al di sotto della tariffa di ingresso il visitatore viene indirizzato direttamente all'indirizzo del negozio configurato e non si accorge minimamente della coda; una volta superata la tariffa, il visitatore atterra nella sala d'attesa e viene inoltrato automaticamente al suo turno. Il negozio stesso non riceve traffico prima dell'ingresso: le richieste vengono assorbite prima di raggiungere l'infrastruttura del negozio.
<!-- Der veröffentlichte Shop-Link zeigt auf die Queue statt auf den Shop: -->
<a href="https://developers.aditus.com/queue/<slug>/enter">Tickets kaufen</a>Per questa opzione è necessario configurare l'indirizzo di destinazione del negozio (Ziel-URL) per la coda: è l'indirizzo a cui vengono reindirizzati i visitatori ammessi. I visitatori ammessi arrivano al negozio con un token di ingresso firmato nell'URL: un JWT HS256 standard che il negozio può facoltativamente verificare offline nel proprio backend utilizzando il segreto condiviso.La struttura, le affermazioni e un esempio di backend sono documentati di seguito. Nota: il gateway protegge il punto di ingresso pubblicato; i visitatori che conoscono direttamente l'URL del negozio possono comunque ignorarlo. Se è importante, combina il collegamento del gateway con il tag script o verifica il token nel backend del negozio.
Quando il collegamento al negozio pubblicato non può essere modificato, l'integrazione è un singolo tag script. Viene consegnato insieme alle pagine del negozio – nello stesso modo in cui viene consegnato uno snippet di analisi – e deve essere presente su ogni pagina che la sala d'attesa dovrebbe proteggere. Si consiglia il posizionamento in <head> con l'attributo defer; la posizione esatta non è critica.
<!-- Auf jeder zu schützenden Shop-Seite im <head>: -->
<script src="https://developers.aditus.com/queue/<slug>/embed.js" defer></script>Il tag esatto per una sala d'attesa specifica, con lo slug corretto già inserito, è disponibile nella console di amministrazione ADITUS per coda. Lo script esegue tre controlli ad ogni caricamento della pagina:
Non succede nulla. Il pass viene memorizzato per sessione del browser; il visitatore utilizza il negozio senza interruzioni.
Il token di ammissione nell'URL viene verificato lato server (firma, assegnazione coda, scadenza). Se valido, viene archiviato un pass di sessione e il token viene rimosso dalla barra degli indirizzi. I gettoni non validi o scaduti rimandano il visitatore alla sala d'attesa.
Se nessuno sta aspettando, il visitatore viene ammesso silenziosamente in background e rimane sulla pagina: la sala d'attesa non viene mai mostrata. Solo quando viene superata la tariffa di ingresso configurata e si forma una coda il visitatore viene reindirizzato nella sala d'attesa; la pagina corrente viene trasmessa come URL di ritorno convalidato, quindi dopo l'ammissione il visitatore arriva esattamente alla pagina originariamente richiesta.
Se il servizio coda non è raggiungibile o la coda non esiste, lo script non fa nulla e il negozio rimane pienamente utilizzabile. Un'interruzione della sala d'attesa non blocca mai il negozio.
Gli URL di ritorno vengono convalidati lato server rispetto ai domini configurati per la coda. La sala d'attesa inoltra solo alle pagine del negozio registrato.
Entrambe le opzioni sopra proteggono il punto di ingresso pubblicato. Se il negozio deve essere irraggiungibile senza ingresso anche per i visitatori che ne conoscono direttamente l'URL, l'assegno si sposta davanti al negozio, nel proxy inverso o CDN che ne termina il traffico. La logica è sempre la stessa in tre passaggi: prendere il token dal parametro URL aditus_queue_token quando il visitatore ritorna dalla sala d'attesa e memorizzarlo come cookie; ad ogni richiesta, verificare il token dal cookie come un JWT HS256 standard con il segreto condiviso (emittente aditus-queue, audience lo slug della coda, scadenza); senza un token valido, reindirizza alla sala d'attesa su https://developers.aditus.com/queue/<slug>. La verifica è offline: il proxy non chiama mai la coda e non aggiunge latenza. Gli schizzi seguenti mostrano lo schema di quattro ambienti comuni; adattateli al vostro setup.
# Skizze: Nginx mit njs (js_import) — prüft den Zugriffs-Token als HS256-JWT
# direkt am Proxy, ohne Rückruf an die Queue. An die eigene Umgebung anpassen.
# nginx.conf:
# env ADITUS_QUEUE_SECRET;
# js_import queue from /etc/nginx/queue.js;
# server {
# location / { js_content queue.gate; }
# location @shop { proxy_pass http://shop_backend; }
# }
// /etc/nginx/queue.js:
const crypto = require('crypto');
const SLUG = '<slug>';
const SECRET = process.env.ADITUS_QUEUE_SECRET; // Shared Secret der Queue
function claims(token) {
const p = token.split('.');
if (p.length !== 3) return null;
const sig = crypto.createHmac('sha256', SECRET)
.update(p[0] + '.' + p[1]).digest('base64url');
if (sig !== p[2]) return null;
const c = JSON.parse(Buffer.from(p[1], 'base64url'));
const ok = c.iss === 'aditus-queue' && c.aud === SLUG && c.exp > Date.now() / 1000;
return ok ? c : null;
}
function gate(r) {
const fromUrl = r.args.aditus_queue_token;
const m = (r.headersIn.Cookie || '').match(/(?:^|;\s*)aditus_queue=([^;]+)/);
const token = fromUrl || (m && m[1]);
if (!token || !claims(token)) {
// Kein gültiger Token -> zurück in den Warteraum
r.return(302, 'https://developers.aditus.com/queue/' + SLUG);
return;
}
if (fromUrl) {
// Token aus der Rücksprung-URL in ein Sitzungs-Cookie übernehmen
r.headersOut['Set-Cookie'] =
'aditus_queue=' + fromUrl + '; Path=/; Secure; HttpOnly; Max-Age=600';
}
r.internalRedirect('@shop');
}
export default { gate };# Skizze: Caddy mit dem jwtauth-Plugin (github.com/ggicci/caddy-jwt).
# Token kommt beim Rücksprung als ?aditus_queue_token=… oder danach als Cookie;
# jwtauth prüft beide Quellen. An die eigene Umgebung anpassen.
shop.example.com {
route {
jwtauth {
sign_key {env.ADITUS_QUEUE_SECRET}
sign_alg HS256
from_query aditus_queue_token
from_cookies aditus_queue
issuer_whitelist aditus-queue
audience_whitelist <slug>
user_claims qnr
}
# Token aus der URL einmalig in ein Cookie übernehmen
@rueckkehr query aditus_queue_token=*
header @rueckkehr Set-Cookie "aditus_queue={http.request.uri.query.aditus_queue_token}; Path=/; Secure; HttpOnly; Max-Age=600"
reverse_proxy shop_backend:8080
}
# Ohne gültigen Token: zurück in den Warteraum
handle_errors {
@unauth expression {http.error.status_code} == 401
redir @unauth https://developers.aditus.com/queue/<slug> 302
}
}// Skizze: Cloudflare Worker vor dem Shop — prüft den HS256-JWT offline per
// WebCrypto. Secret als Worker-Secret ADITUS_QUEUE_SECRET hinterlegen.
const SLUG = "<slug>";
const ROOM = "https://developers.aditus.com/queue/" + SLUG;
export default {
async fetch(req, env) {
const url = new URL(req.url);
const fromUrl = url.searchParams.get("aditus_queue_token");
const m = (req.headers.get("Cookie") || "").match(/(?:^|;\s*)aditus_queue=([^;]+)/);
const token = fromUrl || (m && m[1]);
if (!token || !(await valid(token, env.ADITUS_QUEUE_SECRET))) {
return Response.redirect(ROOM, 302); // zurück in den Warteraum
}
if (fromUrl) {
// Token in ein Cookie übernehmen und die URL bereinigen
url.searchParams.delete("aditus_queue_token");
return new Response(null, {
status: 302,
headers: {
Location: url.toString(),
"Set-Cookie": "aditus_queue=" + token +
"; Path=/; Secure; HttpOnly; Max-Age=600",
},
});
}
return fetch(req); // gültiger Pass -> durch zum Shop
},
};
async function valid(token, secret) {
const p = token.split(".");
if (p.length !== 3) return false;
const key = await crypto.subtle.importKey(
"raw", new TextEncoder().encode(secret),
{ name: "HMAC", hash: "SHA-256" }, false, ["verify"],
);
const ok = await crypto.subtle.verify(
"HMAC", key, b64url(p[2]),
new TextEncoder().encode(p[0] + "." + p[1]),
);
if (!ok) return false;
const c = JSON.parse(new TextDecoder().decode(b64url(p[1])));
return c.iss === "aditus-queue" && c.aud === SLUG && c.exp > Date.now() / 1000;
}
function b64url(v) {
return Uint8Array.from(
atob(v.replace(/-/g, "+").replace(/_/g, "/")),
(ch) => ch.charCodeAt(0),
);
}// Skizze: AWS CloudFront mit Lambda@Edge (Viewer-Request, Node.js).
// Gleiches Muster: Token aus ?aditus_queue_token oder Cookie, HS256 offline
// prüfen, ohne gültigen Token in den Warteraum umleiten.
// Hinweis: Lambda@Edge hat keine Umgebungsvariablen — das Secret z. B. beim
// Deployment einbetten oder aus SSM/Secrets Manager cachen.
'use strict';
const crypto = require('crypto');
const SLUG = '<slug>';
const ROOM = 'https://developers.aditus.com/queue/' + SLUG;
const SECRET = '<ADITUS_QUEUE_SECRET>';
exports.handler = async (event) => {
const req = event.Records[0].cf.request;
const qs = new URLSearchParams(req.querystring || '');
const fromUrl = qs.get('aditus_queue_token');
const cookie = (req.headers.cookie || []).map((h) => h.value).join('; ');
const m = cookie.match(/(?:^|;\s*)aditus_queue=([^;]+)/);
const token = fromUrl || (m && m[1]);
if (!token || !valid(token)) {
return redirect(ROOM); // zurück in den Warteraum
}
if (fromUrl) {
// Token in ein Cookie übernehmen und die URL bereinigen
qs.delete('aditus_queue_token');
const clean = req.uri + (qs.toString() ? '?' + qs.toString() : '');
return redirect(clean, {
'set-cookie': [{ key: 'Set-Cookie', value:
'aditus_queue=' + token + '; Path=/; Secure; HttpOnly; Max-Age=600' }],
});
}
return req; // gültiger Pass -> durch zum Shop (Origin)
};
function valid(token) {
const p = token.split('.');
if (p.length !== 3) return false;
const sig = crypto.createHmac('sha256', SECRET)
.update(p[0] + '.' + p[1]).digest();
const got = Buffer.from(p[2], 'base64url');
if (got.length !== sig.length || !crypto.timingSafeEqual(sig, got)) {
return false;
}
const c = JSON.parse(Buffer.from(p[1], 'base64url'));
return c.iss === 'aditus-queue' && c.aud === SLUG && c.exp > Date.now() / 1000;
}
function redirect(location, extraHeaders) {
return {
status: '302',
headers: Object.assign(
{ location: [{ key: 'Location', value: location }] },
extraHeaders || {},
),
};
}Nota: con l'applicazione dei limiti, ogni visitatore ha bisogno di un token, compresi quelli che altrimenti passerebbero silenziosamente al di sotto della tariffa di ammissione. Pubblica il collegamento del gateway (opzione A) accanto ad esso o lascia che il proxy reindirizzi i visitatori senza token alla sala d'attesa, che emette immediatamente un token mentre nessuno sta aspettando.
La sala d'attesa è configurata da ADITUS. Per la configurazione, fornire quanto segue:
Un'immagine di intestazione per la pagina della sala d'attesa, ad es. la key visual dell'evento. Formato orizzontale, almeno 920 × 380 pixel (visualizzato con una larghezza massima di 460 px, ritagliato a un'altezza massima di 190 px), JPG o PNG, consegnato come URL HTTPS raggiungibile pubblicamente o come file ad ADITUS.
Un breve messaggio mostrato sotto il titolo della sala d'attesa, ad es. una nota sulla vendita o sull'attesa prevista. Testo normale, le interruzioni di riga vengono mantenute; lunghezza consigliata fino a circa 300 caratteri. Il testo viene visualizzato esattamente come fornito: se servi visitatori internazionali, forniscilo nella lingua appropriata o bilingue.
Il colore del marchio come valore esadecimale (ad esempio #0a63c9). Colora la barra di avanzamento e l'indicatore live nella pagina della sala d'attesa; senza un valore, viene utilizzato il colore predefinito ADITUS. Insieme alla grafica e al testo, la sala d'attesa adotta il marchio dell'organizzatore.
I domini delle pagine su cui verrà eseguito lo script (ad esempio shop.example.com). Definiscono quali URL di ritorno accetta la sala d'attesa.
Il titolo della sala d'attesa (ad esempio il nome dell'evento), l'URL di destinazione per i visitatori ammessi (richiesto per il collegamento del gateway: è l'indirizzo del negozio a cui inoltra il gateway) e il tasso di ingresso in visitatori al minuto. La tariffa è la soglia di passaggio: finché arrivano meno visitatori di quelli consentiti dalla tariffa, tutti passano senza sala d'attesa. Può essere modificato in qualsiasi momento mentre la coda è in esecuzione.
Numero in attesa - assegnato una volta all'apertura della pagina e mantenuto per l'intera attesa, anche durante un ricaricamento.
Posizione e numero di ammissione — quanti numeri sono in anticipo e fino a quale numero è attualmente aperta l'ammissione. Il numero degli ammessi cresce continuamente con il tasso di ammissione.
Barra di avanzamento — visualizza quanto è avanzato l'ingresso rispetto al proprio numero del visitatore.
Attesa stimata — calcolato in base alla posizione attuale e al tasso di ammissione; si accorcia man mano che l'ammissione procede. Una volta ammesso il numero del visitatore, la pagina viene inoltrata automaticamente al negozio, senza che sia richiesta alcuna interazione.
Immagine dell'intestazione — facoltativo, ad es. la key visual dell'evento.
Nome da visualizzare — il titolo della sala d'attesa, ad es. il nome dell'evento.
Messaggio — testo facoltativo sotto il titolo, mostrato esattamente come fornito.
La stessa pagina della sala d'attesa è bilingue (tedesco/inglese). La lingua viene selezionata automaticamente dalle impostazioni del browser del visitatore; non è richiesta alcuna configurazione.
Durante la vendita, ADITUS monitora ogni sala d'attesa in una dashboard dal vivo: gli indicatori mostrano il conteggio attuale dell'attesa, l'afflusso di nuovi visitatori rispetto al tasso di ingresso, il tasso di ingresso stesso (con il suo tetto configurato quando la tariffa autoregolamentata è attiva) e l'attesa stimata per i nuovi arrivati. Un grafico a due serie tiene traccia del conteggio delle attese rispetto al flusso in entrata nel tempo e le istanze della coda che servono il traffico riportano il proprio carico: CPU, memoria e velocità di richiesta. La tariffa di ingresso può essere modificata in qualsiasi momento mentre la coda è in corso, ad esempio quando il negozio ha spazio libero.
La coda non è solo dichiarata a prova di carico, ma viene testata regolarmente. Dalla console di amministrazione ADITUS, i test di carico inviano richieste reali in una sala d'attesa di test dedicata sul sistema di produzione (le sale d'attesa produttive non vengono mai toccate). Un test simula il percorso del visitatore (adesione e sondaggio sullo stato) a una velocità e durata configurabili. Gli indicatori in tempo reale mostrano il tasso di richiesta raggiunto, la latenza mediana e p95 e il tasso di errore; un grafico al secondo tiene traccia del throughput rispetto alla latenza e ogni esecuzione viene conservata in una cronologia in modo che i risultati rimangano comparabili nel tempo. I test vengono inoltre eseguiti in base a una pianificazione ricorrente e un'esecuzione pianificata che presenta prestazioni chiaramente peggiori rispetto a precedenti esecuzioni comparabili viene contrassegnata automaticamente.
Per il monitoraggio esterno, il servizio di coda espone un controllo di integrità pubblico in /queue/healthz. Risponde senza autenticazione e senza toccare il database: un semplice segnale di disponibilità per il monitoraggio del tempo di attività. Durante un test di carico, la console di amministrazione mostra inoltre le istanze della coda segnalate automaticamente con CPU, memoria, ritardo del loop di eventi e velocità di richiesta; sotto carico, la piattaforma avvia automaticamente istanze aggiuntive e il test lo rende visibile.
Il tasso di ammissione è l'unico fattore che decide tutto durante un'offerta - e fino ad ora qualcuno doveva tenerlo d'occhio. Non più: è la coda a regolare da sola la tariffa, in base alle effettive condizioni del negozio tutelato. Il risultato è una sala d’attesa che vende alla stessa velocità con cui il negozio può tranquillamente gestirlo, in ogni momento, senza che nessuno tocchi un quadrante.
Mentre il negozio è in salute, il prezzo sale a piccoli passi e lo spazio inutilizzato si trasforma in vendite. Nel momento in cui il negozio mostra tensione, il tasso scende bruscamente – deliberatamente asimmetrico: il sollievo è immediato, il carico ritorna con attenzione.
Un controllo dello stato irraggiungibile non apre mai di più le porte: il tasso prima si blocca, poi scende al minimo configurato. Il negozio è protetto proprio quando nessuno guarda.
Sei tu a definire cosa significa sano: tempo di risposta, carico della CPU, qualsiasi metrica riportata dal tuo negozio. Ogni aggiustamento automatico viene registrato e visibile nella dashboard live, con la regola che lo ha attivato.
Invece di regolare manualmente la tariffa di ingresso, una sala d'attesa può regolarla automaticamente da un controllo sanitario del negozio protetto. ADITUS esegue il polling di un URL di integrità del negozio a un intervallo configurabile e valuta il tempo di risposta e, facoltativamente, i campi numerici dalla risposta JSON rispetto a regole definite dall'operatore (ad esempio: tempo di risposta inferiore a 500 ms, carico della CPU inferiore a 0,8). Mentre il negozio è in salute, la tariffa viene aumentata lentamente a piccoli passi; non appena una regola viene violata, viene abbassata rapidamente di una percentuale: deliberatamente asimmetrica, quindi il negozio viene immediatamente sollevato ma carica i resi con attenzione. La tariffa rimane sempre entro un minimo e un massimo configurati.
Se l’endpoint sanitario non risponde, il sistema fallisce: la velocità viene prima congelata e dopo diversi fallimenti consecutivi scende al minimo configurato: un controllo sanitario irraggiungibile non apre mai le porte più in là. Ogni regolazione automatica viene registrata e visibile nella dashboard live e prima che l'automazione possa essere abilitata, l'endpoint deve superare un test una tantum dalla console di amministrazione.
L'endpoint sanitario lato negozio rimane banale: un URL HTTPS, raggiungibile senza autenticazione, che risponde 2xx. Un corpo JSON è facoltativo: qualsiasi campo numerico (gli oggetti nidificati vengono appiattiti in percorsi punteggiati) diventa metrica a cui le regole possono fare riferimento:
{
"status": "ok",
"responseBudgetMs": 500,
"metrics": {
"cpuLoad": 0.42,
"dbPoolWaiting": 0,
"openCheckouts": 118
}
}
// Nutzbare Messwerte (Punktpfade):
// responseBudgetMs, metrics.cpuLoad, metrics.dbPoolWaiting, metrics.openCheckouts
// Dazu immer verfügbar: die gemessene Antwortzeit (ms).Per le vendite molto richieste, una sala d'attesa può inoltre richiedere una prova di lavoro prima che venga emesso un numero di attesa. Il browser risolve quindi un piccolo puzzle crittografico in background, invisibile al visitatore e, alla difficoltà predefinita, ben meno di un secondo sui normali dispositivi. Per una bot farm il quadro cambia: ogni singola unione costa lo stesso lavoro di elaborazione, quindi estrarre migliaia di numeri diventa proporzionalmente costoso anziché gratuito. La protezione è disattivata per impostazione predefinita e abilitata per sala d'attesa nella console di amministrazione ADITUS; la difficoltà è regolabile (da 8 a 24 bit, predefinito 15: ogni bit aggiuntivo raddoppia il lavoro). La pagina della sala d'attesa ospitata gestisce il puzzle automaticamente; non cambia nulla per l'integrazione del negozio.
Una conseguenza voluta: finché la protezione è attiva, il passaggio silenzioso al di sotto della tariffa d'ingresso è disattivato: ogni visitatore attraversa la sala d'attesa, perché solo lì viene eseguita la prova del lavoro. E una nota sulla portata: la prova di lavoro tutela l'emissione dei numeri di attesa contro l'adesione di massa. Si tratta di un elemento fondamentale contro gli acquirenti automatizzati, non di una difesa completa dai bot: combinalo con le misure del negozio stesso (come i limiti di acquisto) dove necessario.
Solo le integrazioni personalizzate che chiamano direttamente l'API della coda devono risolvere il puzzle da sole. Il flusso: recuperare una sfida, trovare un nonce il cui hash SHA-256 della sfida più nonce inizia con il numero richiesto di bit zero e inviare entrambi con la richiesta di partecipazione. Le sfide sono firmate e valide per cinque minuti; il riutilizzo viene inoltre soppresso per istanza:
// 1. Challenge holen (nur relevant, wenn PoW für die Queue aktiv ist)
GET https://developers.aditus.com/queue/<slug>/pow
// -> { queue, enabled: true, challenge, bits, expiresInSeconds: 300,
// algorithm: "sha256" }
// 2. Nonce suchen: SHA-256(challenge + "." + nonce) muss mit <bits>
// Null-Bits beginnen. Im Browser per WebCrypto — bei der
// Standard-Schwierigkeit deutlich unter einer Sekunde.
// 3. Beitritt mit Lösung
POST https://developers.aditus.com/queue/<slug>/join
{ "pow": { "challenge": "…", "nonce": "…" } }
// Ohne oder mit ungültiger Lösung antwortet /join mit
// 428 Precondition Required — und liefert im Fehlerkörper direkt eine
// frische Challenge mit, sodass kein zweiter Abruf nötig ist.Per le vendite annunciate, ad una sala d'attesa può essere assegnato un orario di apertura fisso. I visitatori che arrivano presto entrano in pre-coda: la pagina della sala d'attesa mostra il conto alla rovescia fino all'apertura, ancora nessuno è ammesso. All'apertura avviene il passo cruciale: l'ordine di ammissione tra tutti coloro che aspettano viene sorteggiato in modo abbastanza casuale. Arrivare tre ore prima non porta quindi alcun vantaggio rispetto ad arrivare tre minuti prima; le maratone di aggiornamento e le schede del browser accampate perdono il loro punto. Tutti coloro che si uniscono dopo l'apertura vengono posizionati dietro al gruppo sorteggiato nel normale ordine di arrivo.
L'estrazione è una permutazione matematica dei numeri in attesa emessi prima dell'apertura: ogni numero ottiene esattamente una posizione, nessuno viene perso, nessuno appare due volte e l'assegnazione non è prevedibile dall'ordine di iscrizione. La modifica dell'orario di apertura nella console di amministrazione riattiva l'estrazione; non cambia nulla per l'integrazione del negozio o dell'API.
Non tutti quelli che estraggono un numero in attesa restano. Le schede chiuse e i browser abbandonati normalmente lasciano dei vuoti: la finestra di ammissione si sposta su numeri che non appartengono più a nessuno e il throughput reale scende al di sotto della velocità configurata. Con il rilevamento degli abbandoni abilitato, la pagina della sala d'attesa ospitata segnala la propria presenza in un battito cardiaco regolare. Se un numero rimane in silenzio più a lungo del periodo di grazia configurato (da 60 a 3600 secondi, predefinito 180), viene considerato abbandonato e la finestra di ammissione avanza esattamente di quella quantità più velocemente, in modo che gli slot vacanti vadano ai visitatori che in realtà stanno ancora aspettando.
Il rilevamento è volutamente indulgente: un visitatore di ritorno il cui numero è stato conteggiato come abbandonato ma che si trova già all'interno della finestra di ammissione viene ammesso normalmente – il battito cardiaco accelera solo, non revoca mai un'ammissione. Le integrazioni personalizzate che creano la propria pagina di attesa inviano lo stesso segnale tramite POST /queue/<slug>/heartbeat (corpo JSON con il numero di attesa, consigliato ogni 60 secondi).
Stampa, partner, contingenti di fan club: alcuni visitatori non dovrebbero mai vedere una sala d'attesa. Per loro, è possibile creare codici di bypass per sala d'attesa nella console di amministrazione di ADITUS, ciascuno con un'etichetta, un limite di utilizzo opzionale e una data di scadenza opzionale, e ciascuno può essere disabilitato o eliminato in qualsiasi momento. Un codice viene condiviso come un semplice link: /queue/<slug>/enter?code=… reindirizza direttamente al negozio con un token di ingresso valido, superando l'intera coda. Le integrazioni personalizzate possono invece riscattare i codici tramite POST /queue/<slug>/bypass e ricevere il token come JSON.
Due proprietà di sicurezza intenzionali: un codice non valido sul collegamento del gateway passa silenziosamente al percorso normale: gli estranei non possono dire se un codice sia mai esistito. E il percorso JSON risponde in modo identico ai codici non validi, scaduti, esauriti e disabilitati, quindi non esiste un oracolo per indovinare i codici. Gli ingressi bypass sono contrassegnati come tali nel token e non consumano gli slot di ingresso regolari.
Le seguenti sezioni non sono necessarie per l'integrazione: il tag script riportato sopra è completo. Documentano come funziona il sistema per la valutazione tecnica e per i negozi che desiderano verificare l'ammissione nel proprio backend.
A ogni visitatore viene assegnato un numero di attesa sequenziale mediante un singolo incremento atomico del database. L'ammissione avanza continuamente: il numero attualmente ammesso è calcolato come base + tariffa × minuti trascorsi. Il polling dello stato è di sola lettura e non tocca il database per richiesta. Non esiste uno stato per visitatore sul server, nessun processo cron e nessun timer: il servizio di coda stesso non può diventare un collo di bottiglia sotto carico. La sospensione di una coda interrompe sia l'ingresso che l'emissione di nuovi numeri; le variazioni tariffarie sono continue ed il numero degli ammessi non diminuisce mai.
L'ingresso è rigorosamente first-come-first-served (FCFS): l'incremento atomico fissa la posizione di ciascun visitatore al momento dell'ingresso, e le posizioni non cambiano mai successivamente. Non c'è deliberatamente alcuna lotteria, nessuna randomizzazione e nessuna corsia prioritaria: in condizioni di scarsità, l'ordine di arrivo è l'unico ordine che i visitatori accettano come giusto, ed è l'unico su cui non è possibile giocare. Il salto della coda è tecnicamente escluso su due livelli: i numeri in attesa crescono sempre e il controllo di ammissione confronta il numero del visitatore con il numero attualmente ammesso sul server - il token di ammissione viene emesso solo una volta superato il controllo, firmato con il segreto della coda. Un visitatore non può rivendicare una posizione migliore e un token contraffatto non supera la verifica della firma. Gli operatori che necessitano di flussi separati, ad esempio una sala d'attesa per evento o per vendita, gestiscono più sale d'attesa indipendenti, ciascuna con il proprio slug, segreto, tariffa e configurazione.
L'obiettivo di progettazione deriva direttamente dalla logica di ammissione di cui sopra: poiché il numero ammesso deriva dal tempo trascorso e il controllo dello stato non legge alcuno stato per visitatore, quasi l'intero traffico dei visitatori è un calcolo senza stato. Qualsiasi istanza può rispondere a qualsiasi richiesta, le istanze non condividono altro che il database e la piattaforma aggiunge automaticamente le istanze sotto carico. La scrittura del database singolo per visitatore, ovvero l'incremento atomico al momento dell'adesione, è l'unico punto di serializzazione e avviene esattamente una volta per visitatore, non per sondaggio. I numeri seguenti provengono dal runner di test di carico integrato descritto sopra, eseguito contro una sala d'attesa di test dedicata sul sistema di produzione: due worker generatori sollecitano due istanze di coda, con throughput e tasso di errore ricavati dalle ricevute firmate del servizio di coda. Il profilo mix combina l'adesione e il sondaggio sullo stato in proporzione al percorso reale del visitatore:
status · 1000 req/s · 120 s · 2 istanzeLatenza p95 72,1 ms · tasso di errore 0 % · sett. 2026, 999,2 req/s raggiuntistatus · 1000 req/s · 120 s · 2 istanzeLatenza p95 6,6 ms · tasso di errore 0 % · ago. 2026, 939,4 req/s raggiunti (limitato dal generatore)mix · 500 req/s · 60 s · 2 istanzeLatenza p95 1488 ms · tasso di errore 0 % · sett. 2026, 497,2 req/s raggiunti, 0 × 429; il p95 include il picco di avvioTutte le esecuzioni hanno utilizzato il percorso del codice di produzione e si sono concluse senza un singolo errore HTTP, di trasporto o di limitazione. Due istanze reggono mille richieste di stato al secondo per due minuti – oltre diecimila visitatori in attesa che effettuano il polling al loro intervallo adattivo – e il profilo mix conferma che cinquecento richieste al secondo, adesioni incluse, passano senza essere frenate dai budget di richieste per IP. Il limite superiore della tabella è dato dal generatore di carico, non dalla coda: il p95 lato coda è rimasto a una cifra in millisecondi finché il generatore non ha lavorato al massimo. Questo ridimensionamento non è una scatola nera: ogni istanza in esecuzione si segnala continuamente con parametri in tempo reale (CPU, memoria, throughput delle richieste) visibili in qualsiasi momento nella console di amministrazione ADITUS, quindi è trasparente quante istanze sostengono una vendita e quanto margine rimane. I test di carico programmati verificano nuovamente questi numeri confrontandoli con il sistema di produzione e un'esecuzione chiaramente indietro rispetto ai predecessori viene contrassegnata automaticamente.
Dieci endpoint, nessuna autenticazione per i visitatori, CORS limitato ai domini configurati per coda. La pagina della sala d'attesa ospitata utilizza esattamente questa API: può anche essere gestita direttamente per un'esperienza di attesa completamente personalizzata.
GET /queue/<slug>Pagina sala d'attesa ospitata: richiede un numero, interroga lo stato e inoltra automaticamente il visitatore una volta ammesso.POST /queue/<slug>/joinEmetti un numero di attesa (l'unico scritto nel percorso del visitatore). 423 mentre la coda è in pausa.GET /queue/<slug>/status?number=NEsegui il polling sullo stato di ammissione per un numero: di sola lettura, include un'intestazione Retry-After. 404 per numeri mai emessi.POST /queue/<slug>/tokenScambia un numero ammesso con un JWT HS256 firmato. 425 mentre il numero non è ancora ammesso, 404 per i numeri mai emessi.GET /queue/<slug>/enterPunto di ingresso del gateway: pubblicato al posto dell'URL del negozio. Inoltra direttamente all'URL di destinazione configurato (con token di ammissione) mentre la capacità è disponibile; altrimenti reindirizza nella sala d'attesa. Richiede un URL di destinazione configurato. Accetta ?code=… per codici bypass VIP: un codice valido salta completamente la coda, uno non valido rientra nel percorso normale senza alcun suggerimento.GET /queue/<slug>/embed.jsScript di integrazione lato negozio: ammette i visitatori in silenzio mentre nessuno aspetta; una volta formata la coda, indirizza i visitatori sprovvisti di pass valido nella sala d'attesa e li riporta alla pagina esatta da cui provengono.GET /queue/<slug>/verify?token=…Controllo del token lato server utilizzato dallo script di integrazione: convalida la firma, il pubblico e la scadenza di un token di ammissione.GET /queue/<slug>/infoInformazioni sulla coda pubblica: flag attivo, numero attualmente ammesso e conteggio delle attese.POST /queue/<slug>/heartbeatSegnalazione di presenza per la rilevazione abbandono opzionale: la pagina sala d'attesa segnala un numero come ancora presente. Accettato silenziosamente mentre il rilevamento è disattivato.POST /queue/<slug>/bypassRiscatta un codice di bypass VIP tramite JSON: restituisce un token di ammissione più l'URL di destinazione. I codici non validi, scaduti, esauriti e disabilitati restituiscono tutti lo stesso 404: nessun oracolo per indovinare il codice.GET /queue/<slug>/powSfida proof-of-work per la protezione bot opzionale: restituisce abilitato: false mentre la protezione è disattivata; altrimenti una sfida firmata che /join si aspetta risolta.GET /queue/healthzControllo dello stato pubblico per il monitoraggio dei tempi di attività: risposte senza autenticazione e senza accesso al database. Escluso deliberatamente dalle metriche dell'istanza, in modo che il monitoraggio dei ping non distorca mai il quadro del traffico.// Wartenummer anfordern (einziger Schreibzugriff im Besucherpfad).
const res = await fetch("https://developers.aditus.com/queue/<slug>/join", {
method: "POST",
});
const ticket: {
queue: string; // Queue-Slug
name: string; // Anzeigename des Warteraums
number: number; // vergebene Wartenummer
serving: number; // bis zu dieser Nummer wird weitergeleitet
ahead: number; // Anzahl Nummern vor dieser
admitted: boolean; // true -> sofort weiter zu /token
estimatedWaitSeconds: number;
retryAfterSeconds: number; // empfohlenes Polling-Intervall
} = await res.json();
// 423 Locked -> der Warteraum ist pausiert (keine Weiterleitung, keine neuen Nummern).// Statusabfrage — rein lesend, beliebig oft wiederholbar.
// Der Server sendet zusätzlich einen Retry-After-Header.
const res = await fetch(
"https://developers.aditus.com/queue/<slug>/status?number=" + ticket.number,
);
const status: {
queue: string;
name: string;
active: boolean; // false -> Weiterleitung pausiert
number: number;
serving: number;
ahead: number;
admitted: boolean;
estimatedWaitSeconds: number;
retryAfterSeconds: number;
} = await res.json();
if (status.admitted) {
// -> Token abholen und zum Shop weiterleiten
}// Sobald admitted=true: Zugriffs-Token abholen.
const res = await fetch("https://developers.aditus.com/queue/<slug>/token", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ number: ticket.number }),
});
// 425 Too Early -> die Nummer ist noch nicht zur Weiterleitung freigegeben.
const grant: {
queue: string;
number: number;
token: string; // signierter HS256-JWT
tokenType: "JWT";
expiresInSeconds: number; // Standard: 600 s
targetUrl: string | null; // konfiguriertes Weiterleitungsziel
} = await res.json();
// Weiterleitung übernimmt die gehostete Warteraum-Seite automatisch:
// targetUrl + "?aditus_queue_token=" + grant.tokenL'integrazione script-tag è completa da sola. I negozi che controllano il proprio backend possono inoltre verificare lì il token di ammissione: si tratta di un JWT HS256 standard, verificato offline con il segreto condiviso: nessuna richiamata alla coda, nessuna latenza aggiuntiva. Il segreto viene generato al momento della creazione della coda, mostrato esattamente una volta e può essere ruotato in qualsiasi momento. Reclami: iss è sempre aditus-queue, aud è lo slug della coda, qnr è il numero di attesa ammesso, validità limiti exp (default 10 minuti). Nota: il passaggio silenzioso alla tariffa di ingresso non produce un token: un backend che richiede rigorosamente un token dovrebbe inviare i visitatori che ne sono sprovvisti nella sala d'attesa, che quindi emette immediatamente un token quando nessuno sta aspettando.
// ZIELSYSTEM (dein Shop / deine Seite): Token prüfen — Standard-JWT (HS256).
// Das Secret erhältst du einmalig von ADITUS beim Einrichten des Warteraums.
import jwt from "jsonwebtoken";
const payload = jwt.verify(token, process.env.ADITUS_QUEUE_SECRET!, {
algorithms: ["HS256"],
issuer: "aditus-queue", // iss ist immer aditus-queue
audience: "<slug>", // aud ist der Queue-Slug deines Warteraums
}) as { qnr: number; iat: number; exp: number };
// payload.qnr = die weitergeleitete Wartenummer.
// Gültiger Token -> Besucher passieren lassen (z. B. Cookie setzen).
// Fehlender/ungültiger Token -> zurück in den Warteraum:
// https://developers.aditus.com/queue/<slug>I meccanismi di sicurezza sono descritti dove appartengono nel flusso sopra; questa sezione li raccoglie. Token firmati: i token di ammissione sono JWT HS256, firmati con un segreto per coda che viene mostrato esattamente una volta e può essere ruotato in qualsiasi momento; il legame del pubblico (slug della coda) e una scadenza breve (predefinita 10 minuti) limitano il valore di un token catturato. Protezione dei bot: il controllo opzionale della prova di lavoro rende proporzionalmente costosa l'adesione di massa da parte di bot farm; le sfide sono firmate HMAC e scadono dopo cinque minuti; una protezione per istanza basata sul massimo sforzo elimina inoltre il riutilizzo di una sfida spesa: il vero fattore di costo è il lavoro di hash stesso. Reindirizzamenti: gli URL di ritorno vengono convalidati lato server rispetto ai domini configurati per coda: la sala d'attesa non diventa mai un reindirizzamento aperto. Superficie API: gli endpoint dei visitatori non portano alcuna credenziale, CORS è limitato per coda, l'accesso amministrativo utilizza chiavi API legate ciascuna a una singola sala d'attesa, archiviate solo come hash, non possono gestire altre chiavi e lasciano una traccia di controllo. Picchi di traffico: l'architettura stateless assorbe il carico in base alla progettazione: qualsiasi istanza risponde a qualsiasi richiesta e la piattaforma ridimensiona le istanze automaticamente; il filtraggio DDoS a livello di rete è fornito dalla piattaforma di hosting prima del servizio.
Una sala d'attesa si trova di fronte alle entrate: il suo comportamento in caso di fallimento conta tanto quanto il suo percorso felice.
ADITUS-Queue risolve gli stessi problemi tecnici dei prodotti dedicati alle sale d'attesa virtuali aziendali. La tabella mappa le capacità con cui vengono misurati tali prodotti in base al modo in cui ADITUS-Queue li copre, inclusa un'omissione deliberata.
Tutto ciò che fa la console di amministrazione ADITUS per una singola sala d'attesa (regolazione della tariffa di ingresso, pausa, modifica della configurazione) è disponibile anche per le macchine. L'accesso utilizza una chiave API con il prefisso qak_, inviata come token al portatore; ogni chiave è creata esattamente per una sala d'attesa e può leggere e modificare solo quella stanza. Le chiavi vengono create e revocate nella console di amministrazione, mostrate esattamente una volta e archiviate solo come hash. Il caso d'uso tipico è un runbook in vendita: un job pianificato aumenta il tasso di ammissione subito prima dell'inizio, uno script mette in pausa la coda in caso di emergenza, il monitoraggio legge la configurazione corrente. Si applicano tre barriere: una chiave non raggiunge mai altre sale d'attesa o funzioni di amministrazione globale (test di carico, pianificazioni, istanze) - tali richieste vengono rifiutate lato server; la gestione delle chiavi in sé non è deliberatamente possibile con una chiave: una chiave trapelata non può mai creare o elencare altre chiavi; e ogni modifica apportata con una chiave viene registrata nel registro di controllo sotto il nome della chiave e la sua sala d'attesa.
# Konfiguration des zugeordneten Warteraums lesen. Jeder Key ist an genau
# einen Warteraum gebunden — die Liste enthält daher höchstens diesen einen
# Eintrag; andere Warteräume und globale Verwaltungsfunktionen sind mit
# einem Key nicht erreichbar.
curl -H "Authorization: Bearer qak_…" \
https://developers.aditus.com/api/admin/queue/sites
# Weiterleitungsrate im laufenden Betrieb anheben: Lesen -> Feld ändern -> Schreiben.
# PATCH erwartet die vollständige Konfiguration (ohne slug); unbekannte
# Felder wie id oder Zeitstempel werden serverseitig ignoriert.
KEY="qak_…"; BASE="https://developers.aditus.com/api/admin/queue"
SITE=$(curl -s -H "Authorization: Bearer $KEY" "$BASE/sites" \
| jq '.sites[0]')
echo "$SITE" | jq '.ratePerMinute = 300' | curl -s -X PATCH \
-H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
-d @- "$BASE/sites/$(echo "$SITE" | jq -r .id)"
# Zugeordneten Warteraum pausieren (keine Weiterleitung, keine neuen Nummern):
# active = false
echo "$SITE" | jq '.active = false' | curl -s -X PATCH \
-H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
-d @- "$BASE/sites/$(echo "$SITE" | jq -r .id)"# .github/workflows/onsale.yml — Weiterleitungsrate zum Vorverkaufsstart anheben.
# Den API-Key als Repository-Secret ADITUS_QUEUE_API_KEY hinterlegen. Der Key
# ist an den Warteraum des Vorverkaufs gebunden — mehr kann er nicht.
name: Weiterleitungsrate zum On-Sale anheben
on:
schedule:
- cron: "55 8 14 3 *" # 14. März, 08:55 UTC — kurz vor dem On-Sale
workflow_dispatch: {}
jobs:
raise-rate:
runs-on: ubuntu-latest
steps:
- name: Rate auf 300/min anheben
env:
KEY: ${{ secrets.ADITUS_QUEUE_API_KEY }}
run: |
BASE="https://developers.aditus.com/api/admin/queue"
# Der Key sieht nur seinen gebundenen Warteraum — .sites[0] genügt.
SITE=$(curl -sf -H "Authorization: Bearer $KEY" "$BASE/sites" \
| jq '.sites[0]')
echo "$SITE" | jq '.ratePerMinute = 300' \
| curl -sf -X PATCH \
-H "Authorization: Bearer $KEY" \
-H "Content-Type: application/json" \
-d @- "$BASE/sites/$(echo "$SITE" | jq -r .id)"