El dinero no se duplica · Episodio 1 de 7

La doble pulsación

Laura envía 50 € a Marcos desde el metro. La app se queda pensando, el tren entra en un túnel y Laura vuelve a pulsar «enviar». ¿Ha enviado 50 € o 100 €?

Concepto: idempotencia~10 min

El punto de partida

En Las áreas del banco, New Capital Bank aprendió a cortar su software en contextos y agregados. Cada agregado es coherente al instante por dentro, pero un Bizum ya no es un único cambio en un único sitio: cruza Operaciones, Cuentas y el sistema de Bizum, y entre ellos solo hay mensajes que viajan por la red.

Y los mensajes que viajan por la red se repiten. Alguien pulsa dos veces. Una respuesta se pierde y quien preguntó vuelve a preguntar. Un fichero llega dos veces. Esta serie va de lo que hace falta para que, a pesar de todo eso, el dinero no se duplique, no se pierda y no se salte un límite.

El dominio del banco tiene una regla escrita desde el principio: una operación repetida por el cliente, por ejemplo con una doble pulsación de «enviar», no genera movimientos duplicados. Este episodio va de cómo se cumple.

Dos peticiones iguales

Para Operaciones, la segunda pulsación de Laura es una petición idéntica a la primera: mismo importe, mismo destinatario, misma cuenta. No tiene forma de saber si Laura quiere enviar 50 € dos veces o si ha pulsado dos veces para enviar 50 €.

La simulación compara dos formas de recibir el Bizum. En la de la izquierda, cada petición es un Bizum nuevo. En la de la derecha, la app genera una clave al abrir la pantalla de envío y la repite en cada intento; Operaciones apunta cada clave en un registro antes de cargar. Lanza los tres casos.

Qué ha pasado

La idempotencia convierte un problema sin solución (saber si un mensaje ha llegado) en uno con solución: que dé igual que llegue dos veces.

Quién genera la clave

La clave tiene que nacer donde nace la intención. Si la generara Operaciones al recibir la petición, cada pulsación tendría su propia clave y no serviría de nada. La genera la app, al abrir la pantalla, y la guarda hasta que recibe una respuesta.

Y el registro de claves no es eterno. Operaciones guarda cada clave lo que dura un reintento razonable (24 horas en el Bizum); pasado ese tiempo, una petición con una clave vieja es sospechosa, no una repetición.

Las domiciliaciones

El cambio que recorre esta serie llega desde Cuentas y pagos: el banco va a aceptar domiciliaciones. Laura domicilia el recibo de la luz, y cada mes el banco de la compañía envía un fichero con el recibo para cobrarlo. Si Laura no tiene saldo, el recibo se devuelve, y la compañía puede volver a presentarlo días después.

Aquí no hay pulsaciones, pero hay repeticiones: el banco de la compañía reenvía un fichero cuando no recibe confirmación. Cada envío de un recibo es una presentación y lleva su propio identificador. Prueba a reconocer los recibos repetidos de dos maneras: por su contenido o por ese identificador.

El contenido engaña

Deduplicar por contenido parece prudente: «si ya he visto un recibo de la luz de 62,30 € de enero, no lo cobro otra vez». Detecta bien el fichero reenviado. Pero la segunda presentación del recibo devuelto tiene exactamente el mismo contenido, y es legítima: la compañía quiere cobrar lo que no pudo cobrar la primera vez.

Es la misma lección que con Laura. La clave tiene que identificar la intención (esta presentación, este envío), no el contenido. Y la tiene que poner quien origina la intención: aquí, el banco de la compañía.

Para llevarse

La idempotencia resuelve las repeticiones. No resuelve qué pasa cuando un Bizum se hace a medias: el límite ya está descontado, el dinero ya ha salido y el otro banco dice que no.