Με ποιες βιβλιοθήκες γράφονται μετρήσεις σε Go;
Golang
Για ποιο λόγο γράφτηκε αυτός ο κώδικας; Ποιο επιχειρηματικό και τεχνικό πρόβλημα επιλύει;
Ποιες μετρήσεις; Με ποια εργαλεία θα καταγράψουμε αυτές τις μετρήσεις;
// Άσκηση 4 // Σε μια "τυπική" υπηρεσία CRUD, σε κάποιο σημείο, ορισμένες μέθοδοι άρχισαν να λειτουργούν αργά και η υπηρεσία άρχισε να timeout. // Η υπηρεσία αποτελείται από: // * Application Load Balancer (L7) - λήψη εισερχόμενων αιτημάτων και τερματισμός TLS // * Backend (rest, java/kotlin ή golang) - επεξεργασία εισερχόμενων αιτημάτων και επιχειρηματική λογική // * Βάση δεδομένων (postgres) - αποθήκευση και επεξεργασία SQL ερωτημάτων // Πώς πρέπει να ενεργήσετε σωστά για να κατανοήσετε την αιτία των προβλημάτων και να αναπτύξετε λύσεις για τη βελτίωση της κατάστασης;
// Ερώτηση 3 // Περιγράψτε ποια εργασία επιλύει αυτός ο κώδικας // Ποια προβλήματα υπάρχουν σε αυτήν την λύση; // Πώς θα ξαναγράφατε αυτόν τον κώδικα;
Τι να κάνετε με τη βάση δεδομένων και τον load balancer σε περίπτωση προβλημάτων απόδοσης;
Πώς να αποκτήσετε πρόσβαση στον profiler pprof στον παραγωγικό διακομιστή;
Τι έκανες στη δουλειά;
// Άσκηση 3 // Περιγράψτε ποια εργασία επιλύει αυτός ο κώδικας // Ποια προβλήματα υπάρχουν σε αυτήν την λύση; // Πώς θα ξαναγράφατε αυτόν τον κώδικα; var c int type Trace struct { // Ορισμένα πεδία εδώ } type Sender interface { Send(Trace) } func Do(sender Sender, tr Trace) { c++ if c == 100 { sender.Send(tr) c = 0 } }
Σε ποια indices βασίστηκες στη δουλειά; Τι εφαρμόζατε στην πράξη; Στο Wildberries;
Πώς λειτουργεί η διαμέριση στο PostgreSQL στον πυρήνα;
Τι θα κάνετε όταν οι προτεραιότητες στην ομάδα σας αλλάζουν κάθε μέρα και εμφανίζονται νέα επείγουσα καθήκοντα;
Ποια ευρετήρια χρησιμοποιείτε στο PostgreSQL;
Ποια προβλήματα υπάρχουν στον κώδικα με το παγκόσμιο μετρητή; Πώς να το διορθώσετε;
Πώς να κάνετε το Increaser καθολικό — όχι συνδεδεμένο με τον αριθμό 100;
Σε ποιο γράφημα είδατε το πρόβλημα κατά τη χρήση του pprof;
// Ερώτηση 3 // Περιγράψτε ποια εργασία επιλύει αυτός ο κώδικας // Ποια προβλήματα υπάρχουν σε αυτήν την λύση; // Πώς θα ξαναγράφατε αυτόν τον κώδικα; var c int var mu sync.RWMutex type Trace struct { // Ορισμένα πεδία εδώ } type Sender interface { Send(Trace) } func Do(sender Sender, tr Trace) { mu.Lock() defer mu.Unlock() c++ if c == 100 { go func() { sender.Send(tr) }() c = 0 } }
func normalize2(str []rune) []rune { result := str[:0] for val := range str { if val != ' ' { result = append(re) } } l, r := 0, 0 isSpace := false for i := 0, i < len(str); i++ { val := string(str[i]) if val == " " { if isSpace { continue } else { str[r] = val r++ isSpace = true } } else { str[r] = val r++ isSpace = false } } return str[:r] }
Μπορεί το Increaser να γίνει υλοποίηση του Sender; Ποια είναι η λογική διαφορά μεταξύ Increaser και Sender;
Μπορείς να εξηγήσεις πώς σχεδίασες και υλοποίησες το API REST και gRPC για τις εσωτερικές και εξωτερικές υπηρεσίες της πλατφόρμας;