Όταν μια λήψη φαίνεται να περιμένει, διαχωρίστε τρία γεγονότα: φτάνουν οι κεφαλίδες απόκρισης, φτάνουν τα byte του σώματος και η εφαρμογή μπορεί να χρησιμοποιήσει ή να αποδώσει το αποτέλεσμα. Ένας μόνο δείκτης φόρτωσης δεν μπορεί να εντοπίσει ποιο από αυτά καθυστερεί.

Τα κανονικά στάδια ροής μπορούν να επικαλύπτονται:

origin produces a chunk → proxy forwards bytes → client consumes them

Ένας proxy μπορεί να γράφει κατάλληλο περιεχόμενο στην cache ενώ το προωθεί. Η προσωρινή αποθήκευση δεν απαιτεί αναμονή ολόκληρου του αρχείου. Το read_ahead_gap του Squid ελέγχει την ανάκτηση που τρέχει μπροστά από την παράδοση, που είναι άλλο είδος αποθήκευσης.

Η αντίστροφη πίεση μπορεί να σταματήσει προσωρινά τις αναγνώσεις προς τα πάνω όταν ένας αργός πελάτης γεμίζει τις ουρές εξόδου. Το Content-Length δίνει επίσης το μήκος χωρίς να απαιτεί πλήρη αποθήκευση. Η κωδικοποίηση HTTP/1.1 chunked επιτρέπει σταδιακή παράδοση, αλλά δεν μπορεί να υποσχεθεί χαμηλή καθυστέρηση αν ένα προηγούμενο συστατικό κρατά τα δεδομένα.

Στη συνέχεια εξετάστε τα στάδια επεξεργασίας. Η επανεγγραφή ή η επιθεώρηση μπορεί να χρειάζονται μέρος ή όλο το σώμα. Η συμπίεση και η πλαισίωση εφαρμογής μπορούν να καθυστερήσουν χρήσιμη έξοδο. Στον πελάτη, μια μέθοδος που περιμένει πλήρη πίνακα byte επιστρέφει αργότερα, και ένα πρόγραμμα περιήγησης μπορεί να λάβει byte πριν μπορέσει να τα αποδώσει.

Μετά από επιτυχές CONNECT, ένας συνηθισμένος proxy προωθεί τη ροή της υπηρεσίας χωρίς να χρειάζεται το τελικό μήκος του αρχείου της σήραγγας. Ακολουθήστε το πρώτο γεγονός που λείπει παραπάνω πριν αλλάξετε τις ρυθμίσεις buffer ή χρονικού ορίου. Όταν ο curl είναι ο παρατηρητής, η επιλογή no-buffer αλλάζει το τοπικό στάδιο εξόδου.

Σχετικά άρθρα