Ph?n 3: ?ng d?ng Kafka vào ví d? h? th?ng Ad Click Aggregation
Ad Click Aggregation là h? ???c s? d?ng ?? theo d?i hành vi c?a ng??i dùng th?ng qua hành vi click vào popup qu?ng cáo. D? li?u này s? ???c t?ng h?p l?i, tính toán và g?i cho các advertiser phan tích, ?ánh giá và ??a ra các chi?n d?ch qu?ng cáo phù h?p.
B?t ??u thi?t k? th?i nào:
D?a vào yêu c?u ?? bài, ta có th? xác ??nh ???c r?ng:
V? workflow, ta có th? b?t ??u nh? sau:
Qu?ng cáo (popup, link,...) ???c ??t tr?c ti?p trên website, client s? click tr?c ti?p vào qu?ng cáo.
Tuy nhiên, có m?t v?n ??: client có th? sao chép ???ng link qu?ng cáo và truy c?p tr?c ti?p, kh?ng c?n th?ng qua website. ?i?u này khi?n h? th?ng kh?ng th? ghi nh?n hành trình c?a client.
Gi?i pháp ???c ??a ra là m?i qu?ng cáo s? ???c g?n m?t Ad_id duy nh?t. Khi client click vào qu?ng cáo, browser s? g?i request kèm v?i Ad_id t?i Click Processor.
T?i ?ay Click Processor s? truy xu?t th?ng tin c?a Ad_id t? Ad Database và nh?n v? các th?ng tin nh? RedirectUrl.
Click Processor s? g?i ng??c l?i v? Client request HTTP 302 Redirect, cho phép browser t? ??ng chuy?n h??ng t?i trang qu?ng cáo.
T?i ?ay, client ?? có c? ch? ?? t? Redirect khi click vào qu?ng cáo. V?y còn Advertiser thì sao? H? s? theo d?i các s? li?u nh? th? nào ?
D?a vào yêu c?u này, h? th?ng c?n b? sung thêm h? th?ng c? s? d? li?u phan tích (Analyst Database) ?? l?u tr? th?ng tin các l??t click. T? ?ó Advertiser s? có th? truy xu?t và phan tích d? li?u b?ng cách s? d?ng Query Execution Service (SQL) v?i các hàm tính toán (aggregation).
Vi?c x? ly truy v?n s? d?ng GroupBy cho toàn b? d? li?u trong database liên t?c theo d?ng Batch s? có th? gay ra Bottleneck khi s? l??ng lên t?i 10,000 click m?i giay. ??c bi?t, ?i?u này s? làm ?nh h??ng t?i ?? chính xác và tr?i nghi?m c?a Advertiser khi truy v?n h? th?ng.
?? gi?i quy?t v?n ?? này, vi?c tính toán tr??c (re-aggregation), và ch? g?i k?t qu? t?i Advertiser là c?c k? c?n thi?t, bên c?nh ?ó chúng ta c?ng nên s? d?ng các d?ch v? dành riêng cho vi?c x? ly và phan tích d? li?u l?n nh? là:
Cassandra là m?t s? l?a ch?n t?t cho vi?c insert và update liên t?c v?i s? l??ng l?n và liên t?c, nh?ng nó l?i có v?n ?? v?i vi?c tính toán t?ng h?p và vi?c truy xu?t theo ph?m vi. D?n t?i vi?c s? ch? dùng ?? thu th?p d? li?u.
Apache Spark (open-source and distributed processing system): s? d?ng m? hình Map-Reduce ?? ??c raw-events theo d?ng parallel chunks, t?ng h?p chúng b?i Ad_id và minute timestamp, sau ?ó s? ghi k?t qu? ?? t?ng h?p vào Online Analyst Processing.
Database OLAP (Online Analyst Processing), chúng ta s? c?n s? d?ng m?t c?ng c? chuyên bi?t, ???c t?i ?u hóa cho vi?c phan tích và tính toán s? li?u v?i kích th??c l?n. Tùy vào h? sinh thái s? có th? s? d?ng: Snowflake, Bigquery ho?c là Redshift.
Workflow m?i s? là:
Tuy nhiên, v?n ?? ??u tiên x?y ra v?i Advertiser khi k?t qu? h? nh?n v? s? là nh?ng s? li?u c? cho t?i l?n ch?y job ti?p theo, t?o ra ?? tr? cho h? th?ng. V?n ?? ti?p theo, ki?n trúc này kh?ng có kh? n?ng ?? m? r?ng, cho nên s? kh?ng th? x? ly trong tr??ng h?p s? l??ng click b?t thình lình t?ng ??t bi?n.
?? kh?c ph?c v?n ?? này, ph?i thay ??i l?i ki?n trúc c?a h? th?ng t? Batch Processing sang Streaming Processing. ??m b?o r?ng k?t qu? s? ???c t?o ra ngay khi s? ki?n t?i ch? kh?ng ??i ch?y theo scheduler.
K?t qu? sau khi ???c Streaming Spark tính toán xong s? ???c l?u t?m ? trong Memory và update chúng khi s? ki?n m?i t?i.
Khi t?i th?i ?i?m k?t thúc c?a m?t time window (ví d?: m?i phút), ta có th? chuy?n d? li?u ?? t?ng h?p vào bên trong OLAP database ?? ph?c v? phan tích và truy v?n c?a Advertiser.
Workflow m?i s? là:
M? hình này c?ng khó ??t ???c real-time hoàn toàn (t??ng t? m? hình tr??c), nh?ng nó v??t tr?i h?n v? m?t t?i ?u hóa. Th?i gian x? ly và c?p nh?t vào OLAP Database có th? ???c gi?m xu?ng ch? còn vài giay, ?i?u mà r?t khó ??t ???c n?u s? d?ng Batch Spark Processing.
Ngoài ra, m? hình này còn có kh? n?ng t?i ?u hóa tài nguyên, phan tán d? li?u, và m? r?ng linh ho?t, giúp h? th?ng x? ly hi?u qu? ngay c? khi s? l??ng click t?ng ??t bi?n, ??m b?o hi?u su?t và ?? ?n ??nh cao h?n.
?i sau h?n, làm nh? th? nào ?? có th? m? r?ng lên 10,000 clicks m?i giay?
Tr?i qua xuyên su?t các v?n ?? b?t ??u t? khi Client g?i request click cho t?i hi?n t?i, ta có th? x? ly v?n ?? này nh? sau:
Ti?p theo, làm sao ?? ta ??m b?o r?ng cho dù tr??ng h?p nào x?y ra thì chúng ta c?ng s? kh?ng b? m?t b?t k? d? li?u click nào?
??i v?i Data Streaming - Apache Kafka:
Kh? n?ng phan tán (Distributed): Kafka streams phan ph?i d? li?u xuyên su?t các node ?? ??m b?o tính m? r?ng và kh? n?ng x? ly song song.
Kh? n?ng ch?u l?i (Fault-Tolerant): D? li?u ???c sao chép (replica) qua các node và trung tam d? li?u, vì th? th?m chí 1 node b? fail s? có node khác thay th?, ??m b?o d? li?u kh?ng b? m?t.
Persistent Storage: H? th?ng streaming nh? Kafka cho phép l?u tr? d? li?u trong vòng 7 ngày (th?i gian l?u tr? - retention period). ?i?u này có ngh?a là:
C? ch? này ??m b?o tính liên t?c và kh? n?ng ph?c h?i cao cho h? th?ng, ??ng th?i h? tr? tái x? ly khi c?n thi?t.
??i v?i kh? n?ng ph?c h?i Stream Processor (Resilience) - Apache Spark:
Checkpointing:
T?i ?ay có v? ?? ?n, nh?ng ?? ?? phòng m?i tr??ng h?p có th? th?t thoát d? li?u x?y ra thì ta s? c?n thêm 1 d?ch v? n?a ?? tính toán s? l??ng click theo Batch và ??i chi?u v?i d? li?u Real-time.
Song song v?i d? li?u vào Stream Processor, Kafka s? ??y raw data vào Datalake (có th? dùng S3), sau th?i gian ??nh k? s? tính toán l??t click th?ng qua scheduler Cronjob, th?i gian ch?y có th? là 1 ngày/ 1 l?n. Sau ?ó k?t qu? s? ???c ??i chi?u v?i k?t qu? t? stream processor ?? ??m b?o d? li?u 2 bên s? ??ng nh?t v?i nhau.
N?u có hành vi ng??i dùng nh?p vào qu?ng cáo nhi?u l?n, click Processor s? xem nh? là nhi?u hành ??ng cùng 1 th?i ?i?m và ti?p t?c ??m l??t click.
?? gi?i quy?t v?n ?? này, Ad placement Service s? t?o ra 1 impressive_Id duy nh?t cho m?i l?n qu?ng cáo ti?p c?n ???c v?i client. Impressive_id này s? s? ???c g?i t?i browser cùng v?i qu?ng cáo. Khi client click vào qu?ng cáo, browser s? g?i impressive_id này d?c theo th?ng tin c?a click. Cách này s? giúp dedup click hi?u qu?.
Workflow s? là:
Cu?i cùng, làm sao ??m b?o ???c ?? tr? khi Advertiser truy v?n là th?p nh?t.
D? li?u trong Database OLAP s? th??ng t?ng d?n theo th?i gian (theo tháng, n?m) d?n t?i th?i gian truy v?n s? có th? d?n t?ng lên. ?? t?i ?u vi?c này thì ta nên t?o 1 scheduler (có th? ch?y vào ban ?êm - th?i ?i?m ít x?y ra s? ki?n nh?t), ?? query và t?ng h?p data qua 1 b?ng m?i v?i d? li?u ???c chia nh? h?n theo ngày ho?c theo tu?n.
?ay là b?ng thi?t k? cu?i cùng:
?? Tham kh?o:
?Backend Developer | Software Engineer ?
2 周Bài vi?t giá tr? quá ?. C?m ?n anh r?t nhi?u! Em có m?t th?c m?c do ch?a có kinh nghi?m v? Spark mong ???c gi?i ?áp ?. ? m? hình sau khi c?i ti?n r?i thì Click processor service s? g?i t?ng event click vào kafka, Spark ???c k?t n?i v?i kafka s? ??c t?ng event m?t và tính toán lu?n ?? update lu?n vào db OLAP ch? kh?ng có update theo batch ? b?t c? b??c nào n?a ?úng kh?ng anh
? Software Developer | Java Spring boot | Database | Studies Performance Tuning at Wecommit Vi?t Nam. Let's connect!
1 个月Hay quá b?n ?i
Engineering Manager / Solution Architect / Java Software Engineer
1 个月C?m ?n bro, bài vi?t th?t giá tr?, giúp mình hi?u t?ng quan h?n v? data engineering. cho mình h?i 2 y, mình ?? có ad_id r?i sao còn sinh ra impressive_id? Ad_id c?ng ch?ng duplicate ???c mà. V?i ly do gì mà ??a data ?i vòng vòng vay, sao ko ??a th?ng t? Click Processor Service vào OLAP DB lu?n cho nhanh?
Cho t? h?i : vì sao b?n x? ly data stream kh?ng dùng flink mà dùng spark nh?? à, mà kafka kh?ng t? thay th? node m?i, node tèo là tèo lu?n và khi còn ?? min thì nó v?n ghi vào bình th??ng; kh?ng ?? thì…
??Senior Data Engineer, Database Optimizer at Gtel ICT??
1 个月?? quá hay em ?i