Skip to main content
Midaz maneja millones de cuentas y transacciones por día. Empiezas en pequeño y escalas horizontalmente a medida que crece la demanda, sin necesidad de rediseñar la arquitectura. Para una descripción de negocio, consulta Acerca de Midaz. La forma en que despliegas y usas Midaz afecta su rendimiento. Para manejar operaciones bancarias de gran volumen, usa ledgers para segmentar las cargas de trabajo y escala cada servicio de forma independiente.

Estructuración de entidades para volúmenes altos de transacciones


Particionamiento por Organizaciones, Ledgers y Cuentas

Si tu banco procesa millones de transacciones cada día, distribuye la carga de trabajo entre muchas cuentas, ledgers u organizaciones. Por ejemplo, segmenta a los clientes por la inicial del apellido, o asigna un ledger separado a cada región. Cada ledger de Midaz es un libro independiente. Midaz procesa juntas las transacciones de un ledger. Esta división evita que un solo ledger se convierta en un cuello de botella. Midaz escala hacia afuera: los distintos ledgers pueden ejecutarse en instancias separadas o en particiones de base de datos separadas.

Operaciones orientadas a bloqueos

Midaz aplica cada lote de saldos de forma atómica en un único script Lua de Redis, de modo que un lote se aplica por completo o se revierte por completo. Midaz maneja la concurrencia de forma optimista: cada saldo lleva una versión, y en las rutas de reembolso de sobregiro, un desajuste de versión aborta todo el lote con el error 0174, de modo que quien llama vuelve a leer el estado y reintenta. La cuenta @external omite las verificaciones de piso de saldo y de sobregiro. Puede volverse negativa sin límite, por lo que las transacciones contra ella nunca fallan por fondos disponibles. Cada transacción de todas formas se confirma de forma atómica. O se aplican todas las operaciones, o no se aplica ninguna.

Escalado horizontal de servicios

Midaz usa una arquitectura de microservicios. Escalas cada componente de forma independiente, por ejemplo el procesamiento de transacciones y las consultas. Empieza en pequeño. A medida que crece la demanda, escala los servicios que lo necesiten. Para cargas altas, despliega varias instancias del servicio de transacciones detrás de un balanceador de carga. Usa el escalado de pods de Kubernetes (K8s).

CQRS y réplicas de lectura

Midaz usa CQRS (Command Query Responsibility Segregation) para separar las operaciones de escritura y lectura. Optimizas cada ruta de forma independiente. Enruta las cargas pesadas de informes y consultas hacia réplicas de lectura. Esto mantiene rápidas las confirmaciones de transacciones. Las lecturas no ralentizan las escrituras, y las escrituras no ralentizan las lecturas.

Loteo y transacciones N:N

Cuando sea posible, agrupa las operaciones relacionadas en una sola transacción. Esto reduce la sobrecarga. Usa transacciones N:N para trabajo masivo, como pagos en masa. Por ejemplo, un lote de 100 débitos y 100 créditos suele ser más rápido que 100 transacciones separadas. Esto funciona cuando las operaciones pertenecen al mismo conjunto lógico. Midaz procesa estas transacciones N:N en una sola confirmación atómica.

Monitoreo y escalado iterativo

Monitorea las métricas clave: latencia de transacciones, throughput, uso de recursos (CPU y memoria) y rendimiento de la base de datos. Usa las herramientas de observabilidad de Midaz (OpenTelemetry y Grafana), o envía las métricas a tu propio stack de monitoreo. Escala hacia afuera o hacia arriba antes de alcanzar un umbral de rendimiento. Midaz es modular y source-available, por lo que despliegas las partes que necesitas.

Manejo de operaciones multi-moneda y multi-entidad


Estrategias multi-moneda

Midaz admite transacciones multi-moneda con una cuenta de activo separada para cada moneda. Para escalar bien:
  • Configura cada activo de moneda que necesites.
  • Maneja la lógica específica de cada moneda (como el redondeo y las tasas de conversión) en tu capa de integración.
  • Para la conversión frecuente de moneda, como el trading de forex, ejecuta la conversión en un servicio separado. Midaz registra los débitos y créditos, pero un servicio externo de tasas FX suministra las tasas.
  • Rara vez necesitas un ledger separado por moneda, a menos que la política lo requiera. En su lugar, usa tipos de cuenta y la API de enrutamiento de transacciones para agrupar cuentas por moneda y así lograr informes claros.
  • Si una moneda cubre la mayoría de las transacciones, mantén todas las monedas en el mismo ledger. Si las operaciones multi-moneda se vuelven demasiado complejas, sepáralas en un ledger distinto por grupo de moneda.

Múltiples entidades: consolidación y separación

Para un banco que opera en varios países o entidades legales:
  • Usa la jerarquía de organizaciones para segmentar entidades. Dale a cada entidad su propia moneda base, activos locales y ledgers.
  • Modela las transacciones entre entidades como movimientos externos. Una organización acredita su cuenta externa, y la otra debita la suya.
  • Puedes ejecutar varias organizaciones en una sola instancia de Midaz. Asigna suficientes recursos: los microservicios procesan todas las solicitudes juntas, por lo que el volumen total importa.
  • Puedes desplegar una instancia separada de Midaz por cada entidad aislada, pero pierdes la visibilidad unificada. Un solo clúster con separación interna de organizaciones suele ser más práctico.

Buenas prácticas de optimización de rendimiento


Indexación y consultas

Usa las APIs de Midaz para leer datos, no consultas directas a la base de datos. Estas APIs incluyen índices predefinidos para los identificadores principales: cuentas, portafolios y transacciones.

Indexación de campos de metadatos personalizados

Midaz no crea ningún índice predeterminado en las colecciones de metadatos. Los documentos de metadatos usan entity_id como clave. Crea explícitamente los índices que necesites mediante la API de índice de metadatos. Por defecto, Midaz no indexa los campos de metadatos personalizados. Los clientes completan estos campos libremente como pares clave-valor. Las consultas o filtros frecuentes en campos no indexados pueden desencadenar escaneos completos de la colección. Estos escaneos se vuelven más lentos a medida que crece el volumen de datos. Crea un índice cuando uses regularmente un campo de metadatos personalizado en filtros de búsqueda u orden de clasificación. Con un índice, MongoDB encuentra los documentos rápido y reduce el tiempo de respuesta de las consultas. Recomendaciones:
  • Indexa solo los campos de metadatos que consultas u ordenas con frecuencia.
  • No indexes los campos de acceso poco frecuente, porque cada índice adicional agrega sobrecarga de escritura.
Gestiona los índices de metadatos mediante APIs dedicadas:

Pruebas a escala

Antes de un despliegue completo, simula tráfico alto con herramientas de pruebas de carga. Crea millones de cuentas, ejecuta volúmenes altos de transacciones y monitorea el rendimiento. La arquitectura de Midaz (microservicios y CQRS) está diseñada para operaciones a gran escala, pero las pruebas en el mundo real te ayudan a ajustar tu configuración. Busca una escalabilidad lineal: más instancias de la aplicación deberían aumentar el throughput en proporción.