Ultimamente abbiamo riscontrato un ritardo molto strano ma molto consistente durante il POSTing dal lato client javascript al nostro server.Misterioso ~ 1min di ritardo nel POST HTTP tra il browser e Nginx
Ecco la nostra tecnologia stack, da davanti a dietro:
- JavaScript personalizzato codice client
- Backbone.js
- Custom Backbone.sync() implementation
- jQuery.ajax() (1.7.2)
- XmlHttpRequest
- Browser (verificato su Firefox e Chrome)
- Internet
- Nginx front-end
- Intranet (via Nginx
http://
monte) - Nginx back-end
- Gunicorn (via Nginx
unix://
presa a monte) - Django 1.4
- django-tastypie
(Nota a margine: non si fa mai un passo indietro in soggezione ? W complicato sviluppo web è)
Ecco una cronologia degli eventi:
- codice client chiama
.save()
su un backbone di nuova creazioneAPIModel
. - La nostra ordinazione
.sync()
si snoda versoclient.send()
che invia l'oggetto appena creato a$.ajax()
. - I POST XmlHttpRequest risultanti. La richiesta viene visualizzata nel pannello Network dello strumento di sviluppo del browser, contrassegnato come in attesa di.
- La richiesta HTTP raggiunge Nginx, che la indirizza al backend django-tastypie.
- Tastypie gestisce la richiesta tempestivamente e in modo impeccabile, creando la risorsa e restituendo una risposta CREATA 201, con un'intestazione
Location
che punta alla nuova risorsa. - Nginx registra la richiesta e (apparentemente) invia la risposta.
- Durata 1.1 minuti, durante il quale la richiesta è ancora contrassegnata come in attesa nel pannello Rete.
- La richiesta è contrassegnata come completa nel pannello Network del browser.
- I jQuery
xhr
gestori di incendi di successo - di success handler rileva il codice e gli incendi 201 risposta fuori una successiva richiesta GET alla Posizione Il nostro client API personalizzata.
- Le solite cose accadono, il GET risponde prontamente e l'oggetto più esterno
$.Deferred()
si risolve, attivando qualsiasi gestore di successo del codice client associato.
Altri particolari da considerare:
- richieste GET e PUT richieste in una stessa determinazione pila prontamente.
- Quando si interagisce direttamente con Nginx più esterno tramite un client HTTP dedicato, le richieste POST identiche alla richiesta in questione vengono risolte immediatamente.
- La rimozione del gestore 201 del caso speciale e il successivo GET non hanno alcun effetto sul bug.
- Il ritardo è sempre 1,1 minuti. Ho usato
console.time()
per determinare che il ritardo varia all'interno della gamma di 65.000 ms. - Il ritardo appare solo in questa configurazione. Non si verifica nelle nostre impostazioni di sviluppo, che sono leggermente più semplici.
presupposti non verificati sto facendo:
- volta Nginx registra una richiesta, la risposta è stato legato con un arco e inviati al cliente con una scritta a mano nota di ringraziamento.
- Questo non è un bug nei browser o in jQuery.
perdonare i minimi dettagli, ma ho fatto del mio meglio per eliminare le variabili, e allo stato attuale, mi sento sicuro nel dire che il problema è uno dei seguenti:
- un difetto nel la struttura fisica dell'universo
- un difetto nei modelli percettivi della nostra mente
- qualcos'altro non abbiamo ancora considerato
sono sperando in # 3. Qualche idea?
_Quando interagisce direttamente con il server tramite un client HTTP dedicato, le richieste POST identiche alla richiesta in questione vengono risolte prontamente._ -> Quale server esattamente? – tomdemuyt
Buona domanda. Il più estremo Nginx. Aggiornato gli altri dettagli per riflettere questo. –
Sembra che ci sia una sorta di attivazione del watchdog di timeout, come se la risposta HTTP non venisse chiusa correttamente. – Pointy