# Workstream de rendimiento
Miércoles, 11 de marzo de 2020
# Objetivos de rendimiento:
- Que el sistema de hardware actual alcance 1k TPS estables, un pico de 5k y una escalabilidad horizontal demostrada
- Más instancias = más rendimiento, de forma casi lineal.
- Validar la infraestructura mínima para hacer 1K TPS (TPS fin)
- Determinar la configuración y el costo de nivel de entrada (AWS y local)
# Pruebas de concepto:
Probar el impacto de sustituir directamente la base de datos mysql por un servicio de red de memoria compartida como redis (usando el algoritmo redlock si hacen falta bloqueos)
Probar un método distinto de compartir el estado, usando una versión ligera de orientación a eventos con algo de CQRS
# Recursos:
- Canal de Slack:
#perf-engineering - Presentación de rendimiento de mitad de PI (opens new window)
- Configurar los componentes de supervisión (opens new window)
# Elementos de acción y de seguimiento:
¿Qué métricas de Kafka (del lado del cliente y del servidor) deberíamos revisar? - Confluent ayudará
Explorar el bloqueo y la liquidación de posiciones - Sybrin ayudará
- Revisar RedLock: bloqueo pesimista frente a bloqueo automático
- Eliminar la base de datos compartida del medio (bloqueo automático en Redis)
Combinar el handler de prepare y el de posición con una base de datos distribuida
Revisar el cliente de node.js y cómo afecta a kafka, la configuración de Node y el cliente final de Kafka - Nakul
Volver a activar el trazado para ver cómo se comportan la latencia y las aplicaciones
Asegurar que los recuentos de llamadas se han racionalizado (a un nivel más profundo)
Validar los tiempos de procesamiento en los handlers y que estamos llegando a la caché
Patrones asíncronos en Node
- Falta alguien que sea excelente en mysql y percona
- Lo estamos aprovechando correctamente
Qué capa de caché estamos usando (en memoria)
Revisar la implementación del modelado de eventos: identificar los eventos de dominio
Node.js/kubernetes -
Centrarse en los problemas de la aplicación más que en los de arquitectura
Cómo estamos haciendo la tecnología asíncrona: revisarlo (Node.JS, un problema mayor), hay que optimizar los modelos con hilos - Nakul
# Notas y detalles de la reunión
# Historia
Se ha implantado la tecnología, se esperaba que el diseño resolviera un problema empresarial
El esfuerzo de la comunidad no priorizó que las partes del sistema fueran de nivel empresarial ni baratas de operar
Elecciones de tecnología OSS
# Objetivos
- Optimizar el sistema actual
- Hacerlo más barato de operar
- Hacerlo escalable hasta 5K TPS
- Asegurar que los servicios de valor agregado puedan acceder de forma eficaz y segura a los datos de las transacciones
# Restricciones de las pruebas
- Solo se ha hecho la transferencia dorada, el tramo de transferencia
- Flujo de la transferencia
- Simuladores (legacy y avanzado): se usa el legacy por continuidad
- Desactivado el handler de timeout
- 8 DFSP (organizaciones participantes); con más DFSP podríamos escalar
# Proceso
Jmeter inicia la solicitud del pagador
El simulador legacy recibe el callback de notificación de fulfil
El simulador legacy gestiona el procesamiento del beneficiario e inicia el callback de fulfilment
Registro en la tabla de posiciones de cada DFSP
- a. Algoritmo parcial en el que se hace el bloqueo para reservar los fondos, se hacen los cálculos y se hacen los commits finales
- b. El handler de posición procesa un registro cada vez
Un algoritmo futuro haría un lote
- Una transferencia la gestiona un handler de posición
- Todas las transferencias tienen prefondeo
- Costos de liquidación reducidos
- Se puede controlar la rapidez con la que los DFSP responden a la solicitud de fulfil (completar primero las transferencias comprometidas antes de gestionar nuevas solicitudes)
El sistema necesita cerrar por timeout las transferencias que superen los 30 segundos
- Cualquier rediseño de las bases de datos
- Casos de prueba
Transacción financiera
- De extremo a extremo
- Solo prepare
- Solo fulfil
Caracterización individual de Mojaloop
- Servicios y handlers
- Arquitectura y bibliotecas de streaming
- Base de datos
- ¿Qué cambió: de 150 a 300 TPS?
Cómo procesamos los mensajes
Handler de posición (ejecutado en modo mixto, aleatorio
- Medición de la latencia
- 5 s para que la base de datos procese, X s para que Kafka procese
- ¿Cómo medir esto?
# Metas
- Lo bastante alto como para que el sistema tenga que funcionar bien
- Subir el sistema para agregar escala (adición de x DFSP)
- Casos sospechosos para investigar
- Observar las contenciones en torno a la base de datos
- Base de datos compartida, 600MS sin errores
La contención está totalmente en la base de datos
El cuello de botella es la base de datos (distribuir los sistemas para que se ejecuten de forma independiente
16 bases de datos se ejecutan de extremo a extremo
GSMA - 500 TPS
¿Cuál es el diseño óptimo?
# Contenciones
Contención del handler del sistema
- Dónde se puede escalar el sistema
Si hay cambios de arquitectura que tengamos que hacer, podemos explorarlo
- Coherencia para cada DFSP
- Hilos de los flujos de información: pregunta abierta
Resultados sesgados de una única base de datos para todos los DFSP
El reto es hasta dónde se llega con hardware adicional
- Cuáles son los límites del diseño de la aplicación
Transferencias financieras (dentro y fuera del sistema)
- Sistemas de auditoría
- Actividad de liquidación
- Agrupar en la base de datos resuelve algunos problemas
- Comentarios de Confluent
Problemas de la base de datos compartida, varias bases de datos
Problemas a nivel del diseño de la aplicación
Hemos visto situaciones en las que ejecutamos un montón de simuladores y sandboxes
- Hay que apoyarse en trazadores y análisis cuando esto llegue a producción
- Miguel indica que de momento desactivamos el trazado
# Problemas conocidos
- Recursos de CPU de carga en las máquinas (node esperando sin hacer nada): reoptimizar el código
- Los tiempos de procesamiento aumentan con el tiempo
# Optimización
- Monolítico distribuido - PRISM - eliminar las lecturas redundantes
- Combinar los handlers: prepare+posición y fulfil+posición
# ¿Qué estamos intentando arreglar?
- ¿Podemos escalar el sistema?
- ¿Cuánto cuesta hacerlo? (costo por unidad de escala)
- Hace falta entender cómo hacerlo a pequeña y a gran escala
- Optimizados los recursos
- 2.5 sprints
- Hace falta escalar horizontalmente
- Agregar auditoría y repetibilidad -
# Asistentes:
- Don, Joran (experto en rendimiento recién contratado) - Coil
- Sam, Miguel, Roman, Valentine, Warren, Bryan, Rajiv - ModusBox
- Pedro - Crosslake
- Rhys, Nakul Mishra - Confluent
- Miller - Gates Foundation
- Presenciales: Lewis (CL), Rob (MB), Roland (Sybrin), Greg (Sybrin), Megan (V), Simeon (V), Kim (CL)
