Golang
Υλοποιήστε την απόκτηση των 5 κορυφαίων υπηρεσιών σε O(N) χρησιμοποιώντας μια βοηθητική δομή
Οι ενημερώσεις εγγράφων φτάνουν στην υπηρεσία message Document { string Url = 1; // URL του εγγράφου, ο μοναδικός του αναγνωριστικός uint64 PubDate = 2; // δηλωμένος χρόνος δημοσίευσης του εγγράφου uint64 FetchTime = 3; // χρόνος λήψης αυτής της ενημέρωσης εγγράφου, μπορεί να θεωρηθεί ως αναγνωριστικό έκδοσης. Το ζεύγος (Url, FetchTime) είναι μοναδικό. string Text = 4; // κείμενο του εγγράφου uint64 FirstFetchTime = 5; // αρχικά απουσιάζει, πρέπει να συμπληρωθεί } Τα έγγραφα μπορούν να φτάσουν σε οποιαδήποτε σειρά (όχι με τη σειρά που ενημερώθηκαν), και μπορεί να υπάρχουν διπλά μηνύματα. Είναι απαραίτητο να δημιουργηθούν στην έξοδο ίδια μηνύματα, αλλά με διορθωμένα πεδία σύμφωνα με τους ακόλουθους κανόνες (όλα τα παρακάτω αφορούν μια ομάδα εγγράφων με το ίδιο πεδίο Url): Το πεδίο Text και FetchTime πρέπει να είναι ίσα με αυτά του εγγράφου με το μεγαλύτερο FetchTime που έχει ληφθεί μέχρι τώρα. Το πεδίο PubDate πρέπει να είναι ίσο με αυτό του μηνύματος με το μικρότερο FetchTime. Το πεδίο FirstFetchTime πρέπει να είναι ίσο με την ελάχιστη τιμή FetchTime. Με άλλα λόγια, σε κάθε στιγμή παίρνουμε το PubDate και το FirstFetchTime από την πρώτη έκδοση που έχει ληφθεί μέχρι τώρα (αν τα ταξινομήσουμε κατά FetchTime), και το Text από την τελευταία. Ο διασυνδεδεμένος κώδικας μπορεί να υλοποιηθεί ως: type Processor interface { Process(doc *Document) (*Document, error) } Αυτός ο κώδικας θα λειτουργεί σε μια υπηρεσία που διαβάζει μηνύματα από μια ουρά (Kafka ή παρόμοια), και επίσης γράφει το αποτέλεσμα στην ουρά. Αν το Process επιστρέφει Null, τίποτα δεν γράφεται στην ουρά.
Έχεις εμπειρία με gRPC και GraphQL; Μίλησέ μας γι'αυτά.
Με ποιες μισθολογικές προσδοκίες βασίζεστε;
Γνωρίζεις το προϊόν Loop;
Πώς αισθάνεσαι σχετικά με τις υπηρεσίες; Έχεις τέτοια εμπειρία;
Πώς ήταν ακριβώς η διαδρομή της αισιόδοξης κλειδώματος από τη λήψη του μηνύματος από το Kafka μέχρι την ενημέρωση στη βάση δεδομένων;
Πώς λαμβάνεις τις εργασίες, από ποιον έρχονται;
Έχεις εμπειρία στη βελτιστοποίηση ερωτημάτων σε σχεσιακές βάσεις δεδομένων;
Πώς χρησιμοποιήσατε Kafka και RabbitMQ ως brokers; Γιατί δύο;
Πώς να παραλληλοποιήσετε την επεξεργασία των logs χρησιμοποιώντας ένα worker pool; Πώς να λαμβάνετε αποτελέσματα από τις goroutines;
Τι είναι οι πίνακες και τα slices στο Go, πώς διαφέρουν; Πώς λειτουργεί το append και η επέκταση της capacity;
Ποιο είναι το πλεονέκτημα της αναπαραγωγής; Ποιες είναι οι δαπάνες που συνεπάγεται;
// Έχουμε μια μέθοδο για την απόκτηση πληροφοριών σχετικά με τα προϊόντα, αυτή η μέθοδος καλείται πολύ συχνά // υπάρχουν προβλήματα σε αυτόν τον κώδικα και πώς μπορούμε να τα διορθώσουμε; βάση δεδομένων postgress func (r *ProductRepository) GetProductDetails(ctx context.Context, productIDs []int) []Product { products := make([]Product, 0, len(productIDs)) for _, id := range productIDs { go func(id int) { var p Product query := "SELECT name, price, description FROM products WHERE id = $1" err := r.db.QueryRowContext(ctx, query, id).Scan(&p.Name, &p.Price, &p.Desc) if err != nil { r.logger.Error("error get product", "err", err) return } products = append(products, p) }(id) } return products }
Επηρεάζει το μέγεθος του buffer του καναλιού κάτι στο worker pool;
Πότε υπολογίζονται τα επιχειρήματα των καθυστερημένων συναρτήσεων — κατά τον ορισμό ή κατά την κλήση της συνάρτησης;
Πώς να αλληλεπιδράσετε με τους εμπόρους που βρίσκονται στο εξωτερικό περίγραμμα;
Ποια μέσα συγχρονισμού υπάρχουν στον ανταγωνισμό στο Go;
Τι δεδομένα αποθηκεύανε στο Redis και πώς καταλάβαιναν ότι οι διαφημίσεις ήταν καυτές;
Γιατί να χρησιμοποιούμε διεπαφές;