La rubrica Scopri Couchbase continua con il quinto capitolo, che tratta in particolare del Peer-to-Peer Sync.

Nel precedente articolo abbiamo visto come creare un’app usando Couchbase Sync Gateway e come replicare i dati tramite una sincronizzazione remota del database. Oggi scopriremo come replicare i dati con la tecnica peer-to-peer, utilizzando una funzionalità specifica dell’edizione Enterprise di Couchbase Lite chiamata Peer-to-Peer Sync.

Perché dovrei optare per il Peer-to-Peer con Couchbase?

Peer-to-Peer (P2P) è un’architettura applicativa in cui tutti gli elementi coinvolti sono peer (hanno cioè pari importanza), senza una gerarchia tra di loro. Nel nostro caso ciò significa che ogni peer può agire come client e server da solo, se necessario.

Inoltre, la comunicazione tramite Peer-to-Peer Sync di Couchbase non richiede alcuna connessione ad Internet. Quindi può essere particolarmente utile in aree prive di connessione, in zone con poca connettività, o dove semplicemente si vuole evitare di avere rete.

D’altra parte, questa tecnologia richiede che tutti i dispositivi coinvolti debbano essere relativamente vicini tra loro. Infatti per comunicare i dispositivi peer possono usare:

  • Bluetooth, con un raggio di connettività breve
  • Wi-Fi-Direct che richiede che tutti i dispositivi siano connessi alla stessa rete Wi-Fi

Multipeer Connectivity Framework

Couchbase fornisce attraverso il suo SDK l’uso del proprio sistema di replica, ma spetta allo sviluppatore gestire la comunicazione tra i peer. Infatti, per gestire la connettività peer-to-peer e la comunicazione, Couchbase suggerisce di utilizzare il Multipeer Connectivity Framework (per la piattaforma iOS).
Questo framework ci consente di scoprire i dispositivi vicini e richiedere la connessione.

Successivamente, inizia la fase di autenticazione, dove i due peer possono autorizzare la connessione tramite un protocollo personalizzato.

Una volta connessi, siamo liberi di comunicare con chi desideriamo.

Stabilire una connessione

Gli elementi principali per stabilire una connessione sono:

  • MCNearbyServiceAdvertiser: funge come un broadcaster, ovvero pubblica il servizio che verrà cercato dal browser. Inoltre fornisce alcune informazioni per facilitarne la scoperta;
  • MCNearbyServiceBrowser: rilevatore di servizi Advertiser. Cerca i servizi offerti dai dispositivi vicini tramite Wi-Fi infrastrutturale, Wi-Fi peer-to-peer e Bluetooth (in iOS) o Ethernet (in macOS e tvOS). Offre la possibilità di invitare questi dispositivi a una sessione di connettività multipeer.

Una volta che il browser rileva il servizio, può avviare la connessione tra i due dispositivi.

Inviare e ricevere dati

Dopo aver stabilito la connessione inizia la sessione.

La sessione gestisce la connessione e la comunicazione del dispositivo, infatti è possibile inviare dati grazie al suo metodofunc send(_:toPeers:with:) e, attraverso i suoi metodi delegati func session(MCSession, didReceive: Data, fromPeer: MCPeerID) siamo in grado di rilevare i dati ricevuti.

Infatti, quando i dati vengono inviati utilizzando il metodo indicato, MCSessionDelegate attiverà il didReceive method.
A questo punto, puoi gestire a tua discrezione i dati ricevuti.

Couchbase Peer-to-Peer Sync

Il punto chiave della funzione di Peer-to-Peer Sync di Couchbase è la replica automatica tra diversi database. Questa funzione di Couchbase è uno stato di astrazione al di sopra del framework di comunicazione, che si occupa della memorizzazione dei dati inviati o ricevuti.

Elementi principali di Peer-to-Peer Sync

Gli elementi principali coinvolti in questa funzione sono:

P2P – ActivePeer and PassivePeer

