En vísperas de nuestro Python Conf ++ de Moscú, hablamos brevemente con Oleg Churkin, un experto en tecnología de fintech, sobre su amplia experiencia con Apio: medio millón de tareas de fondo, errores y pruebas.
- ¿Cuéntame algunos detalles sobre el proyecto en el que estás trabajando actualmente?En este momento, estoy involucrado en una startup de
fintech ,
Statusmoney , que analiza los datos financieros de los usuarios y permite a los clientes comparar sus ingresos y gastos con otros grupos de personas, establecer límites de gastos, ver cómo la riqueza está creciendo o cayendo en los gráficos. Hasta ahora, el proyecto se centra solo en el mercado norteamericano.
Para analizar la información financiera, descargamos y almacenamos todas las transacciones de los usuarios e integramos con las agencias de crédito para obtener datos adicionales sobre el historial de crédito.
Ahora tenemos unos 200 mil usuarios y 1,5 terabytes de varios datos financieros de nuestros proveedores. Cerca de un millón de transacciones
- ¿Qué es la pila tecnológica?La pila del proyecto actual es Python 3.6, Django / Celery y Amazon Web Services. Utilizamos activamente RDS y Aurora para almacenar datos relacionales, ElasticCache para el caché y para las colas de mensajes, CloudWatch, Prometheus y Grafana para alertas y monitoreo. Bueno y, por supuesto, S3 para el almacenamiento de archivos.
También somos muy activos en el uso de Celery para diversas tareas comerciales: envío de notificaciones y envío masivo de cartas, actualización masiva de diversos datos de servicios externos, API asincrónica y similares.
En la parte frontal, tenemos React, Redux y TypeScript.
- ¿Cuál es la naturaleza principal de las cargas en su proyecto y cómo las maneja?
te las arreglasLa carga principal del proyecto recae en las tareas de fondo que realiza Celery. Todos los días lanzamos alrededor de medio millón de tareas diferentes, por ejemplo, actualización y procesamiento (ETL) de datos financieros de usuarios de varios bancos, oficinas de crédito e instituciones de inversión. Además, enviamos muchas notificaciones y calculamos muchos parámetros para cada usuario.
También hemos implementado una API asincrónica, que "impulsa" los resultados de fuentes externas y también genera muchas tareas.
En este momento, después de ajustar la infraestructura y el apio, podemos hacer frente sin problemas, pero antes de que ocurra, definitivamente te lo contaré en mi informe.
- ¿Cómo escala todo y proporciona tolerancia a fallas?Para escalar, usamos Auto Scaling Groups, una caja de herramientas proporcionada por nuestra plataforma en la nube de AWS. Django y Celery se escalan bien horizontalmente, solo establecemos los límites un poco en la cantidad máxima de memoria utilizada por los trabajadores de uWSGI / Celery.
- ¿Y monitorear con qué?Para monitorear el uso de la CPU / memoria y la disponibilidad de los propios sistemas, utilizamos Cloud Watch en AWS, agregamos varias métricas de la aplicación y de los trabajadores de Celery que usan Prometheus, y creamos gráficos y enviamos alertas a Grafana. Para algunos datos en Grafana usamos ELK como fuente.
- Mencionaste la API asincrónica. Cuéntanos un poco más sobre cómo lo tienes.
arregladoNuestros usuarios tienen la oportunidad de "vincular" su cuenta bancaria (o cualquier otra cuenta financiera) y brindarnos acceso a todas sus transacciones. Mostramos el proceso de "vinculación" y procesamiento de transacciones dinámicamente en el sitio, para esto usamos la agrupación habitual de resultados actuales del backend, y el backend toma datos, comenzando la canalización ETL de varias tareas repetitivas.
- El apio es un producto controvertido. ¿Cómo vives con él?Según mis sentimientos, nuestra relación con Celery se encuentra ahora en la etapa de "aceptación": descubrimos cómo funciona el marco en el interior, recogimos las configuraciones por nosotros mismos, resolvimos el despliegue, "superpuestos" con el monitoreo y escribimos varias bibliotecas para automatizar las tareas rutinarias. Alguna funcionalidad no fue suficiente para nosotros "fuera de la caja", y la agregamos por nuestra cuenta. Desafortunadamente, al momento de elegir la pila de tecnología para el proyecto, Celery no tenía muchos competidores, y si usáramos soluciones más simples, tendríamos que agregar mucho más.
Nunca hemos encontrado errores en la cuarta versión de Celery. La mayoría de los problemas estaban relacionados con nuestra falta de comprensión de cómo funciona todo esto o con factores de terceros.
Hablaré sobre algunas bibliotecas escritas dentro de nuestro proyecto en mi presentación.
- Mi pregunta favorita ¿Cómo pruebas toda esta música?Las tareas de apio se prueban bien mediante pruebas funcionales. Probamos la integración con la ayuda de pruebas automáticas y pruebas manuales en soportes QA y puesta en escena. Por el momento, aún no hemos decidido un par de problemas con las tareas periódicas de prueba: ¿cómo dejar que los evaluadores las ejecuten y cómo verificar que el cronograma de estas tareas sea correcto (cumple con los requisitos)?
- ¿Y las pruebas para la interfaz y el diseño? ¿Cuál es la relación de manual a
prueba automatizada?En el frente, usamos Jest y escribimos solo pruebas unitarias para la lógica de negocios. El 55% de nuestros casos críticos de negocios están cubiertos actualmente por autoevaluaciones de Selenium, actualmente tenemos alrededor de 600 pruebas en TestRail y 3.000 pruebas en el back-end.
- ¿De qué tratará su informe sobre Moscow Python Conf ++?En el
informe le diré en detalle qué tareas y cómo puede usar Celery, y lo compararé con los competidores existentes. Describiré cómo evitar varios rastrillos al diseñar un sistema complejo con una gran cantidad de tareas: qué configuraciones deben especificarse de inmediato y cuáles pueden dejarse para más adelante, cómo implementar una nueva versión del código para no perder tareas al cambiar el tráfico, compartiré bibliotecas escritas para monitorear tareas y estalla.
También abordaré el tema de la implementación de tuberías ETL en Celery y responderé cómo describirlas de manera hermosa, qué política de reintento usar, cómo limitar de forma granular el número de tareas realizadas en condiciones de recursos limitados. Además, describiré qué herramientas usamos para implementar el procesamiento por lotes de tareas, que consume económicamente la memoria disponible.
En general, si anhelas detalles para todos los puntos anteriores, ven. Espero que encuentre mi informe útil e interesante.