Gehen Sie gegen Excel Hunderttausende von Zeilen

    In diesem Jahr haben wir bereits über Habré über unser Projekt SmartCalls.io geschrieben - einen visuellen Anrufer , der für Geschäftsanwender entwickelt wurde. Das Projekt löst das geschäftliche Problem der Massenkundenwahl: Ein visuelles Anrufskript wird erstellt, eine Excel-Datei mit Telefonnummern wird geladen und anschließend wird eine Wahlkampagne erstellt. Die Kampagne wird gestartet - die Kundenanrufe beginnen; Sie können jederzeit die Statistiken ansehen, die Kampagne anhalten und die Einstellungen erhöhen. Die Kunden waren zufrieden, bis klar wurde, dass manchmal nicht nur viele Personen angerufen werden müssen, sondern sehr, sehr, sehr. Unter dem Schnitt - das Wesentliche des Problems und wie wir es mit Hilfe der Programmiersprache HYIP (nicht ohne Basis) gewonnen haben.


    Das Problem


    Ursprünglich wurde die Dateiverarbeitung in PHP 7.1 implementiert - eine naheliegende Wahl, da die gesamte SmartCalls-API darauf geschrieben wurde. Die Arbeit mit Anruflisten hatte eine Einschränkung - die Datei darf nicht mehr als 10.000 gefüllte Zeilen enthalten. Diese Einschränkung war bei SmartCalls von Anfang an und war jedoch nicht kritisch. Bis zu einem bestimmten Punkt.

    Eine große Bank brauchte sehr große Klingelkampagnen: Man musste viel mehr als 10 Tausend Benutzer anrufen. Natürlich hat nichts daran gehindert, große Dateien in mehrere kleine Dateien aufzuteilen und diese nacheinander zu laden. Es ist jedoch nicht unsere Methode, Kunden davon zu überzeugen. Apropos Laden, wenn unser Kunde bereits eine Telefonanrufkampagne gestartet hat und plötzlich Benutzer hinzufügen wollte, dann kann er dies problemlos tun. Dies ist sehr praktisch, da Sie die Wahl nicht abbrechen oder eine separate Kampagne für neue Benutzer starten müssen. Es sollte jedoch verstanden werden, dass die Möglichkeit des erneuten Ladens nicht dazu gedacht war, große Dateien manuell in Stücken zu laden.

    Das Team hat also die Aufgabe, den Download großer Dateien in der Kampagne für das Wählen zu implementieren.

    Lösung


    Wir sind sehr kompetent bei der Entwicklung in Java - zum Beispiel ist die Voximplant-API in dieser Sprache implementiert. Wir sind auch gut in PHP (siehe Beispiel oben, schlägt Captain Obvious vor). Das heißt, wir konnten diese Aufgabe schnell mit einer dieser Sprachen abschließen. Wir hatten jedoch schon lange daran gedacht, unseren Technologie-Stack zu erweitern, und dann erinnerten wir uns sehr schnell an Go: Es ist schnell genug (funktioniert gut mit dem Speicher), ist multithreading und benötigt keine Laufzeit weil Go kompiliert zu einer ausführbaren Binärdatei. Darüber hinaus können wir über die Größe der Container sagen, aber dazu später mehr ...

    Als Ergebnis haben wir einen Microservice in der Sprache Go geschrieben, der große Blätter (bis zu 300.000 Zeilen getestet) und Format (xls, xlsx und alle Typen) akzeptiert. Es ist Zeit für Details.

    Umsetzung


    Wenn ein Client eine Datei> 10.000 Zeilen in eine SmartCalls-Kampagne lädt, wird microservice dafür benötigt. Es braucht Zeiger auf die Eingabe:

    • in einer Datei, die in den S3-Speicher hochgeladen wurde;
    • zu der Kampagne, in der diese Datei heruntergeladen werden muss.

    Dann durchläuft der Microservice die Datei, trifft sie auf die Abschnitte von 10.000 Zeilen (maximal für die Plattform) und lädt jeden Abschnitt in Form einer CSV-Datei in den S3-Speicher. Dabei werden Anmerkungen zu dem Abschnitt in der Datenbank gemacht (Pfad zur Datei, Anzahl der Zeilen). Jeder Chunk wird in einem separaten Thread verarbeitet und geladen, was die Ausführungsgeschwindigkeit zusätzlich erhöht.

    Zum Lesen von Excel-Dateien wurden die Open-Source-Bibliotheken aus Tealeg und Extrame verwendet . Es ist gut, dass sie nicht nur viele Stars haben, sondern auch neue Verpflichtungen. :)

    import (
      "github.com/tealeg/xlsx""github.com/extrame/xls"// прочие импорты
    )

    Und alles wäre gut, aber nicht ohne Nuancen. Während der Entwicklung stellte sich heraus, dass sich xlsx und xls, die in verschiedenen Editoren erstellt wurden, hinsichtlich Format und Regeln für die Arbeit mit ihnen sehr unterscheiden. Ich musste viele Tests machen - OpenOffice, Excel in verschiedenen Versionen, LibreOffice, Google Sheets, um Mikroservice beizubringen, Dateien in ein einziges Formular zu bringen - CSV. Nachdem microservice eine große Datei "kaut" und diese in CSV konvertiert, wird die SmartCalls-API aktiviert und funktioniert bereits mit dieser CSV-Datei. Für microservice haben wir ein Limit von 300 Tausend Zeilen belassen, da es die Bedürfnisse der Kunden stark abdeckt und keine größeren Bedürfnisse begegnet.

    Infolgedessen hat sich die Implementierung in den Tests und der Vorstufe perfekt gezeigt, woraufhin wir sie in das Produkt hineinrollten.

    Fazit


    Unser Team ist stets bemüht, schnell neue Funktionen / Verbesserungen einzuführen, da zufriedene Kunden es bleiben wollen. Die Aufgabe mit großen Dateien war für uns nicht nur eine weitere Herausforderung, sondern auch ein guter Grund, Go in das Projekt einzuführen, an dem wir uns schon lange beteiligt haben. Neben der schnellen Entwicklung und Arbeitsgeschwindigkeit bietet Go uns die Basis für die Zukunft, wenn wir mit der Einführung von Containern beginnen (nahtlose Updates und das war's), was diese Sprache sehr leicht macht. Wir werden separat über Container schreiben, dran bleiben :)

    Jetzt auch beliebt: