Come trovare l'unica riga che rende lento un checkout.
Quando un negozio sembra lento e i server sono inattivi, l'attesa è di solito una chiamata sincrona al sistema di qualcun altro dentro il percorso della richiesta. Il metodo che trasforma «sembra lento» in un file e una riga.
In questo articolo 8 sezioni
I reclami su un negozio lento sono del tipo vago, reputazionale. Nessuno stack trace, nessun numero di riga, solo un commerciante che riferisce che un acquirente l'ha detto, e l'aritmetica sotto: un checkout lento è un carrello abbandonato, e un carrello abbandonato è fatturato che esce dalla porta a metà acquisto. Quindi il primo compito non è sistemare nulla. È trasformare una sensazione in una posizione.
- Misurate la piattaforma sotto il carico che fallisce, non in un momento tranquillo: CPU, load, memoria, disco, su ogni livello. Se ogni livello è inattivo, l'attesa vive nell'applicazione o in qualcosa che essa chiama.
- Non fidatevi della homepage in cache. È servita dal CDN e non dimostra nulla sul carrello e sul checkout, che eseguono codice applicativo live a ogni richiesta.
- Catturate ogni richiesta più lenta di una soglia e raggruppate gli stack trace per il punto in cui ogni richiesta è bloccata, non per dove è partita. Un gruppo torreggia sugli altri, ed è di solito una chiamata sincrona a un sistema che il negozio non gestisce.
- Consegnate il file esatto, la riga esatta e la correzione: un timeout breve con un fallback, la chiamata esterna spostata in un job in background, e le query sottostanti indicizzate perché cerchino invece di scansionare.
Il reclamo arriva come una sensazione
La formulazione è reputazionale, non tecnica: un acquirente ha detto al commerciante che il sito sembrava lento, e il commerciante lo riferisce. Per un negozio, «checkout lento» non è una pignoleria: sono carrelli abbandonati al passo del pagamento, il posto più costoso di tutto il sito in cui perdere qualcuno. Questo inquadra l'urgenza, ma non indica alcuna direzione. Lento è una sensazione, non una posizione.
Un allarme sulle risorse vi dice dove guardare. «Il sito è lento» non vi dice nulla: potrebbe essere la rete, l'host, il database, l'applicazione, o un terzo che il negozio nemmeno gestisce. Prima di poterlo sistemare dovete trasformare una sensazione in un numero di riga. Il resto di questo post è come farlo.
Misurate prima la piattaforma sotto il carico che fallisce
Partite dalla piattaforma, misurata sotto l'esatto carico che sta fallendo: CPU, load average, memoria libera, utilizzo del disco, sul livello web e sul database. Leggeteli mentre la lentezza sta accadendo, non da un dashboard mediato su una settimana tranquilla. Se ogni livello è inattivo, l'attesa vive nell'applicazione o in qualcosa che essa chiama, e il resto del metodo serve a trovare cosa.
È lì che molte diagnosi si fermano. «È l'app» è vero e inutile per un commerciante: scagiona l'host e lascia il negozio esattamente bloccato come prima. Il proprietario di un negozio non vuole sapere che è l'app. Vuole sapere quale riga, e perché. Quindi il metodo prosegue dentro codice che non è nostro da sistemare, perché trovare la riga è il vero deliverable.
La homepage cercherà di nasconderlo
La prima cosa che un controllo a campione mostra sembra rassicurante, ed è questa la trappola. La homepage, in cache sul CDN, torna veloce. Se controllate un negozio caricando la sua pagina iniziale, concludete che va tutto bene e chiudete il ticket. Ma una homepage in cache non dimostra nulla sul checkout, perché il dolore vive solo sui percorsi che non possono essere messi in cache: il carrello dinamico e il checkout, dove il negozio esegue il suo vero codice a ogni richiesta.
| La homepage in cache | Il percorso del checkout |
|---|---|
| Servita dal bordo del CDN | Esegue codice applicativo live ogni volta |
| DOVE VIVE IL DOLOREVeloce a ogni controllo a campione | Dove vive davvero ogni secondo dell'attesa |
| Sembra perfettamente sana | Mai toccato da un controllo a campione sulla homepage |
Raggruppate per dove si blocca, non per dove parte
La mossa che spacca il caso trasforma il rumore in una confessione. Invece di indovinare, catturate ogni richiesta più lenta di una soglia su tutti i nodi web, poi raggruppate gli stack trace per l'unica cosa che conta. Non dove ogni richiesta è partita (partono tutte da un URL), ma la riga esatta in cui ogni richiesta è bloccata, ferma ad aspettare. Raggruppate migliaia di richieste lente per il loro punto di blocco e le congetture finiscono. Un gruppo torreggia sugli altri, e in un negozio è di solito una chiamata in uscita dal vivo verso un sistema che il negozio non gestisce: un controllo di giacenza, una ricerca di prezzo, un punteggio antifrode, un ERP, seduto dentro la validazione dell'ordine. Una chiamata al database che alimenta la stessa integrazione è di solito il gruppo subito sotto.
Leggete una richiesta bloccata dall'inizio alla fine
Lo stack di una richiesta bloccata mostra l'intera catena dal punto di ingresso fino alla chiamata esterna su cui sta aspettando: il pulsante di pagamento in cima, la validazione dell'ordine nel mezzo, e in fondo una chiamata verso una macchina su un'altra rete, dove la richiesta resta finché quella macchina non risponde. Quella è l'immagine da mostrare al commerciante, perché non ha bisogno di interpretazione: una persona che sta cercando di dare soldi al negozio sta aspettando un sistema che il negozio non gestisce prima ancora che l'ordine venga validato.
Poi leggete la configurazione del client per quella chiamata. Il tetto dell'attesa è una singola riga: il suo timeout. Un timeout del client impostato in minuti, dove il percorso di pagamento ha bisogno di secondi, significa che un acquirente può essere trattenuto al pulsante di pagamento per tutto il tempo che il partner impiega a rispondere, e la giornata lenta del partner diventa quella del negozio.
“Un acquirente che cerca di pagare sta aspettando una macchina che il negozio non gestisce, su una rete che il negozio non gestisce, prima ancora che l'ordine venga validato.”
Controllate le query sottostanti
Il log delle query lente del database di solito punta alla stessa integrazione: le query che la alimentano scansionano invece di cercare, e stanno nello stesso percorso. La chiamata esterna è lenta, le query sotto di essa sono lente, ed entrambe stanno tra l'acquirente e l'ordine. Sistemare la chiamata senza le query lascia il secondo collo di bottiglia al suo posto.
Non riscriviamo il vostro checkout. Vi consegniamo la riga.
Non riscriviamo il checkout di un cliente: è il suo codice, la sua logica di business, il suo rischio. Ciò che consegniamo è più utile e più difficile da ottenere: il file esatto, la riga esatta e la correzione specifica. Tre mosse, in ordine.
Mettete un tetto al timeout.
Tagliate il timeout a pochi secondi con un fallback graduale, così che un partner lento degradi un numero di giacenza invece di congelare l'intero pagamento.
Toglietela dal percorso della richiesta.
Spostate la chiamata esterna fuori dalla richiesta live in un job in background. Il pagamento di un acquirente non dovrebbe aspettare, dal vivo, la risposta di un terzo.
Sistemate le query sottostanti.
Indicizzate e riscrivete le query che alimentano l'integrazione, così che i dati dietro di essa smettano di essere un secondo collo di bottiglia.
- Una chiamata dal vivo a un sistema esterno dentro la validazione dell'ordine
- Un timeout misurato in minuti sul passo del pagamento
- L'acquirente che aspetta al pulsante di pagamento
- Scansioni complete di tabella eseguite in linea con il checkout
- La chiamata esterna spostata in un job in background
- Un timeout di pochi secondi con un fallback graduale
- Il pulsante di pagamento risponde con il budget della piattaforma stessa
- Le query indicizzate e riscritte
La lezione
Un server sano e inattivo non è quasi mai il posto in cui vive la lentezza. Quando la piattaforma è calma e l'acquirente aspetta, l'attesa è nel livello applicativo o in qualcosa che esso chiama, e il metodo qui sopra trova quale riga.
Tenete le chiamate sincrone a terze parti fuori dal percorso della richiesta. Date ai sistemi esterni un timeout breve e un fallback, e fate il lavoro vero in un job in background. Il percorso della richiesta appartiene all'acquirente.
Risposte dirette
Perché il mio checkout è lento quando il resto del sito è veloce?+
Di solito perché la parte veloce è in cache e quella lenta no. Una homepage servita da un CDN risponde veloce e non vi dice nulla sul checkout, che esegue il vostro codice applicativo live a ogni richiesta, inclusa qualsiasi chiamata a terze parti seduta nel percorso di pagamento. Controllate il carrello dinamico e il checkout, non la pagina iniziale.
Un checkout lento è un problema di hosting o di applicazione?+
Vale la pena dimostrarlo, non presumerlo. Misurate il livello web e il database sotto lo stesso carico live: CPU, load, memoria, disco. Se nulla è a corto di risorse, l'attesa è nell'applicazione o in qualcosa che essa chiama, e il passo successivo è catturare le richieste lente e leggere dove si bloccano.
Cos'è una chiamata sincrona a terze parti nel percorso del checkout?+
È quando il vostro checkout si blocca e aspetta, dal vivo, un sistema esterno prima di lasciar procedere l'ordine: un ERP, un servizio di giacenze, un punteggio antifrode, controllati dentro la validazione dell'ordine. Se quel partner è lento, il vostro acquirente aspetta esattamente quanto lui, fino al timeout configurato, e un timeout impostato in minuti è un tetto misurato in minuti.
Come si trova quale riga rende lenta una pagina?+
Catturate ogni richiesta più lenta di una soglia su tutti i nodi web, poi raggruppate gli stack trace per la riga esatta in cui ogni richiesta è bloccata, non per dove è partita. Il gruppo più grande è la vostra risposta.
Sistemerete il codice al posto mio?+
Non riscriviamo il vostro checkout: è la vostra logica di business. Vi consegniamo il file esatto, la riga esatta e la correzione specifica: accorciate il timeout con un fallback, spostate la chiamata a terze parti in un job in background, e noi indicizzeremo e riscriveremo le query lente sottostanti. La diagnosi, consegnata con precisione, è il prodotto.
Un pulsante di pagamento dovrebbe chiamare direttamente un ERP o un'altra terza parte?+
Tenetela fuori dal percorso della richiesta. Un sistema su un'infrastruttura che non controllate non dovrebbe stare tra l'acquirente e il pagamento. Dategli un timeout breve e un fallback graduale così che possa fallire senza tirare giù il checkout, e spostate la chiamata vera in un job in background.
Qualcosa nel vostro checkout è lento. Troveremo la riga.
Parlate con un ingegnere che leggerà il vostro percorso lento fino al file e alla riga, e lo dirà chiaramente quando la risposta vive nel vostro codice.
Parla con un ingegnereLa disciplina qui è la stessa dietro altre due letture: come dimensionare un server, dove la maggior parte delle persone ha bisogno di meno di quanto pensi, e perché un server nuovo fa benchmark più lenti del vecchio quando non lo è.
Siete arrivati alla fine.
Mettete la lettura al lavoro
Cosa fate girare?
Raccontateci il carico di lavoro, il traffico e i requisiti di ripristino. Partite dal configuratore di server, oppure discutete i dettagli con un ingegnere.
Scritto dagli ingegneri che costruiscono e gestiscono l'infrastruttura che descrive.Parla con un ingegnere
