La mia comprensione è che la caratteristica principale che Cassandra ha da offrire è prestazione lineare a qualsiasi scala ; significa che se so che il nodo 1 C * è in grado di gestire 500 query o comandi al secondo dalla mia app, allora posso anche essere certo che 100 nodi C * aggiunti allo stesso cluster saranno in grado di gestire query o comandi 500 * 100 = 50K al secondo.
La mia comprensione del compromesso principale tra RDBMS e NoSQL è che i sistemi NoSQL tendono a favorire la scalabilità, ma che richiede loro (meccanicamente, a causa dell'implementazione) il bisogno di rilassare la loro transabilità. Quindi i sistemi NoSQL come C * generalmente scalano estremamente bene, ma non sono in grado di offrire le classiche transazioni ACID che i sistemi RDBMS come MySQL possono.
La mia comprensione è che dal momento che scalabilità e transabilità si escludono a vicenda l'una dall'altra, non ci sono database magici NoSQL che offrono scalabilità C * -like (di nuovo: prestazioni lineari a qualsiasi scala) e che offrono client Java con JTA implementate (capacità di commit + rollback) in essi.
Queste sono le mie assunzioni in questa domanda: se ho sbagliato o sbagliato su qualcuno di loro, per favore inizia correggendomi!
Supponendo che io sia più o meno corretto in tutte queste ipotesi, allora cosa si fa quando si ha effettivamente bisogno di transazioni di scalabilità e ACID? La mia unica idea qui sarebbe implementare quanto segue:
- Configura l'app per scrivere su un RDBMS (come MySQL) utilizzando un driver compatibile con JDBC / JTA (ad esempio utilizzando le transazioni)
- In qualche modo , configura l'RDBMS per replicare (in tempo reale o con latenza molto bassa) in un DB altamente scalabile (come Cassandra). Questa potrebbe essere un'opzione di configurazione che il RDBMS stesso offre, o molto più probabilmente, sarà il codice di cui hai bisogno per scrivere te stesso continuamente su ETL da un sistema all'altro. L'idea qui è che l'app dovrebbe leggere dalla tabella NoSQL e avere comunque letture molto performanti rispetto a una quantità enorme di dati.
- In qualche modo configura le tabelle RDBMS con TTL in modo che le tabelle non diventino estremamente grandi e inizino a richiedere sharding e altri trucchi che possono rallentare le transazioni. Anche in questo caso, questa potrebbe essere un'opzione di configurazione offerta dallo stesso RDBMS oppure è probabile che il codice sia necessario per scrivere da solo.
Esistono soluzioni meglio conosciute qui? Qualsiasi insidia / caveat a questo approccio?