Kutengeneza Heatmaps za Video kwa Kutumia HyperLogLog Katika PostgresQ
Unataka kuwaonyesha wahariri (editors) mahali hasa watazamaji wanapoacha kutazama video.
Ili kufanya hivyo, unahitaji heatmap. Heatmap hii inaonyesha watazamaji wa kipekee (unique viewers) kwa kila sekunde ya video.
Katika TrendVidStream, tunachakata matukio (events) milioni 40 kila siku. Tunatumia mfumo rahisi (stack): PHP 8.4 na Postgres.
Tatizo ni "cardinality". Kuhesabu watazamaji wa kipekee kwa kila sekunde ni vigumu.
Njia ya kawaida (naive way):
- Tumia jedwali la matukio ghafi (raw events table).
- Endesha COUNT(DISTINCT viewer_hash).
- Panga kwa video na "time bucket".
Hii ilifeli haraka. Kwa data ya siku 90, unahitaji mistari (rows) bilioni 3.6. Hoja (queries) zilichukua sekunde 9. Pia, idadi za kipekee haziwezi kujumlishwa (roll up). Huwezi kujumlisha "uniques per hour" ili kupata "uniques per day" kwa sababu mtu yuleyule anaweza kuonekana katika zote mbili.
Suluhisho: HyperLogLog (HLL).
HLL hutengeneza "sketch" ndogo ya seti ya data. Ni ndogo sana, takriban 10 KB, bila kujali ni mamilioni mangapi ya watu wanaotazama.
Kwa nini HLL inafanya kazi kwa heatmaps:
- Ukubwa uliowekwa: Inabaki kuwa ndogo.
- Inaweza kuunganishwa: Unaweza kuunganisha (union) sketch mbili ili kupata jumla ya idadi. Hii inatatua tatizo la "rollup".
Utekelezaji Wetu:
Tunatumia extension ya postgresql-hll. Tunatumia majedwali mawili.
- Jedwali la mpito (staging table): Jedwali ambalo linaongezwa tu (append-only) ambapo PHP huandika "raw heartbeats". Hatutumii indexes hapa ili kuweka uandishi wa data kuwa wa haraka.
- Jedwali la sketch: Hili huhifadhi data za HLL.
Tunatumia cron job kuhamisha data kutoka kwenye jedwali la mpito kwenda kwenye jedwali la sketch. Tunatumia amri hii:
INSERT INTO video_heatmap (...)
SELECT ..., hll_add_agg(hll_hash_text(viewer_hash), 14, 5)
FROM beacon_staging
GROUP BY ...
ON CONFLICT (...)
DO UPDATE SET viewers = video_heatmap.viewers || EXCLUDED.viewers;
Opereta ya "||" huunganisha data mpya kwenye sketch iliyopo.
Matokeo:
- Kasi ya hoja (query speed): Hoja zetu za heatmap huchukua milisekunde 15 hadi 40. Njia ya zamani ilichukua sekunde 9.
- Uhifadhi (storage): Seti yetu ya data ya siku 90 ni GB 40. Njia ya zamani ingechukua TB 1.2.
- Usahihi (accuracy): Tunaona makosa ya takriban 0.6% hadi 1.4%. Kwa heatmap, hii ni bora kabisa.
Mafunzo tuliyopata:
- Fanya hash ndani ya kanzidata (database). Usifanye hash kwenye programu (app) yako.
- Fanya maboresho kwa makundi (batch updates). Usiboreshe sketch moja baada ya nyingine kwa mstari mmoja mmoja, vinginevyo utatengeneza maeneo yenye msongamano mkubwa wa uandishi (write hotspots).
- Tumia salt ya kila siku kwa hashes. Hii inalinda faragha na kuweka sketches zako za kila siku kuwa safi.
Ikiwa dashibodi yako ni nzito kwa sababu ya COUNT(DISTINCT), hauhitaji ghala kubwa la data (data warehouse). Unahitaji HLL.
