Η συνομιλία διατηρεί τη σύνδεση όταν ο τηλέφωνο κοιμάται
Ο agent του Mythex μπορεί να δουλεύει λεπτά σε ένα αίτημα, και εσείς μπορεί να το παρακολουθείτε από ένα τηλέφωνο — που κλειδώνει, αλλάζει εφαρμογές και αλλάζει δίκτυα όσο δουλεύει. Δύο σφάλματα έκαναν αυτό να πάει στραβά. Στο ένα, η συνομιλία θεωρούσε κάθε σήμα «η σελίδα είναι ξανά ορατή» ως απόδειξη ότι η σύνδεσή της είχε πέσει, και έκανε επανάληψη μέχρι να μείνει στο «Σύνδεση…». Στο άλλο, ένα τηλέφωνο που κοιμήθηκε κατά την πρώτη απάντηση μιας νέας συνομιλίας επέστρεφε με μόνο τα πρώτα λίγα κομμάτια της, μέχρι να ανανεώσετε χειροκίνητα τη σελίδα. Και τα δύο έχουν διορθωθεί.
Πώς η συνομιλία ακολουθεί μια σειρά που τρέχει
Όσο δουλεύει ο agent, η συνομιλία κρατά ανοιχτή μια ροή από τους servers μας: κάθε βήμα — μια σκέψη, μια κλήση εργαλείου, ένα κομμάτι της απάντησης — φτάνει ως γεγονός. Αν η ροή πέσει, η συνομιλία επανασυνδέεται και ο server ξαναστέλνει τα πρόσφατα γεγονότα από μια μνήμη που κρατά τα τελευταία 120 δευτερόλεπτα. Όταν τελειώσει η σειρά, η συνομιλία ζητά επίσης από τον server το αποθηκευμένο ιστορικό και συγκρίνει ό,τι είχε εμφανίσει με ό,τι είναι αποθηκευμένο. Αυτό το τελευταίο βήμα πιάνει ό,τι τυχόν έχασε η ροή.
Για να ξεχωρίζει μια ζωντανή σύνδεση από μια νεκρή όταν δεν συμβαίνει τίποτα, ο server στέλνει ένα μικρό «ping» κάθε 15 δευτερόλεπτα.
Σφάλμα 1: το ξύπνημα σκότωνε μια υγιή ροή
Οι browsers ενημερώνουν μια σελίδα όταν γίνεται ξανά ορατή: μετά από αλλαγή καρτέλας, μετά το ξεκλείδωμα της οθόνης. Το χρησιμοποιούσαμε ως ένδειξη να ελέγξουμε τη σύνδεση — και στην πράξη, να διακόψουμε τη ροή και να επανασυνδεθούμε, υποθέτοντας ότι είχε πέσει ενώ ήταν κρυφή.
Στα τηλέφωνα και στους ενσωματωμένους browsers, αυτά τα γεγονότα συμβαίνουν πολύ πιο συχνά απ' ό,τι πέφτουν οι ροές — σε κάθε αλλαγή καρτέλας, σε κάθε ξεκλείδωμα, και σε μερικούς ενσωματωμένους browsers κάθε λίγα δευτερόλεπτα. Κάθε τέτοιο γεγονός διέκοπτε μια υγιή ροή. Η συνομιλία επανασυνδεόταν, έπαιρνε επανάληψη, διακοπτόταν ξανά, και κατέληγε να κάθεται στο «Σύνδεση…». Μετά έλεγε ότι η σειρά είχε τελειώσει ενώ ο agent συνέχιζε να δουλεύει.
Η διόρθωση: κρίνουμε τη ροή από το αν μιλάει
Η συνομιλία καταγράφει πλέον πότε η ροή κάθε project έλαβε οτιδήποτε τελευταία φορά — γεγονότα και τα pings των 15 δευτερολέπτων. Ένα σήμα «ξανά ορατή» διακόπτει μια ροή μόνο αν έχει σιωπήσει για 25 δευτερόλεπτα: περισσότερο από το διάστημα του ping συν μια αργή διαδρομή δικτύου, ώστε μια ζωντανή ροή να μη φτάνει ποτέ σε αυτό το όριο. Οι δοκιμές ελέγχουν ότι ένα ping μετράει ως σημάδι ζωής και ότι μια ροή που μόλις έστειλε ping δεν θεωρείται νεκρή.
Ο κανόνας που βγήκε από αυτό: η ορατότητα μιας σελίδας λέει κάτι για τη σελίδα, όχι για τη σύνδεση δικτύου. Ρωτήστε τη σύνδεση.
Σφάλμα 2: μισή απάντηση μετά το ξύπνημα του τηλεφώνου
Αυτό μπορούσαμε να το αναπαράγουμε κάθε φορά στον προσομοιωτή iOS:
- Ξεκινήστε μια νέα συνομιλία και στείλτε ένα αίτημα που παίρνει χρόνο.
- Αφήστε το τηλέφωνο να κοιμηθεί κατά τη διάρκεια του build.
- Επιστρέψτε αφού τελειώσει η σειρά και έχει λήξει η μνήμη των 120 δευτερολέπτων.
Η συνομιλία έδειχνε τα πρώτα λίγα μπλοκ της απάντησης, σημειωμένα ως ολοκληρωμένα — και έμενε έτσι μέχρι να ανανεώσετε τη σελίδα.
Γιατί
Μια νέα συνομιλία δεν έχει νήμα — την αποθηκευμένη της συνομιλία — μέχρι να δημιουργηθεί από το πρώτο μήνυμα. Αυτό συμβαίνει μέσα στη συνάρτηση αποστολής, μετά που η αποστολή είχε ήδη πιάσει το βήμα συμφιλίωσης, το οποίο ακόμα νόμιζε ότι δεν υπήρχε νήμα. Έτσι, στο τέλος της πρώτης σειράς σε νέα συνομιλία, η συμφιλίωση δεν έβλεπε νήμα και επέστρεφε σιωπηλά χωρίς να ζητήσει τίποτα.
Συνήθως κανείς δεν το πρόσεχε, επειδή η ροή είχε ήδη παραδώσει ολόκληρη τη σειρά. Όμως ένα τηλέφωνο που κοιμήθηκε κατά τη σειρά και επέστρεψε αφού είχε λήξει η μνήμη των 120 δευτερολέπτων δεν μπορούσε να πάρει τα χαμένα γεγονότα από τη ροή — και η συμφιλίωση που θα τα συμπλήρωνε δεν είχε τρέξει ποτέ.
Η διόρθωση
- Η αποστολή λέει στη συμφιλίωση σε ποιο νήμα ανήκει η σειρά, ώστε η πρώτη σειρά μιας νέας συνομιλίας να συμφιλιώνεται όπως κάθε άλλη. Αν έχετε ανοίξει άλλη συνομιλία μέχρι να επιστρέψει η απάντηση, το αποτέλεσμα απορρίπτεται αντί να εμφανιστεί στη λάθος θέση.
- Μια αποτυχημένη συμφιλίωση επαναλαμβάνεται. Ένα τηλέφωνο που ξυπνά σε κακή σύνδεση μπορεί να βρει τη σειρά τελειωμένη και μετά να αποτύχει να την φέρει. Αυτό τώρα θυμάται, και η συνομιλία ζητά ξανά όταν εμφανιστεί η καρτέλα ξανά ή επανέλθει το δίκτυο.
- Το «Δούλεψε για» είναι ειλικρινές. Κάθε απάντηση δείχνει πόση ώρα δούλεψε ο agent. Αν η καρτέλα δεν είδε ποτέ το μήνυμα τέλους σειράς του server, συμπλήρωνε τον χρόνο από το δικό της ρολόι — που μετρούσε από την Αποστολή μέχρι να ξυπνήσει το τηλέφωνο, συμπεριλαμβανομένου του χρόνου που ήταν μακριά. Τώρα αυτός ο αριθμός σημειώνεται ως εκτίμηση, και αντικαθίσταται από την αποθηκευμένη διάρκεια μόλις φτάσει το ιστορικό.
Τι μάθαμε από αυτό
- Δοκιμάζετε στη συσκευή που πραγματικά χρησιμοποιούν οι άνθρωποι, με τον τρόπο που τη χρησιμοποιούν. Και τα δύο σφάλματα ζούσαν στο κενό ανάμεσα σε «μια ροή που δουλεύει» και «ένα τηλέφωνο στην τσέπη».
- Ένα εφεδρικό βήμα που δεν έτρεχε ποτέ δεν είναι εφεδρικό. Η συμφιλίωση υπήρχε ακριβώς για αυτή την περίπτωση, και την παρέκαμπτε σιωπηλά.
- Επαναλάβετε και την ανάκτηση. Η στιγμή που ξυπνά ένα τηλέφωνο είναι συχνά και η στιγμή που η σύνδεσή του είναι χειρότερη.
- Μην δείχνετε μια εκτίμηση ως γεγονός. Μια διάρκεια μετρημένη με λάθος ρολόι είναι χειρότερη από καμία· σημειώστε την ως εκτίμηση ή αντικαταστήστε την.
Η ίδια δουλειά τακτοποίησε και μερικά πράγματα που θα δείτε ενώ τρέχει μια σειρά: τα βήματα της φλοιού επισημαίνονται με την εντολή που κάνει τη δουλειά και όχι με cd, τα στιγμιότυπα οθόνης στη συνομιλία κρατούν το πάνω αριστερό μέρος της σελίδας και χωρούν στη στήλη, και ένα νέο project παίρνει το αυτόματα δημιουργημένο όνομά του χωρίς ανανέωση.
Αν χτίζετε τη δική σας εφαρμογή για τηλέφωνα, οι οδηγοί μας για το πώς να χτίσετε μια εφαρμογή ιστού φιλική προς κινητά και native εφαρμογές vs progressive web apps καλύπτουν τα βασικά. Περισσότερα για τη συνομιλία υπάρχουν στα docs της συνομιλίας.