Abbiamo una pagina delle metriche di attività in cui gli utenti possono selezionare un periodo di date e vedere l'attività aggregata di altri utenti (per azione) e opzionalmente filtrare tutto con 4 o 5 campi. Le azioni avvengono in sequenza, ma uno dei campi è "Tag" e l'utente può modificare i tag della vecchia azione in qualsiasi momento. I dati sono in una Cassandra 3.7 con la chiave di partizione che è company_id, action_year, action_week. Per ogni settimana abbiamo circa 70.000 azioni (ci sono 20 colonne con dati long o int per ogni azione, ogni azione con la chiave di partizione più action_timestamp e action_key come chiave di riga).
PRIMARY KEY ((company_id, action_year, action_week), action_date, action_key)
) WITH CLUSTERING ORDER BY (action_date ASC, action_key ASC)
Con una prima versione stiamo interrogando le azioni complete per un periodo e facendo tutte le aggregazioni e il filtraggio in memoria. Quando l'utente seleziona un paio di settimane, l'intera richiesta richiede 10 o 15 secondi. E ci aspettiamo di scalare a migliaia di utenti che richiedono queste analisi che dovrebbero funzionare come analisi quasi in tempo reale.
Abbiamo pensato di spostare il filtro su C * usando "allow filtering", ma la clausola WHERE sembra molto limitata. E siamo anche preoccupati per i frequenti aggiornamenti delle etichette.
Quali altre opzioni abbiamo? Abbiamo pensato a Druid, ma forse è troppo per quello di cui abbiamo bisogno. Spark forse? Non stiamo usando C * giusto e potremmo aver bisogno di memorizzare le settimane intere altrove?