Sync e Architettura Offline-First
Panoramica
La piattaforma Impronto Enterprise adotta un'architettura offline-first: le applicazioni Flutter (cassa, cameriere, kiosk) funzionano interamente in locale, anche in assenza di connessione internet. I dati vengono memorizzati sul dispositivo tramite il database Isar e sincronizzati con il backend MongoDB quando la rete e disponibile.
Database Locale Isar
Ogni applicazione Flutter utilizza Isar come database locale embedded. Isar offre:
- Prestazioni native: query sotto il millisecondo anche con migliaia di record
- Schema tipizzato: i modelli Dart definiscono le collection con indici e relazioni
- Zero configurazione: nessun server locale, il database risiede nel filesystem dell'app
- Multi-piattaforma: funziona su Android, iOS, Windows, macOS e Linux
Le entita principali memorizzate localmente includono: prodotti, categorie, ordini, clienti, configurazioni cassa e turni.
Meccanismo di Sync Delta
La sincronizzazione tra client e server avviene tramite il servizio sync.service.js con un approccio delta sync:
- Il client invia una richiesta con il timestamp dell'ultima sincronizzazione (
lastSyncAt) - Il server interroga il database tenant per trovare documenti modificati dopo quel timestamp
- Il server restituisce solo i documenti cambiati (creati, aggiornati o eliminati)
- Il client applica le modifiche al database Isar locale
- Il client aggiorna il proprio
lastSyncAt
Questo approccio minimizza il traffico di rete: dopo la sincronizzazione iniziale completa, le successive trasferiscono solo le differenze.
SyncMixin e Eventi
Lato backend, il SyncMixin viene aggiunto ai servizi che devono supportare la sincronizzazione. Il mixin emette automaticamente eventi Moleculer quando un documento viene creato, aggiornato o eliminato:
sync.created-- nuovo documentosync.updated-- documento modificatosync.deleted-- documento rimosso
Questi eventi vengono utilizzati dal servizio sync.service.js per notificare i client connessi in tempo reale tramite il trasporto real-time (NATS o LAN WebSocket).
Sincronizzazione Bidirezionale
La sincronizzazione opera in entrambe le direzioni:
Server verso Client (pull)
Il client scarica periodicamente le modifiche dal server. Questo copre: aggiornamenti al catalogo prodotti, nuove configurazioni, modifiche ai tavoli e alle sale. La frequenza di pull e configurabile (default: ogni 30 secondi quando online).
Client verso Server (push)
Il client invia al server i dati creati localmente: ordini effettuati, movimenti di cassa, dati clienti. Il push avviene immediatamente quando la rete e disponibile, oppure viene accodato e inviato alla riconnessione.
Gestione Conflitti
In caso di modifiche concorrenti sullo stesso documento, il sistema applica la strategia last-write-wins basata sul timestamp updatedAt. Se un documento e stato modificato sia sul client che sul server:
- Vince la versione con il timestamp piu recente
- La versione perdente viene scartata (non mantenuta come versione alternativa)
- Per gli ordini, la strategia e piu conservativa: gli ordini creati offline vengono sempre preservati
Rilevamento Stato Rete
Le applicazioni Flutter monitorano continuamente lo stato della connessione di rete:
- Online: sincronizzazione attiva, push immediato, pull periodico
- Offline: operativita locale completa, modifiche accodate per il push successivo
- Degradato: connessione instabile, retry con backoff esponenziale
L'indicatore di stato rete e visibile nella barra superiore dell'applicazione cassa.
FAQ
D: Cosa succede se creo ordini offline e la sincronizzazione fallisce? R: Gli ordini creati offline vengono salvati nel database Isar con uno stato di "pending sync". Al ripristino della connessione, il sistema li invia automaticamente al server. Nessun ordine viene perso.
D: Quanto spazio occupa il database locale? R: Per un ristorante medio (500 prodotti, 100 ordini/giorno), il database Isar occupa circa 50-100 MB. I dati piu vecchi possono essere archiviati automaticamente per liberare spazio.
D: Posso forzare una sincronizzazione completa? R: Si, dalle Impostazioni dell'app e disponibile l'opzione "Reset sincronizzazione" che cancella il database locale e ri-scarica tutti i dati dal server.
Vedi Anche
- Architettura Microservizi -- Struttura del backend
- Trasporto Real-Time -- Comunicazione in tempo reale
- Multi-Tenancy -- Isolamento dati per tenant
- Panoramica Architettura -- Visione d'insieme della piattaforma