4 - accepter rapidement les tâches entrantes, 5 - renvoyer le résultat de la tâche sur demande 6 - s'il n'y a pas de résultat, renvoyer le statut approprié /* Processeur - un service qui effectue une opération longue et gourmande en ressources. Il est déjà implémenté Les erreurs qu'il renvoie sont exclusivement liées à des données d'entrée incorrectes, sont stables et les re-demander est inutile */ type Processor interface { Process([]byte) ([]byte, error) } /* Nous supposons que nous avons un générateur d'identifiants uniques (par exemple, UUID). Le générateur garantit qu'il n'y aura pas de collisions */ type ID string // func NewID() ID /* Le planificateur accepte des tâches des clients, les met en file d'attente et les lance en traitement. Assure qu'au plus 'threads' méthodes de traitement sont en cours d'exécution simultanément Permet de vérifier le statut de la tâche et d'obtenir le résultat ne bloque pas ses méthodes publiques pour le traitement */ type Scheduler struct { processor Processor } func NewScheduler( prc Processor, threads int, ) *Scheduler { // logique d'initialisation à faire return &Scheduler{ processor: prc, } } func (s *Scheduler) Queue(request []byte) ID { // à implémenter return "" }
Golang
Parlons de l'architecture microservices. Qu'est-ce qui a été plus récent : le support ou le développement?
Comment sont traités les messages envoyés aux utilisateurs hors ligne?
Comment vérifier que la fenêtre contient tous les caractères nécessaires?
/* Nous devons transférer des données d'une source à un consommateur. La source fournit les données en petits lots (~dix enregistrements), tandis que le consommateur fonctionne plus efficacement avec de gros lots (~mille enregistrements). Un exemple réel est le transfert de données depuis des files d'attente de type Kafka vers une base de données Clickhouse. Source : - Pratiquement infinie. - La source ne renvoie jamais plus de MaxItems enregistrements en un seul appel à Next. - Dans le cadre d'une "session" (un appel à la fonction Pipe), la source renvoie de nouvelles données à chaque appel à Next. - Cependant, après un redémarrage, la source recommence à partir de la position "confirmée" précédente, définie par cookie. Par conséquent, *chaque* valeur de cookie renvoyée par Next, après avoir sauvegardé les données dans le récepteur, doit être confirmée avec un appel à Commit, dans le même ordre dans lequel elles ont été renvoyées par Next. Récepteur : - Ne peut traiter plus de MaxItems à la fois. Il faut implémenter la fonction func Pipe(p Producer, c Consumer) error qui lit les données de la source, les regroupe dans un buffer de taille maximale MaxItems et les sauvegarde dans le récepteur, après quoi elle confirme la progression dans la source. */ const MaxItems = 9999 type Producer interface { // Next retourne : // - un lot d'éléments à traiter // - cookie à confirmer une fois le traitement terminé // - erreur Next() (items []any, cookie int, err error) // Commit est utilisé pour marquer le lot de données comme traité Commit(cookie int) error } type Consumer interface { Process(items []any) error } func Pipe(p Producer, c Consumer) error { // TODO }
Avez-vous utilisé des clouds publics ? Si oui, quels fournisseurs et services ?
Parlez-nous de vos projets récents et de la pile technologique utilisée.
Décrivez l'algorithme pour résoudre le problème maxSegment
Raconte-moi ce qui se passe finalement — comment accumulons-nous le tampon?
Est-il correct que vous résidez actuellement à [ville] et qu'il vous serait pratique de travailler en format hybride avec des visites au bureau?
Quelles sont vos attentes salariales ?
Comment limiter le nombre de goroutines pour que pas plus de 'threads' méthodes de Process s'exécutent simultanément ? Qui extraira les tâches du canal ?
// code pour la fonction best() // avec gestion d'erreurs si aucun backend n'est disponible
Avez-vous de l'expérience dans l'écriture de programmes avec multithreading ou opérations asynchrones?
Considérons un exemple : first=[1,1,2], second=[1,2]. Que doit renvoyer votre algorithme et fonctionne-t-il correctement avec les doublons?
Quels anti-modèles dans l'architecture microservices connaissez-vous ?
[nom] a demandé : en conservant la position d'un élément inférieure à X, quelle sera la position ?
Avez-vous occupé des postes de leadership pendant toute votre carrière?
// code pour la fonction best() // avec gestion d'erreurs si aucun backend n'est disponible
Si on vous propose une offre et que vous l'acceptez, combien de temps vous faudrait-il pour commencer à travailler?