Golang
Was wurde zwischengespeichert? Irgendwelche Verzeichnisse?
/* Wir müssen Daten von einer Quelle zu einem Verbraucher übertragen. Die Quelle liefert die Daten in kleinen Chargen (~zehn Einträge), während der Verbraucher effizienter mit größeren Chargen arbeitet. Ein echtes Beispiel ist die Übertragung von Daten aus Kafka-Queues in die Clickhouse-Datenbank. Quelle: - Praktisch unendlich. - Die Quelle gibt nie mehr als MaxItems Datensätze in einem einzelnen Next-Aufruf zurück. - Innerhalb einer "Sitzung" (einem Aufruf der Funktion Pipe) liefert die Quelle bei jedem Next neue Daten. - Nach einem Neustart beginnt die Quelle wieder bei der vorherigen "bestätigten" Position, die durch cookie bestimmt wird. Daher muss jeder Wert von cookie, den Next zurückgibt, nach der Speicherung der Daten im Empfänger mit einem Commit bestätigt werden, und zwar in genau der Reihenfolge, in der sie von Next zurückgegeben wurden. Empfänger: - Kann nicht mehr als MaxItems auf einmal verarbeiten. Basisebene: Es ist erforderlich, die Funktion func Pipe(p Producer, c Consumer) error zu implementieren, die Daten aus der Quelle liest, sie in einen Puffer mit maximaler Größe MaxItems gruppiert und im Empfänger speichert, und anschließend den Fortschritt in der Quelle bestätigt. */ const MaxItems = 9999 type Producer interface { // Next gibt zurück: // - einen Batch von Items zur Verarbeitung // - eine cookie, die nach Abschluss der Verarbeitung bestätigt werden soll // - einen Fehler Next() (items []any, cookie int, err error) // Commit wird verwendet, um den Datenbatch als verarbeitet zu markieren 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 }
Können Sie die Unternehmen oder Lieferanten aufzählen, mit denen Sie zu tun hatten?
Erzählen Sie mir vom letzten Arbeitsplatz: Was haben Sie gemacht, welchen Tech-Stack hatten Sie, welche schwierigen Aufgaben gab es?
Was ist ein Slice in Go?
Können Sie die wichtigsten Arten von Aufrufen auflisten, die in gRPC verwendet werden?
Ist es erlaubt, Informationen aus einem Kanal mit aktiviertem geschlossenen Modus zu erhalten?
Kann man direkt in eine bestimmte Partition von Kafka schreiben, ohne den Schlüssel für das Hashing zu verwenden?
Können Sie den Mechanismus erklären, wie ein Element am Ende einer Datenstruktur, wie einer Liste oder einem Array, hinzugefügt wird?
Welche Daten und auf welche Weise werden beim Ausführen des Programms im Stack platziert?
Welche Caching-Methoden bevorzugen Sie in Ihren Projekten und warum?
Was ist der Unterschied zwischen einer materialisierten Ansicht und einer normalen Ansicht?
Welche Komponenten gehören zur Struktur einer verketteten Liste?
Wie wird die Laufzeit der Operation zum Hinzufügen eines Elements nach Schlüssel in der Datenstruktur Map bestimmt?
Warum wird die Anfangsgröße des Stapels bei Threads in der Regel auf 2 MB festgelegt?
Haben Sie in Ihren Projekten schon einmal die ErrGroup-Struktur zur Verwaltung paralleler Aufgaben verwendet?
Welche ungewöhnlichen oder nicht standardmäßigen Pakete haben Sie in Ihrer Praxis verwendet?
Warum verlangsamt sich das Wachstum des Scheibchens und warum kann man es nicht ständig verdoppeln?
An welcher Stelle werden die Befehle im GitLab CI/CD-Arbeitsprozess ausgeführt?
Welche Konsequenzen können bei Nichteinhaltung der SOLID-Prinzipien bei der Softwareentwicklung auftreten?