Vá contra o Excel em centenas de milhares de linhas

Este ano, já escrevemos na Habr sobre o projeto SmartCalls.io - o designer visual de chamadas criadas para usuários corporativos. O projeto resolve o problema comercial das chamadas em massa dos clientes: um script de chamada visual é criado, um arquivo do Excel com números de telefone é carregado e, em seguida, uma campanha de chamada é criada. A campanha é lançada - as chamadas para os clientes começam; a qualquer momento, você pode assistir a estatísticas, pausar a campanha, ajustar as configurações. Os clientes ficaram satisfeitos até ficar claro que às vezes é necessário ligar não apenas para muitas pessoas, mas MUITO, MUITO. Sob o corte está a essência do problema e como o derrotamos usando a linguagem de programação HYIP (não irracionalmente).


O problema


Inicialmente, o processamento de arquivos foi implementado no PHP 7.1 - era uma escolha óbvia, pois toda a API do SmartCalls estava escrita nele. O trabalho com listas de chamadas tinha uma limitação - o arquivo não deve conter mais de 10 mil linhas preenchidas. Essa limitação foi desde o início no SmartCalls e, no entanto, não foi crítica. Até um certo ponto.

Um grande banco precisava de campanhas telefônicas muito grandes: era necessário ligar para muito mais de 10 mil usuários. Obviamente, nada impedia a quebra de arquivos grandes em vários pequenos e o download um de cada vez, mas fazer com que os clientes sofram dessa forma não é o nosso método. Falando em downloads alternativos - se o nosso cliente já lançou uma campanha de chamada e de repente deseja adicionar usuários a ela, ele pode fazer isso facilmente. Isso é muito conveniente porque você não precisa parar de ligar ou executar uma campanha separada para novos usuários. Mas você deve entender que a possibilidade de recarregar não foi concebida como uma maneira de carregar arquivos grandes manualmente, em pedaços.

Portanto, a equipe teve uma tarefa - implementar o upload de arquivos grandes na campanha para telefonar.

Solução


Somos muito competentes no desenvolvimento de Java - por exemplo, parcialmente a API Voximplant é implementada nessa linguagem; também somos bons em PHP (veja o exemplo acima - sugere o Capitão Evidence). Ou seja, poderíamos fechar rapidamente essa tarefa usando uma dessas linguagens, mas pensamos por um longo tempo para expandir nossa pilha de tecnologias, e aqui nos lembramos de Ir muito bem: é rápido o suficiente (funciona bem com memória), é multithread e não precisa de um tempo de execução porque Ir compila em um binário executável. Além disso, podemos dizer sobre o tamanho dos contêineres, mas mais sobre isso mais tarde ...

Como resultado, escrevemos um microsserviço no Go, que aceita folhas grandes (testadas até 300 mil linhas) e formato (xls, xlsx e todas as suas variações). Agora é a hora de detalhes.

Implementação


Quando um cliente carrega um arquivo> 10.000 linhas em uma campanha do SmartCalls, é feito um microsserviço. São necessários indicadores de entrada:

  • para um arquivo baixado para armazenamento S3;
  • para a campanha na qual esse arquivo precisa ser carregado.

Em seguida, o microsserviço percorre o arquivo, o atinge em pedaços de 10 mil linhas (máximo para a plataforma) e carrega cada pedaço como um arquivo csv no armazenamento S3, fazendo anotações no banco de dados sobre cada pedaço (caminho para o arquivo, número de linhas). Cada pedaço é processado e carregado em um fluxo separado, o que fornece um aumento adicional na velocidade de execução.

Para ler arquivos do Excel, utilizava bibliotecas de código aberto do tealeg e extrame . É bom que eles tenham não apenas muitas estrelas, mas também novos compromissos :)

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

E tudo ficaria bem, mas não sem suas nuances. Durante o desenvolvimento, descobriu-se que xlsx e xls, criados em diferentes editores, são muito diferentes em formatos e regras para trabalhar com eles. Eu tive que fazer muitos testes - OpenOffice, Excel de diferentes versões, LibreOffice, Google Sheets, para ensinar o microsserviço a trazer arquivos para um único formulário - CSV. Depois que o microsserviço mastiga um arquivo grande e o transforma em CSV, a API do SmartCalls é ativada e já funciona com esse arquivo csv. Para o microsserviço, deixamos um limite de 300 mil linhas, pois ele cobre muito as necessidades dos clientes e não encontramos nenhuma necessidade maior.

Como resultado, a implementação mostrou excelentes resultados em testes e pré-produtos, após o que os lançamos no produto.

Conclusão


Nossa equipe está sempre tentando implementar rapidamente novos recursos / melhorias, porque queremos que clientes satisfeitos continuem assim. A tarefa com arquivos grandes não foi apenas mais um desafio para nós, mas também um bom motivo para introduzir o Go no projeto, que analisamos há muito tempo. Além do rápido desenvolvimento e da velocidade do trabalho, o Go nos fornece uma base para o futuro quando começarmos a apresentar contêineres (para fazer atualizações contínuas e isso é tudo), que esse idioma é muito leve. Vamos escrever sobre contêineres separadamente, fique atento :)

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


All Articles