Na véspera do Moscow Python Conf ++, conversamos brevemente com Oleg Churkin, técnico da startup fintech, sobre sua vasta experiência com o Celery: meio milhão de tarefas em segundo plano, bugs e testes.
- Conte-me alguns detalhes sobre o projeto em que você está trabalhando atualmente?No momento, estou envolvido em uma startup de
tecnologia financeira
Statusmoney , que analisa dados financeiros do usuário e permite que os clientes comparem suas receitas e despesas com outros grupos de pessoas, estabeleçam limites de gastos, observem como a riqueza está crescendo ou caindo nos gráficos. Até agora, o projeto está focado apenas no mercado norte-americano.
Para analisar informações financeiras, baixamos e armazenamos todas as transações de usuários e nos integramos às agências de crédito para obter dados adicionais sobre o histórico de crédito.
Agora, temos cerca de 200 mil usuários e 1,5 terabytes de vários dados financeiros de nossos fornecedores. Cerca de um milhão de transações
- Qual é a pilha tecnológica?A pilha do projeto atual é Python 3.6, Django / Celery e Amazon Web Services. Utilizamos ativamente o RDS e o Aurora para armazenar dados relacionais, o ElasticCache para o cache e para as filas de mensagens, CloudWatch, Prometheus e Grafana para alertas e monitoramento. Bem e, claro, S3 para armazenamento de arquivos.
Também somos muito ativos no uso do Celery para várias tarefas de negócios: envio de notificações e correspondência em massa de cartas, atualização em massa de vários dados de serviços externos, API assíncrona e similares.
No front-end, temos React, Redux e TypeScript.
- Qual é a principal natureza das cargas no seu projeto e como você lida com elas
você lida?O principal ônus do projeto está nas tarefas em segundo plano que o Celery executa. Todos os dias lançamos cerca de meio milhão de tarefas diferentes, por exemplo, atualização e processamento (ETL) de dados financeiros de usuários de vários bancos, agências de crédito e instituições de investimento. Além disso, enviamos muitas notificações e calculamos muitos parâmetros para cada usuário.
Também implementamos uma API assíncrona, que "pulsa" os resultados de fontes externas e também gera muitas tarefas.
No momento, depois de ajustar a infraestrutura e o Aipo, podemos lidar sem problemas, mas antes que isso aconteça, definitivamente vou falar sobre isso no meu relatório.
- Como você dimensiona tudo e fornece tolerância a falhas?Para o dimensionamento, usamos o Auto Scaling Groups, uma caixa de ferramentas fornecida por nossa plataforma em nuvem da AWS. O Django e o Aipo escalam bem horizontalmente, apenas definimos os limites um pouco da quantidade máxima de memória usada pelos trabalhadores do uWSGI / Aipo.
- E monitorar com o que?Para monitorar o uso da CPU / memória e a disponibilidade dos próprios sistemas, usamos o Cloud Watch na AWS, agregamos várias métricas do aplicativo e dos funcionários do Aery usando Prometheus, construímos gráficos e enviamos alertas à Grafana. Para alguns dados no Grafana, usamos o ELK como fonte.
- Você mencionou a API assíncrona. Conte um pouco mais sobre como você o possui.
arranjado.Nossos usuários têm a oportunidade de "vincular" sua conta bancária (ou qualquer outra financeira) e nos fornecer acesso a todas as suas transações. Exibimos o processo de "vinculação" e processamento de transações dinamicamente no site. Para isso, usamos o conjunto usual de resultados atuais do back-end, e o back-end coleta dados, iniciando o pipeline ETL a partir de várias tarefas repetitivas.
- O aipo é um produto controverso. Como você mora com ele?De acordo com meus sentimentos, nosso relacionamento com o Celery agora está no estágio de "Aceitação" - descobrimos como a estrutura funciona, escolhemos as configurações para nós mesmos, resolvemos a implantação, "sobrepusemos" o monitoramento e escrevemos várias bibliotecas para automatizar tarefas rotineiras. Algumas funcionalidades não foram suficientes para nós "prontas para uso" e as adicionamos por conta própria. Infelizmente, na hora de escolher a pilha de tecnologia para o projeto, o Celery não tinha muitos concorrentes e, se usássemos soluções mais simples, teríamos que adicionar muito mais.
Nunca encontramos bugs na quarta versão do aipo. A maioria dos problemas estava relacionada à nossa falta de compreensão de como tudo isso funciona ou a fatores de terceiros.
Vou falar sobre algumas bibliotecas escritas dentro do nosso projeto na minha apresentação.
- Minha pergunta favorita. Como você testa toda essa música?As tarefas de aipo são bem testadas por testes funcionais. Testamos a integração com a ajuda de testes automáticos e manuais em estandes de controle de qualidade e estadiamento. No momento, ainda não decidimos alguns problemas com o teste de tarefas periódicas: como permitir que os testadores os executem e como verificar se o cronograma dessas tarefas está correto (atende aos requisitos)?
- E os testes para o frontend e layout? Qual é a razão entre manual e
teste automatizado?Na frente, usamos o Jest e escrevemos apenas testes de unidade para lógica de negócios. Agora, 55% dos nossos casos críticos de negócios estão cobertos pelos autotestes do Selenium; atualmente, temos cerca de 600 testes no TestRail e 3.000 testes no back-end.
- Qual será o seu relatório sobre o Moscow Python Conf ++?No
relatório , explicarei detalhadamente quais tarefas e como você pode usar o Aipo, e compararei com os concorrentes existentes. Descreverei como evitar vários riscos ao projetar um sistema complexo com um grande número de tarefas: quais configurações devem ser especificadas imediatamente e quais podem ser deixadas para mais tarde, como implantar uma nova versão do código para não perder tarefas ao alternar tráfego, compartilharei bibliotecas escritas para monitorar tarefas e rajadas.
Também abordarei o tópico da implementação de pipelines ETL no Celery e responderei como descrevê-los de maneira bonita, que política de repetição usar, como limitar granularmente o número de tarefas executadas nas condições de recursos limitados. Além disso, descreverei quais ferramentas usamos para implementar o processamento em lote de tarefas, que consome economicamente a memória disponível.
Em geral, se você deseja detalhes de todos os pontos acima, venha. Espero que você ache meu relatório útil e interessante.