En junh escriuí sus com Lueira gestione eth moment quan quauquarrés confirme vertadèrament ua resèrva: instructor, material e franja orària blocats amassa en ua transaccion atomica, o arren de arren. Aqueth article parlaue deth commit. Aguest parle de tot çò qu'a d'èster cèrt abans que aqueth commit age sens: eth numèro que ve un client, o ua persona der equip, que ditz qu'un recors ei "disponible" o "ocupat" en un moment donat. Aguest numèro resulte èster ua des causes mès dificiles d'encertar de manèra consistenta en tota era plataforma. D'ua cèrta manèra ei mès dificil qu'era pròpria transaccion de resèrva, pr'amor que, a diferéncia d'ua transaccion, jamès non demore quiet.
Era disponibilitat non ei un hèit, ei un objectiu mobil
Er instint, era prumèra viatge que modelizes açò, ei tractar era disponibilitat coma ua proprietat que pòs liéger dirèctament d'un registre: aguest monitor d'esquí ei liure a les 10, aguest parelh d'esquís ei en estòc, aguesta plaça en ua classa collectiva encara a lòc. Ena practica, "disponible" ei un agregat calculat a partir de diuèrses fonts de vertat independentes e concurrentas, e quinsevolh d'eres pòt cambiar era responsa:
- Quauquarrés der equip bloque manuaument ua franja en calendari deth backoffice, pr'amor qu'un instructor a trucat disent qu'ei malaut o a de partir abans.
- Un client complète ua resèrva en linha ena botiga, consomint era darrèra plaça o eth darrèr parelh de bòtes d'ua talha.
- Un article se marque coma copat o s'envie a reparar a mieja jornada, trèt deth parc lhogadís.
- Quauquarrés modifique eth modèl d'orari setmanau recurrent —bota ua classa, cambie er aforament, apond ua franja nauèra— e açò se propague entà dauant a totes es setmanes futures qu'ereten d'aqueth modèl.
- Un hold d'un checkout abandonat caduque, deliurant ua plaça o un article que semblaue compromés pendent es darrèrs dètz minutes mès que jamès non arribèc a convertir-se en ua resèrva de vertat.
Un dimarç tranquil, aguestes causes gaireben jamès non se trapen entre eres. Un dissabte deth maitin damb molt d'aviada ath taulèr de lhogatge, damb era botiga en linha tanben acceptant resèrves e un instructor reorganizant era sua jornada, quauques d'eres pòden passar dens eth madeish segond. Eth sistèma a de balhar ua soleta responsa consistenta, sigue quin sigue d'aguesti cinc camins qu'age hèt era pregunta en darrèr lòc.
Hè-la ua consulta en viu, non te fides d'ua caché
Era dreçadèra temptaira ei ua taula de disponibilitat precalculada: ua hilèra per recors e franja orària, actualizada cada còp qu'ua causa cambie, liejuda de manèra barata dès era botiga. Ei temptaira pr'amor qu'ei rapida, e pr'amor que semble era forma naturau d'aguestes dades. Eth problèma ei qu'a d'èster invalidada corrèctament dès cinc camins d'escritura independents, e ne cau sonque un d'eri s'oblide d'actualizar-se, o se trape damb un aute, entà qu'eth numèro en pantalha sigue incorrècte. E enganhar-se en aguest terren non ei quauquarren cosmetic: vò díder hèr overbooking d'un instructor, o díder a un client qu'un lhogatge ei disponible quan justament s'a marcat coma copat.
Eth mèn rasonament per defècte ací a estat tractar era disponibilitat coma ua causa que se calcula en liéger-la, contra er estat actuau, en lòc d'ua causa que se guarde e s'espère que se mantengue sincronizada. Ua consulta en viu —crotzar eth calendari deth recors, es sues resèrves actuaus, er estat deth sòn material, es holds actius— ei mès cara per peticion qu'ua lectura de caché, mès ei corrècta per construccion: non i a logica d'invalidacion que se pogue esbauçar, pr'amor que non i a arren quiet a invalidar. Entà ua consulta que gaireben totjorn tòque es recorsi e resèrves d'un solet dia, aguest còst sole èster manejable fòrça abans de convertir-se en eth cuèth de botelha.
Se emplegues caché, hè-la estreta
Açò non vò díder que emplegar caché sigue descartat pertot: ua botiga publica damb transit reau acabarà per aver besonh d'ua quauqua capa de caché dauant dera consulta en viu. Mès eth mòde de fracàs que mès me preocuparie ei ua caché qu'eth sòn disparador d'invalidacion sigue tròp ample: quauquarren cambie, e alavetz tot s'esbauce e se torne a bastir. Açò ei simple d'escríuer e reintroduseish en silenci cada un des problèmes de correccion qu'a ua taula precalculada, sonque damb passi de mès.
Er alternatiu ei indexar era caché pro estreta entà qu'un disparador d'invalidacion sonque age de rasonar sus eth recors e era finestra temporau exactes qu'an cambiat, illustrat ací coma pseudocòdi simplificat en lòc de còdi de produccion reau:
// ingenu: quinsevolh escritura en quinsevolh lòc esbauce tot
onAnyBookingWrite(event):
cache.clear() // corrècte, mès tanben lance tot çò aute
// estret: invalide sonque eth recors/dia afectat
onInstructorAvailabilityChanged(event):
key = availabilityKey(event.instructorId, event.date)
cache.delete(key)
onBookingConfirmed(event):
key = availabilityKey(event.resourceId, event.date)
cache.delete(key)
onEquipmentStatusChanged(event):
key = availabilityKey(event.itemId, event.date)
cache.delete(key)
onHoldExpired(event):
key = availabilityKey(event.resourceId, event.date)
cache.delete(key)
Era diferéncia non ei sonque de rendiment. Un disparador estret ei quauquarren sus qué pòs rasonar e provar camin per camin: "marcar un article coma copat invalide corrèctament era clau adequada?" ei ua pregunta damb ua responsa clara de òc o non. "S'esbauce sempre tota era caché a temps?" ei ua pregunta sus temporizacion e condicions de corsa entre cinc camins de còdi sense relacion entre eri, çò qu'ei fòrça mès dificil de respóner damb fisança.
Ua soleta vertat, tres hièstres
Er auta causa que hè qu'aguest problèma sigue especiaument delicat ena practica ei qu'era disponibilitat non se pregunte ua soleta viatge: se pregunte dès aumens tres lòcs diferents qu'an de coincidir: era botiga en linha a on un client resèrve ua activitat o un lhogatge, eth calendari deth backoffice a on er equip gerís era jornada, e es vistes de reporting internes qu'emplegades entà planificar capacitat. Se aguesti tres quauque còp discrepen, quitament brèument, quauquarrés se n'encuentre. Un cas concret que ven constantament: un instructor decidís a mieja jornada, per un motiu personau, de marcar-se coma non disponible entara rèsta dera jornada. Açò a d'arribar ara botiga en linha en questions de segondes —non ena següenta sincronizacion programada— o era botiga vendrà alègraments ua classa privada damb un instructor qu'ja s'a n'ei anat. Eth backoffice ac sap a l'instant, pr'amor qu'ei aquiu a on se hec eth cambi; eth dificil ei assegurar-se qu'era responsa dera botiga a "aguest instructor ei liure a les 14h?" se derive exactament deth madeish estat, e non d'ua fotografia de vint minutes endarrèr.
Aguest ei, ath finau, eth vertadèr argument entà calcular era disponibilitat en viu en lòc de mantier vistes precalculades separadas per superfícia: se era botiga, eth backoffice e eth reporting resòlven era disponibilitat mejançant era madeisha consulta contra eth madeish estat actuau, estructuraument non i a a on pòguen discrepar. Quinsevolha capa de caché qu'apondes mès tard a de preservar aguesta proprietat, non esquivar-la.
Arren d'açò non ei enginyeria exotica: non i a cap truc enginhós que hèsque desaparéisher era concurréncia e es multiples escrivans. Çò que vertadèraments ajude ei d'èster onèst sus quantes causes independentes pòden cambiar "disponible" dejós de tòn nas, e dissenhar eth sistèma entà qu'aquerís de nauèth en lòc de fisar-se d'ua responsa que calculèc hè un moment. Encertar era transaccion de resèrva, de çò qu'escriuí en junh, importe fòrça. Encertar eth numèro que hè qu'ua persona ensage aguesta transaccion en prumèr lòc importe tant coma, e ei era pèça mès aisida d'esbauçar sotilaments sense se n'encuentrar pendent setmanes.
