In diesem Jahr haben wir bereits
auf Habré über unser Projekt
SmartCalls.io geschrieben - einen visuellen
Anrufdesigner , der für Geschäftsanwender entwickelt wurde. Das Projekt löst das Geschäftsproblem von Massenkundenanrufen: Ein visuelles Anrufskript wird erstellt, eine Excel-Datei mit Telefonnummern wird geladen und anschließend wird eine Anrufkampagne erstellt. Die Kampagne wird gestartet - Kundenanrufe beginnen; Sie können jederzeit Statistiken anzeigen, die Kampagne anhalten und die Einstellungen anpassen. Die Kunden waren zufrieden, bis klar wurde, dass es manchmal notwendig ist, nicht nur viele Leute anzurufen, sondern SEHR, SEHR viel. Unter dem Schnitt liegt die Essenz des Problems und wie wir es mit Hilfe einer HYIP-Programmiersprache (nicht unbegründet) besiegt haben.
Das Problem
Ursprünglich wurde die Dateiverarbeitung in PHP 7.1 implementiert - dies war eine offensichtliche Wahl, da die gesamte SmartCalls-API darauf geschrieben wurde. Die Arbeit mit Anruflisten hatte eine Einschränkung: Die Datei sollte nicht mehr als 10.000 gefüllte Zeilen enthalten. Diese Einschränkung war bei SmartCalls von Anfang an vorhanden und jedoch nicht kritisch. Bis zu einem bestimmten Punkt.
Eine große Bank benötigte sehr große Telefonkampagnen: Es mussten mehr als 10.000 Benutzer angerufen werden. Natürlich hat nichts verhindert, dass große Dateien in mehrere kleine Dateien aufgeteilt und einzeln heruntergeladen werden, aber es ist nicht unsere Methode, Kunden so leiden zu lassen. Apropos alternative Downloads - Wenn unser Kunde bereits eine Anrufkampagne gestartet hat und plötzlich Benutzer hinzufügen möchte, kann er dies problemlos tun. Dies ist sehr praktisch, da Sie nicht aufhören müssen zu telefonieren oder eine separate Kampagne für neue Benutzer ausführen müssen. Sie sollten jedoch verstehen, dass die Möglichkeit des erneuten Ladens nicht als Möglichkeit gedacht war, große Dateien manuell in Teilen zu laden.
Das Team hatte also die Aufgabe, das Hochladen großer Dateien in die Telefonkampagne zu implementieren.
Lösung
Wir sind sehr kompetent in der Java-Entwicklung - zum Beispiel ist die Voximplant-API teilweise in dieser Sprache implementiert; Wir sind auch gut in PHP (siehe das obige Beispiel - Captain Evidence schlägt vor). Das heißt, wir könnten diese Aufgabe mit einer dieser Sprachen schnell schließen, aber wir haben lange darüber nachgedacht, unseren Technologie-Stack zu erweitern, und hier haben wir uns gut an Go erinnert: Es ist schnell genug (funktioniert gut mit Speicher), ist Multithread-fähig und benötigt keine Laufzeit weil Go kompiliert in eine ausführbare Binärdatei. Darüber hinaus können wir über die Größe der Container sagen, aber dazu später mehr ...
Aus diesem Grund haben wir einen Microservice in der Sprache Go geschrieben, der große Blätter (bis zu 300.000 Zeilen getestet) und das Format (xls, xlsx und alle ihre Variationen) akzeptiert. Jetzt ist die Zeit für Details.
Implementierung
Wenn ein Client eine Datei mit mehr als 10.000 Zeilen in eine SmartCalls-Kampagne hochlädt, wird ein Microservice dafür verwendet. Es werden Eingabezeiger benötigt:
- in eine Datei, die in den S3-Speicher heruntergeladen wurde;
- zu der Kampagne, in die diese Datei hochgeladen werden muss.
Anschließend durchläuft der Microservice die Datei, trifft sie in Blöcken von 10.000 Zeilen (maximal für die Plattform) und lädt jeden Block als
CSV-Datei in den S3-Speicher, wobei er in der Datenbank Notizen zu jedem Block macht (Pfad zur Datei, Anzahl der Zeilen). Jeder Block wird verarbeitet und in einen separaten Stream geladen, was die Ausführungsgeschwindigkeit zusätzlich erhöht.
Zum Lesen von Excel-Dateien werden Open-Source-Bibliotheken aus
Tealeg und
Extrame verwendet . Es ist gut, dass sie nicht nur viele Stars haben, sondern auch neue Commits :)
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 xlsx und xls, die in verschiedenen Editoren erstellt wurden, sich in Formaten und Regeln für die Arbeit mit ihnen sehr unterscheiden. Ich musste viele Tests durchführen - OpenOffice, Excel verschiedener Versionen, LibreOffice, Google Sheets, um dem Microservice beizubringen, Dateien in eine einzige Form zu bringen - CSV. Nachdem der Microservice eine große Datei „gekaut“ und in eine CSV umgewandelt hat, wird die SmartCalls-API aktiviert und funktioniert bereits mit dieser CSV-Datei. Für den Microservice haben wir ein Limit von 300.000 Leitungen festgelegt, da es die Bedürfnisse der Kunden stark abdeckt und wir überhaupt keine größeren Bedürfnisse festgestellt haben.
Infolgedessen zeigte die Implementierung hervorragende Ergebnisse bei Tests und Preprod. Danach haben wir sie in das Produkt eingeführt.
Fazit
Unser Team ist stets bemüht, neue Funktionen / Verbesserungen schnell einzuführen, da wir möchten, dass zufriedene Kunden dies auch bleiben. Die Aufgabe mit großen Dateien war nicht nur eine weitere Herausforderung für uns, sondern auch ein guter Grund, Go in das Projekt einzuführen, das wir uns schon lange angesehen haben. Neben der schnellen Entwicklung und der schnellen Arbeit gibt uns Go eine Grundlage für die Zukunft, wenn wir mit der Einführung von Containern beginnen (um nahtlose Aktualisierungen vorzunehmen und das ist alles). Diese Sprache ist sehr leicht. Wir werden separat über Container schreiben, bleiben dran :)