Analitika, ami nem hizlalja az adatbázist
A saját webanalitikám minden látogatásról és kattintásról nyers sort ír. Egy idő után ez lesz az adatbázis legnagyobb táblája, miközben a nyers sorokra már senkinek nincs szüksége, csak az összesítésre.
Napi összesítő
Minden nap végén egy kis táblába összesítem a napot: látogatók, oldalmegtekintések, források, vásárlási tölcsér, hibák. Dimenzió, kulcs és mutató szerint tárolom, ezért egyetlen táblába sokféle adat fér, és a sorok kicsik maradnak.
Újrafuttatható számolás
Az összesítés idempotens: egy nap újraszámolása egy tranzakcióban felülírja a nap korábbi sorait. Ha elcsúszik valami, vagy késve érkeznek események, egyszerűen újra lefuttatom. Ezért a tegnapot éjfél után és hajnalban is összesítem.
// Idempotent: re-running a day replaces that day's rows in one transaction.
DB::transaction(function () use ($date, $rows) {
DB::table('analytics_daily_rollups')->where('date', $date)->delete();
foreach (array_chunk($rows, 500) as $chunk) {
DB::table('analytics_daily_rollups')->insert($chunk);
}
});
// ... and in the prune service: raw rows are only deleted for days that already have a summary.
foreach ($missing as $date) {
if ($budget <= 0) {
// No budget left: delete only up to the first day without a summary.
$safeCutoff = Carbon::parse($date)->startOfDay();
break;
}
if (! $dryRun) {
$this->rollup->rollupDay(Carbon::parse($date));
}
$budget--;
}
do {
$n = DB::table($table)->where($column, '<', $safeCutoff)->limit(self::CHUNK)->delete();
} while ($n > 0);
Kivonat valódi kódból, anonimizálva.
Törlés csak az összesítés után
A nyers sorokat megőrzési idő után törlöm, de csak azokról a napokról, amelyeknek már van összesítőjük. Ha egy törlendő napnak még nincs, előbb elkészítem. Futásonként legfeljebb kilencven napot pótol, és ha elfogy a keret, csak az első összesítetlen napig töröl.
Az alapértelmezett mód a próbafuttatás, a tényleges törlés külön kapcsolóval engedélyezett, és darabokban megy, hogy ne zárolja a táblát. A nyers sort bármikor eldobhatom, az összesítőt nem.
Hasonló problémán dolgozol?
Ha elakadtál, vagy átnéztetnéd a megoldásodat, írj, szívesen megnézem.
Írok neked →További cikkek
Nagy fájlok feltöltése megszakadás nélkül Laravelben
Hogyan oldottam meg a nagy videók feltöltését úgy, hogy egy megszakadt kérés ne vigye el az egész feltöltést.
Elolvasom →Legacy rendszer újraírása működés közben
Hogyan cserélek le egy régi rendszert úgy, hogy a felhasználók közben dolgozhatnak: azonos viselkedés, eltérések listája, naplózás.
Elolvasom →