Allez contre Excel sur des centaines de milliers de lignes

Cette année, nous avons déjà écrit sur Habré à propos de notre projet SmartCalls.io - un concepteur d'appels visuels créé pour les utilisateurs professionnels. Le projet résout le problème commercial des appels de masse des clients: un script d'appel visuel est créé, un fichier Excel avec des numéros de téléphone est chargé, puis une campagne d'appels est créée. La campagne est lancée - les appels aux clients commencent; à tout moment, vous pouvez consulter les statistiques, suspendre la campagne, modifier les paramètres. Les clients étaient satisfaits jusqu'à ce qu'il devienne clair qu'il fallait parfois appeler non seulement beaucoup de monde, mais TRÈS, TRÈS beaucoup. Sous la coupe est l'essence du problème et comment nous l'avons vaincu en utilisant le langage de programmation HYIP (pas déraisonnablement).


Le problème


Initialement, le traitement des fichiers a été implémenté en PHP 7.1 - c'était un choix évident, car l'intégralité de l'API SmartCalls était écrite dessus. Le travail avec les listes d'appels avait une limitation - le fichier ne devrait pas contenir plus de 10 000 lignes remplies. Cette limitation était dès le début dans SmartCalls et, cependant, n'était pas critique. Jusqu'à un certain point.

Une grande banque avait besoin de très grandes campagnes téléphoniques: elle devait téléphoner à plus de 10 000 utilisateurs. Bien sûr, rien n'empêchait de diviser de gros fichiers en plusieurs petits et de les télécharger un à la fois, mais faire souffrir les clients comme ça n'est pas notre méthode. En parlant de téléchargements alternatifs - si notre client a déjà lancé une campagne d'appel et souhaite soudainement y ajouter des utilisateurs, il peut facilement le faire. C'est très pratique car vous n'avez pas besoin d'arrêter d'appeler ou d'exécuter une campagne distincte pour les nouveaux utilisateurs. Mais vous devez comprendre que la possibilité de rechargement n'a pas été conçue comme un moyen de charger manuellement de gros fichiers, en morceaux.

Ainsi, l'équipe avait une tâche - mettre en œuvre le téléchargement de gros fichiers dans la campagne de téléphonie.

Solution


Nous sommes très compétents dans le développement Java - par exemple, partiellement l'API Voximplant est implémentée dans ce langage; nous sommes également bons en PHP (voir l'exemple ci-dessus - Captain Evidence suggère). Autrement dit, nous pourrions rapidement fermer cette tâche en utilisant l'un de ces langages, mais nous avons pensé pendant longtemps à étendre notre pile technologique, et ici nous nous sommes souvenus très bien de Go: il est assez rapide (fonctionne bien avec la mémoire), multithread et ne nécessite pas d'exécution parce que Go se compile en un binaire exécutable. De plus, nous pouvons dire sur la taille des conteneurs, mais plus à ce sujet plus tard ...

En conséquence, nous avons écrit un microservice dans le langage Go, qui accepte les grandes feuilles (testées jusqu'à 300 000 lignes) et le format (xls, xlsx et toutes leurs variantes). Il est maintenant temps pour les détails.

Implémentation


Lorsqu'un client télécharge un fichier> 10 000 lignes dans une campagne SmartCalls, un microservice est utilisé pour cela. Il faut des pointeurs d'entrée:

  • vers un fichier téléchargé sur le stockage S3;
  • à la campagne dans laquelle ce fichier doit être importé.

Ensuite, le microservice parcourt le fichier, le frappe en blocs de 10 000 lignes (maximum pour la plate-forme) et charge chaque bloc en tant que fichier csv dans le stockage S3, prenant des notes dans la base de données sur chaque bloc (chemin d'accès au fichier, nombre de lignes). Chaque bloc est traité et chargé dans un flux distinct, ce qui augmente encore la vitesse d'exécution.

Pour lire les fichiers Excel, utilisez les bibliothèques open source de tealeg et extrame . C'est bien qu'ils aient non seulement beaucoup d'étoiles, mais aussi de nouveaux engagements :)

import ( "github.com/tealeg/xlsx" "github.com/extrame/xls" //   ) 

Et tout irait bien, mais pas sans ses nuances. Au cours du développement, il s'est avéré que xlsx et xls, créés dans différents éditeurs, sont très différents dans les formats et les règles de travail avec eux. J'ai dû faire de nombreux tests - OpenOffice, Excel de différentes versions, LibreOffice, Google Sheets, pour apprendre au microservice à amener les fichiers sous une seule forme - CSV. Une fois que le microservice a «mâché» un gros fichier et l'a transformé en CSV, l'API SmartCalls est activée et fonctionne déjà avec ce fichier csv. Pour le microservice, nous avons laissé une limite de 300 000 lignes, car il couvre largement les besoins des clients, et nous n'avons rencontré aucun besoin plus important.

En conséquence, la mise en œuvre a montré d'excellents résultats dans les tests et le pré-produit, après quoi nous l'avons déployé dans la prod.

Conclusion


Notre équipe essaie toujours de déployer rapidement de nouvelles fonctionnalités / améliorations, car nous voulons que les clients satisfaits restent ainsi. La tâche avec des fichiers volumineux n'était pas seulement un autre défi pour nous, mais aussi une bonne raison d'introduire Go dans le projet, que nous avons étudié depuis longtemps. En plus d'un développement rapide et de la vitesse de travail, Go nous donne une base pour l'avenir lorsque nous commencerons à introduire des conteneurs (pour effectuer des mises à jour transparentes et c'est tout), ce langage est très léger. Nous écrirons sur les conteneurs séparément, restez à l'écoute :)

Source: https://habr.com/ru/post/fr424697/


All Articles