Couchbase suddivide il comportamento dei peer in ActivePeer e PassivePeer.
ActivePeer è il peer che avvia la connessione e invia i dati. Un comportamento simile a quello di un client.
PassivePeer è il peer che accetta la connessione e che riceve i dati, a differenza dell’ActivePeer, ricopre il ruolo da server.

Tuttavia, ActivePeer e PassivePeer sono lati diversi dello stesso peer.
A volte abbiamo bisogno di un ActivePeer, altre volte potremmo aver bisogno di un PassivePeer.

ActivePeerPassivePeer
DatabaseDatabase
ReplicatorMessageEndpointListener
MessageEndpointConnectionMessageEndpointConnection

Come possiamo vedere dalla tabella qui sopra, la differenza principale tra i due peer è che l’ActivePeer è associato al Replicator e il PassivePeer è associato a MessageEndpointListener. È un dato di fatto che il PassivePeer intende semplicemente “ascoltare” le modifiche provenienti da ActivePeer (che ha avviato il processo di replica) e replicarle.

Inviare dati con Peer-to-Peer Sync

Come abbiamo detto durante l’introduzione, la funzione Peer-to-Peer Sync di Couchbase è un’astrazione al di sopra di un framework di comunicazione. Ciò significa che dobbiamo gestire da soli la comunicazione tra peer.

Infatti MessageEndpointConnection è un protocollo che dobbiamo implementare per comunicare con gli altri peer.

Per inviare dati ad altri dispositivi dobbiamo implementare questo metodo:

func send(message: Message, completion: @escaping (Bool, MessagingError?) -> Void)

Nel nostro caso utilizziamo MultipeerConnectivity Framework. L’implementazione sarà la seguente:

func send(message: Message, completion: @escaping (Bool, MessagingError?) -> Void) {
  do {
    try multiPeerManager.session.send(message.toData(), toPeers: 
    multiPeerManager.session.connectedPeers, with: .reliable)
  } catch {
    // handle error
  }
}

Il metodo che abbiamo appena implementato verrà automaticamente attivato non appena memorizzeremo i nostri dati nel database. Ora non ci resta che implementare questa funzione e archiviare alcuni dati per avviare la replica.

Ricevere dati con Peer-to-Peer Sync

Come abbiamo appena fatto per l’invio dei dati, dobbiamo anche consentire al framework di comunicazione di ricevere i dati. In questo caso il SessionDelegate passerà i dati al ReplicatorConnection per completare la duplicazione.

func session(_ session: MCSession, didReceive data: Data, fromPeer peerID: MCPeerID) {
replicatiorConnection.receive(message: Message.fromData(data))
}

Dimostrazione di Peer-to-Peer Sync

Come dimostrazione pratica di questa tecnologia, abbiamo realizzato una semplice app di chat che integra l’SDK Peer-to-Peer Sync di Couchbase. Abbiamo utilizzato Multipeer Connectivity Framework per gestire la comunicazione e Couchbase Lite per archiviare i messaggi di chat. Utilizziamo il processo di replica per inviare i messaggi all’altro dispositivo.

Couchbase Peer to Peer Sync – Dimostrazione

Ciò illustra chiaramente che i due dispositivi agiscono come ActivePeer quando inviano il messaggio e come PassivePeer quando lo ricevono.
Quando si preme il pulsante di invio, il messaggio viene memorizzato nel DB ActivePeer. Grazie alla soluzione P2P Sync di Couchbase, la replica viene automaticamente inviata a PassivePeer. Il metodo 

func session(MCSession, didReceive: Data, fromPeer: MCPeerID)

viene attivato e il

replicatiorConnection.receive(message: Message.fromData(data))

dice al PassivePeer di accettare i dati in arrivo, analizzarli e archiviarli nel database locale.

Per concludere, spero vi sia piaciuta la lettura. Rimanete sintonizzati per saperne di più!
Se ti perso gli articoli della rubrica “Scopri Couchbase con MOLO17”, cliccando qui per leggere la serie.