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 €?
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 doble pulsación es el caso fácil de imaginar. Sin clave, Marcos recibe 100 €. Con clave, la segunda petición llega mientras la primera está en curso y Operaciones no la procesa.
- La respuesta perdida es el caso que de verdad importa, porque nadie se equivoca. El Bizum se hizo y la respuesta no llegó. La app tiene que reintentar: no sabe si el Bizum salió. Sin clave, reintentar es peligroso; con clave, es seguro, y la app puede reintentar todas las veces que quiera.
- Otro Bizum de 50 € enseña qué identifica la clave: no el contenido de la petición, sino la intención de Laura. Una pantalla de envío nueva es un Bizum nuevo, aunque sea idéntico.
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
- Una operación es idempotente si repetirla no cambia el resultado. En un sistema que habla por la red, todo se repite alguna vez.
- Una clave de idempotencia la genera quien origina la intención y la repite en cada intento; quien la recibe guarda el resultado y lo devuelve si la clave vuelve a llegar.
- La clave identifica la intención, no el contenido: dos Bizum iguales pueden ser dos cenas, y dos recibos iguales, dos presentaciones.
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.
Siguiente Episodio 2 · El Bizum que se queda a medias El otro banco rechaza el Bizum cuando el dinero ya ha salido. Sagas y compensaciones.