Ugrás a tartalomra
Rapcsány Krisztián Rapcsány Krisztián
← Összes cikk
2 perc olvasás

Analitika, ami nem hizlalja az adatbázist

Laravel Adatbázis Analitika

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.

AnalyticsRollupService.php
// 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 →
Ajánlatot kérek →