EN NO

Uten nett først, og hva det faktisk betyr

Alle maritime programvareleverandører sier «offline first». Nesten alle mener en skrivebeskyttet buffer. Denne siden beskriver mekanismen, detaljert nok til at en teknisk inspektør kan avgjøre om den er til å tro på.

Hva de fleste mener

En buffer er ikke «uten nett»

Den vanlige løsningen er at appen laster ned en kopi av det den tror du trenger, viser den når sambandet faller, og nekter enhver skriving til sambandet er tilbake. Det er nyttig i omtrent en time og ubrukelig på en seilas.

Kjennetegnet er hva som skjer når du prøver å lukke en jobb uten dekning. Blir knappen grå, eller blir endringen liggende i en kø som feiler stille tre timer senere, har du en buffer.

Hva dette er

Enheten holder både dataene og reglene

Hele fartøyets arbeidsdata ligger på enheten, i nettleserens varige lager, speilet i minnet slik at lesing er øyeblikkelig. Domenereglene — tilgangsevaluatoren, tilstandsmaskinen for arbeidstillatelser, øvelsesintervallmotoren, hviletidskontrollene, vedlikeholdsbegrensningene — er en ren pakke som kjører uendret på enheten.

En skriving vurderes derfor umiddelbart, mot de samme reglene serveren ville brukt. Blir den nektet, blir den nektet der og da, med en begrunnelse. Blir den godtatt, er den godtatt — den er ikke foreløpig, og den blir ikke stille omgjort når sambandet kommer tilbake.

  • Skrivinger køes i en varig utboks. Køen overlever at nettleseren lukkes, at nettbrettet slås av og at enheten går tom for batteri. Det er ikke en liste i minnet som en oppfriskning kaster.
  • Identifikatorer lages på enheten. UUIDv7, slik at en rad opprettet til sjøs har sin endelige identitet fra det øyeblikket den lages, og ingenting må omnummereres ved framkomst.
  • Hver operasjon er idempotent. En sending som gjentas fordi satellittsambandet falt midt i, gjenkjennes som duplikat og anvendes én gang. Dette er testet ved å spille av to enheters fulle køer ordrett på nytt.

Konflikter

To enheter, én rad, ingen dekning

Bro-PC-en og et nettbrett i maskinrommet redigerer begge den samme komponenten, dager fra hverandre, ingen av dem tilkoblet. Begge kommer fram til slutt. Noe må avgjøre.

Hver enhet fører en hybrid logisk klokke — et tidsstempel som også teller, slik at to enheter med systemklokker som er uenige, likevel lager en rekkefølge begge vil være enige om etterpå. Sammenslåingen skjer per kolonne, ikke per rad: endret broen plasseringen og nettbrettet navnet, overlever begge endringene. Endret begge navnet, vinner den nyeste klokken, og den eldre registreres som hoppet over — ikke stille tapt.

Egenskapen som betyr noe, er at ankomstrekkefølgen ikke påvirker resultatet. Uansett hvilken enhet som kobler seg opp først, ender begge radene likt. Det er slått fast av en test som kjører de samme tre endringene i begge rekkefølger og sammenligner radene.

Vi fant en reell feil i dette under nettopp den testen: klokkesammenligningen hadde beholdt den tidligste skrivingen til en kolonne i stedet for den siste, slik at to enheter som koblet seg opp i motsatt rekkefølge, kunne sprike. Den er rettet, og testen som fant den, er grunnen til at vi vet det.

Revisjonssporet

Per fartøy, hashlenket, og lesbart i produktet

Hver skriving serveren godtar, registreres med hvem som gjorde den, på hvilken enhet, til hvilken tid, og SHA-256 av forrige post. Kjeden går per fartøy, slik at ett fartøys historikk kan overleveres til en inspektør uten å overlevere hele flåtens.

Den er lesbar inne i produktet, av enhver med tilgangen, i stedet for å være en tabell bare leverandøren kan spørre.

Skallet

En telefon i et maskinrom

Applikasjonen er en progressiv webapp. Den installeres på hjemskjermen, kjører i fullskjerm, og skallet — koden, skriftene, ikonene — er bufret slik at den starter helt uten nett. Skriftene er innebygget i stilarket i stedet for hentet, fordi en skriftforespørsel som henger, er en skjerm som ikke tegnes.

Den samme koden pakkes for App Store og Google Play, med de enhetsspesifikke delene — lagring, sikker lagring, nettverksstatus, utskrift, kamera — bak et lite sett porter, slik at resten av applikasjonen verken vet eller bryr seg om hvilken den kjører i.