Il teorema del CAP (Consistency, Availability and Partition tolerance), ideato dall’informatico statunitense Eric Brewer, afferma afferma che è impossibile per un sistema informatico distribuito fornire simultaneamente tutte e tre le seguenti garanzie: Coerenza, Disponibilità e Tolleranza delle partizioni.
Di seguito è riportata una breve definizione di questi tre termini:
- Consistency: E’ la garanzia che ogni nodo in un cluster distribuito restituisca lo stesso dato più recente, ovvero proveniente dall’ultima scrittura dello stesso, oppure un messaggio di errore. Ogni client che interroga un qualsiasi cluster del sistema distribuito ha la stessa “vista” dei dati. Ad esempio, un’applicazione bancaria distribuita mostrerà sempre il saldo corretto nel proprio account.
- Availability: significa semplicemente che ogni richiesta deve ricevere una risposta. Un server funzionante non può ignorare una richiesta di un client ed è obbligato a dare una risposta. Nella maggior parte dei sistemi reali, ovviamente, una risposta sufficientemente ritardata è altrettanto negativa quanto una risposta non data.
- Partition tolerance: il sistema continua a funzionare, nonostante il numero di messaggi ritardati dalla rete tra i nodi. Un sistema tollerante alle partizioni può sopportare qualsiasi problema di rete che non si traduce per forza in un guasto dell’intera rete. I record di dati sono sufficientemente replicati tra i nodi che garantiscono una tolleranza anche su interruzioni intermittenti. Quando si tratta di sistemi distribuiti moderni, il Partition Tolerance non è un’opzione, ma una necessità.
Lo schema seguente mostra i tre termini sopra riportati. Come si può vedere non si raggiungerà mai lo stato formato dall’unione di tutti e tre gli stati:
Teorema CAP – Coerenza, disponibilità, tolleranza delle partizioni
Database e Teorema CAP: come si comportano
- I sistemi RDBMS come Oracle, MySQL ecc. supportano Consistency e Availability.
- Il datastore NoSQL come HBase supporta Consistency e Partition tolerance.
- Datastore NoSQL come Cassandra, CouchDB supporta Availability e Partition tolerance.
Quale sistema DB scegliere in base al teorema CAP?
- Database basato su CP: quando è fondamentale che tutti i client visualizzino una vista coerente del database, gli utenti di un nodo dovranno attendere che qualsiasi altro nodo entri in accordo prima di poter leggere o scrivere sul database, disponibilità prende un backseat per coerenza e si potrebbe desiderare di scegliere un database come HBase che supporta CP (Consistency and Partition Tolerance)
- Database basato su AP: quando è necessario che il database rimanga sempre disponibile, è possibile utilizzare un sistema DB che consenta ai client di scrivere i dati su un nodo del database senza attendere che altri nodi concordino. Il sistema DB si occupa quindi della riconciliazione dei dati in un momento successivo. Questo è lo stato di coerenza finale. Nelle applicazioni che potrebbero sacrificare la coerenza dei dati in cambio di prestazioni enormi, è possibile selezionare database come CouchDB, Cassandra.