Golang
Qu'est-ce qui était mis en cache ? Des référentiels ?
/* Nous devons transférer des données d'une source à un consommateur. La source fournit les données en petits lots (~dizaines d'enregistrements), tandis que le consommateur fonctionne plus efficacement avec de gros lots. Un exemple réel est le transfert de données depuis des files d'attente de type Kafka vers la base de données Clickhouse. Source: - Pratiquement infinie. - La source ne renvoie jamais plus de MaxItems en un seul appel à Next. - Dans 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 recommencera à partir de la position "confirmée" précédente, indiquée 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 pas traiter plus de MaxItems à la fois. Niveau de base: Il est nécessaire d'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, puis confirme la progression dans la source. */ const MaxItems = 9999 type Producer interface { // Next retourne: // - un lot d'éléments à traiter // - un cookie à confirmer lorsque le traitement est terminé // - une 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 { var buf []any var cookies []int for { items, cookie, err := p.Next() if err != nil { return err } buf = append(buf, items...) cookies = append(cookies, cookie) if len(buf) >= MaxItems { if err := c.Process(buf); err != nil { return err } for _, c := range cookies { if err := p.Commit(c); err != nil { return err } } buf = buf[:0] cookies = nil } } if len(buf) > 0 { if err := c.Process(buf); err != nil { return err } for _, c := range cookies { if err := p.Commit(c); err != nil { return err } } } return nil }
Pouvez-vous énumérer les entreprises ou fournisseurs avec lesquels vous avez traité?
Parlez-moi de votre dernier emploi : que faisiez-vous, quelles technologies utilisiez-vous, quels étaient les défis difficiles ?
Qu'est-ce qu'un slice en Go?
Pouvez-vous énumérer les principaux types d'appels utilisés dans gRPC?
Est-il permis d'obtenir des informations d'un canal avec un mode fermé activé?
Peut-on écrire directement dans une partition Kafka spécifique, en évitant la clé pour le hachage?
Pouvez-vous expliquer le mécanisme d'ajout d'un élément à la fin d'une structure de données, comme une liste ou un tableau ?
Quelles données et de quelle manière sont placées dans la pile lors de l'exécution du programme?
Quels méthodes de mise en cache préférez-vous utiliser dans vos projets et pourquoi?
Quelle est la différence entre une vue matérialisée et une vue normale?
Quels composants entrent dans la structure d'une liste chaînée?
Comment est déterminé le temps d'exécution de l'opération d'ajout d'un élément par clé dans la structure de données Map?
Pourquoi la taille initiale de la pile des threads est-elle généralement fixée à 2 Mo?
Avez-vous déjà utilisé la structure ErrGroup dans vos projets pour gérer des tâches parallèles?
Quels packages inhabituels ou non standard avez-vous utilisés dans votre pratique?
Pourquoi la croissance de la tranche ralentit-elle et pourquoi ne peut-on pas continuer à doubler constamment?
À quel endroit les commandes sont-elles exécutées lors du processus de travail de GitLab CI/CD?
Quelles conséquences peuvent survenir en cas de non-respect des principes SOLID dans la conception logicielle?