Toti es articles

Dissenhar un motor de reservas entàs escòlas d'esports de montanha

Publicat Jun 14, 20234 min de lectura
  • Producte
  • Engenharia
  • Lueira
Dissenhar un motor de reservas entàs escòlas d'esports de montanha

Idèes clau

  • Un motor de reservas entà activitats fisicas a de comprovar mantuns recursi restrenhudi ath còp: instructor, material e franja orària.
  • Evitar reservas duplicadas vò díder qu'era comprovacion de disponibilitat e era reservacion sigan ua soleta operacion atomica, tipicament per mièi d'ua transaccion de basa de dades.
  • Es paginas publicas de reservas an de reflectir er estat reau deth backoffice en temps reau, damb ua retencion corta pendent eth checkout entà mantier valids eth prètz e era disponibilitat.

Quan publiquèrem era entrada sus Lueira eth març, la descriuí a naut nivèu: ua plataforma de reservas e gestion bastida entàs escòlas d'esports de montanha — esquí, caiac, canionisme, escalada, totes es activitats a on un "produit" ei de vertat ua persona, ua pèça de material e ua franja deth calendari que passen ath madeish temps. Ena web descriuem era foncion de manèra simpla: "Motor de reservas" — ua botiga en linha que ven activitats, corsi e lloguèrs, connectada automaticament ath calendari, ar estòc e as monitors. Aguesta frasa amague era màger part dera enginhariá dificila. Voi passar per çò que hè aguest cas de vertat diferent de reservar ua cramba d'hotèl, e mès o mens com l'abordèrem.

1. Ua reserva non ei un recurs, ne son mantuns

Un motor de reservas d'hotèls sonque a de vigilar un axe: se aquera cramba ei liura entad aqueres dates. Un motor de reservas entà ua escòla d'esquí o de caiac a de satisfèr mantunes restriccions independentas ath còp, e totes an de complir-se entara madeisha reserva exacta:

  • Un monitor disponible en aqueth orari, qualificat entad aquera activitat, e que parle era lengua que li cau ath client.
  • Material dera talha e quantitat corrèctas — un vestit de neoprèn en ua talha, un caiac, un pareu d'esquís — que non sigue ja assignat a un aute pendent aquera franja.
  • Ua franja orària que non se solape damb arren mès qu'aqueth monitor, o aqueth material, sigue ja comprometut.
  • Aforament de grop: ua classa pòt admeter quate estudiants, ua classa privada n'admet un.

Cap d'aguesti non ei "eth" recurs que se reserve — era reserva ei de vertat era interseccion de toti. Atau qu'en lòc de modelar un calendari damb casetas que se marquen, acabèrem modelant ua franja reservabla coma ua foncion: dada ua activitat, ua data e ua durada, quines combinacions de monitor + material + aforament son liures simultanèament. Aguesta foncion ei era que cride de vertat era cèrca der aparador, e tanben era que cride eth calendari deth backoffice quan quauquarrés der equipa arrossègue ua reserva a man.

2. Era corsa entara darrèra plaça

Un còp acceptes qu'ua "franja reservabla" ei un conjunt de recursi que se comprèven amassa, te trapes damb eth problèma classic de quinsevolh sistèma d'inventari: dues personas volent crompar era madeisha darrèra unitat ath madeish moment. Era version ingènua d'un flux de reserva — comprovar disponibilitat, e après inserir era reserva quauqui peticions mès tard — a ua corsa evidenta: dus clients pòden passar era comprovacion de disponibilitat abans que se n'escriue cap des dues reservas, e es dus se'n van pensant qu'an reservat eth darrèr caiac.

Ac resolvem damb ua transaccion que blòque exactament es hilères de qué depen ua reserva abans de decidir se pòt contunhar:

-- exemple simplificat, non ei còdi reau de produccion
BEGIN;

SELECT id, available_qty
  FROM equipment_stock
 WHERE product_id = $1 AND size = $2
   FOR UPDATE;

SELECT id
  FROM instructor_slots
 WHERE instructor_id = $3
   AND slot_start = $4
   AND slot_end = $5
   AND booked = false
   FOR UPDATE;

UPDATE equipment_stock
   SET available_qty = available_qty - 1
 WHERE product_id = $1 AND size = $2 AND available_qty > 0;

UPDATE instructor_slots
   SET booked = true
 WHERE instructor_id = $3 AND slot_start = $4 AND slot_end = $5 AND booked = false;

INSERT INTO bookings (customer_id, product_id, instructor_id, slot_start, slot_end)
VALUES ($6, $1, $3, $4, $5);

COMMIT;

Eth mecanisme exacte impòrte mens qu'eth principi: era comprovacion e era reservacion d'un recurs an d'èster ua soleta operacion atomica, non pas dus passi separadi entre es quaus ua peticion posque interrómper-se.

3. Mantier era botiga onèsta en temps reau

Era pagina publica de reservas e eth backoffice qu'emplegue er equipa d'ua escòla non pòden pas mostrar dues realitats diferentas. Se un monitor blòque deman ath maitin en backoffice, aquera franja a de desapareisher dera botiga en linha ath moment — non dempús qu'ua memòria cache s'actualize. Eth catalòg —descripcions, prètzi, fòtos— se pòt metre en cache de manèra agressiva, pr'amor que quasi non càmbie jamès. Era disponibilitat non pòt.

Er unic lòc a on deisham a prepaus que çò que ve eth client demore un shinhau darrèr dera realitat ei eth checkout. En lòc de tornar a córrer tota era recèrca dempús de cada camp que replene, botam ua retencion corta sus es recorsi concrèts en moment que comence eth checkout: era franja, eth material, eth prètz d'aqueth moment, reservadi entad eth quauqui minutes.

4. Çò que encara voleríem cambiar

Es retencions son ua aisina tòsca — un client que se distrè dètz minutes pèrd era sua plaça encara qu'arrés non l'age "panada" damb mala fe, e ajustar era hièstra dera retencion ei un compromís vertadèr entre conversion e equitat. Encara non auem cap lista d'espèra entàs classes plies. E es reservas de grop, a on ua part dera còlha a ua restriccion e era rèsta n'a ua auta, encara an besonh d'un tractament mès fin.

Aquerò ei, mès o mens, era forma deth problèma que "Motor de reservas" a de resòlver cada còp que quauquarrés reserve un cors, un lloguèr o ua activitat per miei de Lueira. Ei mens question de còdi astuciós e mès question d'èster onèst sus çò que de vertat depen ua soleta reserva.