Blog ·
Un registro che conta prima di ogni prezzo
Il monitoraggio produce un numero per ogni controllo molto prima che esista un prezzo. Ecco perché il conteggio è stato costruito per primo e cosa protegge.
Di Provibr
Il monitoraggio non ha un prezzo. Nessun importo, nessuna valuta, nessun piano, nessuna riga di fattura. Quello che esiste da questo ciclo di lavoro è un registro che annota ogni controllo realmente inviato dalla piattaforma, lo conserva per tredici mesi e chiude ogni ora in un secchio che non viene più modificato.
Costruire il conteggio prima dell’addebito sembra l’ordine sbagliato finché non lo si è fatto una volta al contrario. Un contatore che nasce accanto a una fattura eredita ogni comodità che quella fattura desidera: un nuovo tentativo conteggiato in silenzio perché altrimenti il totale sembrava strano, una correzione applicata modificando la riga. Sono decisioni, e si prendono meglio quando nessun totale ne dipende.
Il registro quindi esiste, non contiene denaro, e una delle sue colonne è deliberatamente vuota.
Conta ciò che è davvero uscito
Un controllo pianificato attraversa pochi stati, e il registro pone una sola domanda per stato: è uscito traffico dall’edificio. Questo è scritto come tabella su ogni esito e non come diramazione con un ramo predefinito, perché un ramo predefinito è proprio la via per cui un settimo esito diventa in silenzio «non conta» e manca un mese.
| Esito | Riga scritta | Conta | Perché |
|---|---|---|---|
| pianificato | no | no | lo slot è riservato, non è ancora stato inviato nulla |
| assegnato | no | no | assegnato ma non inviato; la riga nasce all’invio |
| inviato | sì | sì | un controllo è realmente uscito |
| completato | sì | sì | concluso; la riga l’aveva già ricevuta all’invio |
| mancato | no | no | mai inviato: nessun agente, nessuna sonda sana, manutenzione o slot scaduto |
| scaduto | no | no | il termine è passato senza che partisse nulla |
Due di queste righe meritano una frase propria.
Un controllo che raggiunge una macchina morta conta comunque. C’è stato traffico e c’è stata una misura; che la risposta sia «non raggiungibile» è il risultato e non la domanda. Una regola che contasse solo i controlli riusciti addebiterebbe di meno proprio ai clienti per cui si lavora di più.
E «scaduto» è più sottile di quanto sembri, perché una richiesta può scadere dopo essere stata inviata. Non si conta due volte, e non per fortuna: un tick raggiunge quello stato solo tramite la passata che tocca i tick che non hanno mai superato l’invio, e ciò che è partito risultava già inviato e ha la sua riga da allora.
La classe di origine, la nostra sonda o l’agente del cliente, compare nella riga e nella firma della funzione che decide. Oggi contano allo stesso modo, e proprio per questo la classe è scritta anziché data per scontata.
Un tick, una riga
Il passaggio di riserva è il caso che gonfia in silenzio un numero di utilizzo. Un controllo parte da un’origine, quell’origine non risponde, un’altra subentra, e ora ci sono due tentativi per una sola misura.
Qui è un indice univoco su una chiave della forma tick:<identificativo del tick>. Ripetizioni e passaggi di riserva nello stesso tick producono la stessa chiave, quindi il secondo inserimento entra in conflitto e non restituisce nulla. Entrambi i percorsi di scrittura fanno così; nessuno dei due consulta prima, perché tra una consultazione e un inserimento entra un secondo gateway.
La chiave è una colonna di testo e non il riferimento al tick, ed è qui la parte interessante. I tick vivono sette giorni, l’utilizzo tredici mesi. Quando la passata rimuove il tick quel riferimento resta vuoto, e in Postgres un valore vuoto non è mai uguale a un altro valore vuoto: un indice univoco su quella colonna comincerebbe quindi a tollerare duplicati una settimana dopo, senza dire nulla.
Anche una prova manuale è traffico
C’è un pulsante che esegue un controllo subito. Non conta, e viene comunque registrato.
Contano entrambe le metà. Non conta perché una persona che preme un pulsante non è il servizio pianificato. Viene registrato perché resta traffico verso la macchina di qualcuno, e mille pressioni all’ora sono esattamente ciò che un sistema di utilizzo deve saper mostrare. Una seconda tabella che nessun prospetto consulta nasconderebbe proprio il caso in cui il numero è interessante.
A separare le due non è una convenzione ma un vincolo nella base dati: una riga di tipo manuale non può contare né portare un tick. «Manuale e conteggiato» non può esistere, e questo conta perché una riga simile appare del tutto ordinaria in qualsiasi prospetto.
Un’ora chiude tardi, e poi non cambia più
I secchi vanno per organizzazione, ora, classe di origine e tipo di controllo. Un’ora viene chiusa solo quando sono passati quindici minuti dell’ora successiva.
Il motivo ovvio, un risultato di misura tardivo, non è quello vero; i risultati non toccano il totale. Ciò che può davvero arrivare tardi è la riga stessa: una transazione confermata alle 10:59:59 diventa visibile alle 11:00:00, più gateway leggono ciascuno il proprio orologio, e uno che è stato assente per poco recupera dopo il ritardo. Quindici minuti sono un ordine di grandezza più di tutto ciò che un controllo può durare, dove il tempo massimo di attesa è di 120 secondi e la prenotazione di 45.
Una volta chiusa, un’ora non si modifica. Un evento tardivo produce una riga nuova che punta alla riga base con un motivo leggibile dalla macchina, mai un aggiornamento. Lo impone la forma e non la disciplina: l’indice univoco su organizzazione, ora, classe di origine e tipo è parziale e copre solo le righe che non sono correzioni, così una seconda correzione sulla stessa ora non entra in conflitto con la prima e non sparisce. Se le correzioni condividessero quell’indice si perderebbe proprio la prova utile in una contestazione. Il motivo stesso è una parola e non una frase libera, perché il pannello lo traduce in nove lingue e un export raggruppa su di esso.
Limiti che non sono un listino
Ogni organizzazione ha un margine consentito, e ogni numero al suo interno è stato scelto per fermare un incidente, non per descrivere un pacchetto.
Al massimo 200 regole, deliberatamente lo stesso numero che la funzione di creazione già imponeva: un valore predefinito più basso avrebbe spinto conti esistenti oltre il limite il primo giorno e avrebbe fatto scattare senza preavviso la regola di sospensione più sotto. Al massimo 9 origini per regola, cioè le otto postazioni ospitate più un agente che lo schema già consentiva. Tutti i tipi di controllo noti, derivati da quell’elenco anziché scritti a mano, così che un settimo tipo non risulti vietato per impostazione predefinita a tutti. Un minimo di 60 secondi, che un margine può alzare e mai abbassare; abbassarlo è un diritto a pagamento separato che ha un nome e non esiste.
Il numero di revisione di quella riga è ciò che finisce nel registro, e zero significa «non c’è alcuna riga, questo è il valore predefinito». Senza questa distinzione una riga di utilizzo dell’anno scorso non è riconducibile a ciò che allora era consentito, ed è esattamente per questo che si conserva una revisione.
Cosa si sospende quando il margine si riduce
Se qualcuno abbassa un margine sotto ciò che un conto utilizza, alcune regole si fermano. Quali è una decisione, e i candidati erano due.
Prima le più costose non è praticabile, perché non c’è un prezzo. Significherebbe dedurre il costo dal numero di origini o dall’intervallo, e allora si sospende proprio la sorveglianza più fine che il cliente possiede. Chi riduce il proprio piano preferisce perdere una misura periferica anziché l’avviso che lo sveglia di notte.
Quindi le regole più vecchie proseguono e le più recenti si sospendono. Le più vecchie portano lo storico di incidenti più lungo e gli avvisi su cui le persone contano, e «l’ultima cosa accesa è la prima a spegnersi» è l’unico ordine che un cliente può prevedere senza leggere il nostro codice. L’ordinamento è data di creazione e poi identificativo di regola, due chiavi perché applicare un modello crea più regole nello stesso millisecondo; senza il secondo criterio l’anteprima non coinciderebbe con quanto accade poi.
Le regole che violano un limite di forma, un tipo vietato, origini ospitate non più consentite, troppe origini, vengono rimosse per prime e poi contano in ciò che resta. Un intervallo diventato troppo rapido non sospende proprio nulla: un minimo alzato rifiuta una regola nuova o modificata e lascia in pace quelle in esecuzione finché qualcuno non le tocca.
La colonna vuota
I secchi hanno una colonna invoice_ref ed è vuota. È una cucitura con un nome e non una dimenticanza, nello stesso spirito del diritto che ha un nome e nessuna implementazione: quando arriverà la fatturazione la forma che le serve sarà già lì, e nulla del conteggio dovrà essere ripensato sotto scadenza.
Due decisioni affini seguono lo stesso ragionamento. Il registro ha una tabella propria anziché derivare dai tick, perché i tick vivono sette giorni e questo 395. E le righe per singolo controllo restano fuori dall’esportazione dei dati personali, con il motivo scritto accanto: centinaia di migliaia al mese, un export che taglia ogni sezione a 25.000 righe, e secchi orari che portano gli stessi totali. I secchi e la riga dei limiti invece sono inclusi.
Cosa metteremmo per iscritto
- Costruisca il contatore prima del prezzo. Ogni domanda si risponde con più onestà quando nessun totale dipende dalla risposta.
- Registri nel momento in cui il lavoro parte, non quando arriva la risposta, e una risposta tardiva smette di essere un problema di misura.
- Faccia sopravvivere la chiave di idempotenza al proprio soggetto. Una chiave posata su una riga che verrà rimossa comincia ad ammettere duplicati secondo un calendario.
- Elenchi ogni esito in una tabella. Un ramo predefinito trasforma uno stato nuovo in uno zero silenzioso.
- Le correzioni sono righe, mai modifiche, e l’unicità che protegge l’originale non deve bloccare la correzione.
- Scelga l’ordine che il suo cliente può prevedere, e metta per iscritto quello che ha scartato.
Per chiarezza su cosa sia tutto questo: il monitoraggio è dietro un interruttore di rilascio disattivato per impostazione predefinita, non esiste uno strato di diritti che contenga denaro, e nulla di ciò è acquistabile oggi. Due cose restano non provate. La passata di conservazione non è mai stata eseguita su una riga davvero vecchia, solo sullo schema. E il componente che chiude le ore è stato provato attraverso la sua funzione e non attraverso un processo di lunga durata, quindi un gateway assente per una notte che poi recupera è ragionato e non osservato.
Dal lavoro di monitoraggio su Provibr. Perché una sonda non porta diritti di cui non ha bisogno è in una sonda che non si lascia convincere di nulla, e perché un incidente non si chiude solo perché le misure sono cessate è in un incidente che non si chiude sul silenzio.