Toti es articles

Predíger es marèas entara seguretat des esports aquatics: un microservici petit e obsessivament precís

Publicat Jun 19, 20263 min de lectura
  • MeteoTrail
  • Engenharia
  • Montanha

Idèes clau

  • Es prediccions de marèa astronomica (FES2022b via pyfes) non son eth nivèu dera mar observat — eth temporau costanèr, era pression e era possada deth vent son exclosi per disenh.
  • Es valors per defècte que falhen tancat — sense CORS, "tokens" Bearer obligatòris, 503 damb Retry-After mentre carga er atlas — impòrten tanben en servicis intèrns de maquina a maquina.
  • Retalhar un atlas de marèa globau de diuèrsi gigabytes en un 'paquet' regionau petit a acorchit er aviada deth pod de minutas a segondes.

Ja auem escrit abans sus MeteoTrail e sus er agregador d'alèrtas meteorologicas deth govèrn que l'alimente — tostes dus gessècon deth madeish instint: es operadors d'espòrts aquatics an besonh de sàber, damb precision e damb antelacion, quan es condicions se giren en contra. Immersion, caiac, classes de surf — es cinc verticaus que descriuérem en "Un motor de resèrvas, cinc espòrts" — compartissen totes ua dependéncia qu'a penes arrés pense: era nautor reau dera mar en un moment dat. Quauqui punts d'immersion e embarcadors de caiac deth catalòg de Lueira solament son accessibles damb seguretat laguens d'ua fenèstra de marèa concrèta. Atau qu'aguest an bastírem un servici petit, apausadament estret, entà respóner plan a ua soleta question: quau serà era marèa astronomica, en aguest punt, en aguest moment.

1. Ua question estreta e precisa

tides-service ei un servici intèrn en FastAPI. Preditz marèas astronomicas emplegant er atlas globau de marèa oceanica FES2022b, per mejan dera libreria de còdi dubèrt pyfes. Se consomís de maquina a maquina, prumèrament dès eth backend de Lueira, e non ei exposat publicaument. Respon exactament a tres questions:

  • GET /v1/tides — ua seria temporau de nautors entre dus "timestamps"
  • GET /v1/tides/extremes — es eveniments de plenamar/baishamar d'un dia UTC dat
  • GET /v1/locations/check — se aguesta coordenada ei en aigua o en tèrra, e se ei en tèrra, quau ei era cellula banhada mès pròcha laguens d'un radi configurat

Es tres son protegidas damb "Bearer token". CORS ei desactivat per defècte — era madeisha postura de falhar tancat qu'eth requesit d'autentificacion. E dinc qu'er atlas de marèa, de diuèrsi gigabytes, age acabat de cargar-se en memòria en aviar, es dus "endpoints" de prediccion tornen 503 damb ua capçalèra Retry-After e un còs {"code": "model_loading"}. GET /healthz ei er unic "endpoint" dubèrt, e reporte se aqueth atlas a acabat de cargar-se.

Ua responsa simplificada de /v1/tides/extremes:

{
  "location": {"lat": 43.283, "lon": -2.170},
  "date": "2026-06-19",
  "reference": "MSL",
  "extremes": [
    {"type": "low",  "time": "2026-06-19T02:14:00Z", "height_m": 0.62},
    {"type": "high", "time": "2026-06-19T08:31:00Z", "height_m": 3.41},
    {"type": "low",  "time": "2026-06-19T14:42:00Z", "height_m": 0.58},
    {"type": "high", "time": "2026-06-19T20:59:00Z", "height_m": 3.55}
  ],
  "attribution": "FES2022 was produced by LEGOS, NOVELTIS and CLS; funded by CNES; distributed by AVISO, DOI 10.24400/527896/A01-2024.004."
}

2. Çò qu'era prediccion de marèa NON te ditz

tides-service preditz solament era marèa astronomica, relativa ath Nivèu Mejan dera Mar. Aquerò ei era nautor que era lua e eth solelh, per mejan dera sua atraccion gravitatòria, produirien en un punt e moment dats se non se passèsse arren mès. Non includís eth temporau costanèr (storm surge), es efèctes dera pression atmosferica, era possada deth vent (wind setup), ne cap auta contribucion non astronomica ath nivèu dera mar observat.

Un sistèma de bàishes pressions prigond pòt aumentar er aigua notablament per dessús de çò que ditz era marèa astronomica. Un vent de component maritim sostiengut amonta aigua contra era còsta per dessús d'açò. Arren d'açò apareish en ua responsa de tides-service, per disenh. Ua foncionalitat de seguretat entà resèrvas d'espòrts aquatics non pòt simplament tractar un numèro de tides-service coma "eth nivèu der aigua" — ei ua dada precisa mès entre vàrias, amassa damb es dades de vent e pression.

3. Redusir un atlas de diuèrsi gigabytes a çò que vertadèrament as besonh

Er atlas globau complèt FES2022b pese diuèrsi gigabytes, e auem licéncia entà emplegar-lo mès non entà redistribuir-lo publicaument segons es tèrmes d'AVISO, atau que víu en un DigitalOcean Space privat. En sòrta de que cada pod baishe er atlas globau complèt en aviar, escriuérem un "script" que retalhe er atlas en ua caisha delimitadora ath entorn dera nòsta zòna d'operacion reau — era peninsula iberica, eth golf de Biscaia e es Illes Canàries. Er aviada passèc de minutas a segondes.

Era part delicada ei qu'er atlas emmagazine era longitud ena convencion de 0–360°. Era nòsta zòna d'operacion trauèrse eth meridian de Greenwich, atau qu'era caisha delimitadora se monte a shivau dera costura 0/360:

REGION_BBOX = {
    "lat_min": 27.0, "lat_max": 46.5,
    "lon_ranges_0_360": [(342.0, 360.0), (0.0, 4.5)],
}

def crop_region(atlas, bbox):
    west, east = bbox["lon_ranges_0_360"]
    west_slice = atlas.sel(lon=slice(*west))
    east_slice = atlas.sel(lon=slice(*east))
    west_slice = west_slice.assign_coords(lon=west_slice.lon - 360)
    return xr.concat([west_slice, east_slice], dim="lon").sortby("lon")

Se te trompes en aguesta costura non obtiens un error — obtiens ua prediccion de marèa que ei silenciosament faussa exactament en bòrd occidentau dera region.

4. Verificar eth nòste trabalh contra ua autoritat portuària reau

Ath costat dera "suite" de tèsts abituau, executam tèsts "golden" que comparen es extrèms de marèa predits per tides-service en un lòc reau — Zarautz, ena còsta basca — contra es taules de marèa publicadas per Puertos del Estado. Ei era diferéncia entre "eth nòste modèl ei d'acòrd damb eth madeish" e "eth nòste modèl ei d'acòrd damb era realitat".

Arren d'açò ei un trabalh lusent. Mès ua responsa estreta e precisa a ua soleta question de fisica, onèstament delimitada, vau mès entà ua foncionalitat de seguretat qu'un servici ample de "condicions oceanicas" que confonís silenciosament era marèa astronomica damb tot çò aute qu'afècte ath nivèu dera mar.