Número 67
30 de agosto de 2023

O misterio das previsualizacións

Hoxe vouvos falar dun erro que apareceu nun proxecto meu e de como o solucionei. Cambiei os detalles do proxecto pero conservei o síntoma, causa e solución. Lede isto coma se fora unha novela de misterio e tratade de adiviñar o culpable antes de eu o revelar.

Un asasinato.

Estaba eu a modificar o sistema de comentarios do meu blog para que os usuarios puideran poñer texto formatado. Como teño moita chulería, fixen que a previsualización fora automática: segundo o usuario escribía o texto do seu comentario, a previsualización íase actualizando.

Por motivos que non veñen ao caso, a previsualización era unha función do servidor, así que o navegador tiña que facer unha petición RPC cada vez que quería actualizala. Cunha pouca intelixencia e un case nada de optimización, isto funcionaba bastante mellor do que un podía pensar, así que publiquei o novo sistema de comentarios e pasei ao seguinte proxecto.

Uns días despois, comezaron a chegarme avisos de que había un erro curioso: ás veces, a previsualización non ficaba amosando o texto actual, senón o duns poucos segundos antes.

Isto foi complicado de diagnosticar porque, por moito que probara, non era quen de replicar o erro. Despois pensei que o erro podía estar no código que detectaba os cambios no texto e mandaba a petición RPC para a previsualización, pero por moito que ollara non atopaba onde podía caber este erro.

Un día, porén, unha das persoas que se queixaba deste erro dixo, como se non tivera importancia: «isto ocorre con máis frecuencia cos usuarios que viven na India».

Xa tedes todas as pistas. Parade aquí e matinade un pouco. Que pensades que é o culpable do erro?

«Acabáramos!», dixen eu: isto indicaba que o problema estaba relacionado coa latencia na rede. En efecto, usando unha VPN pronto fun quen de replicar o erro e de formular unha explicación.

A latencia entre o navegador e o servidor non é constante, senón que varía aleatoriamente. Polo tanto, as peticións RPC non tardan sempre o mesmo tempo en recibir a resposta, e nalgúns casos poden tardar tanto tempo que as respostas poden chegar fóra de orde. Isto é máis habitual cando as conexións teñen alta latencia e baixa capacidade, como as que había entre o meu servidor e a India.

Imaxinade que Rosalía de Castro está a escribir un comentario e o navegador envía peticións RPC despois de «Adiós ríos» e de «adiós fontes». Cando todo vai ben, a resposta da primeira petición chega primeira e a da segunda chega segunda, resultando na previsualización de «Adiós ríos, adiós fontes».

Agora imaxinade que a conexión da Poetisa é tan mala (porque é do século XIX) que ás veces as respostas se demoran tanto que chegan fóra de orde. Daquela, a resposta da primeira petición pode chegar despois da segunda, e o navegador recíbea e substitúe o texto da previsualización por «Adiós ríos» e máis nada.

A solución deste problema pasa por impedir que o contido dunha resposta para unha petición vella poida substituír a previsualización resultante dunha petición máis recente. Hai moitas maneiras de facelo, pero eu optei por usar números de secuencia.

O número de secuencia vai incluído na petición: a primeira recibe o número 1, a segunda o 2, etc. A resposta tamén inclúe o número de secuencia correspondente á súa petición.

Como as peticións levan números de secuencia cada vez máis altos, as respostas tamén levan números de secuencia ascendentes. Para detectar respostas recibidas fóra de orde, o navegador só ten que lembrar o número de secuencia máis alto entre todas as respostas que recibiu e rexeitar as respostas que reciba cun número inferior a este.

Grazas a este cambio, a previsualización automática pasou a funcionar perfectamente incluso con conexións lentas e latencia variable.

A ilustración desta Folla procede dun gravado de Félix Vallotton.