Ph?n 3: ?ng d?ng Kafka vào ví d? h? th?ng Ad Click Aggregation

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:

  • Input: hành ??ng click c?a client.
  • Output: Truy v?n ?? l?y cái th?ng tin báo cáo v? l??t click.

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.

  1. Advertiser s? cung c?p cho client 1 qu?ng cáo trên website.
  2. Client click vào qu?ng cáo ?ó, d? li?u c?a click ?ó song song c?ng ???c g?i t?i Click Processor Service.
  3. Browser c?a client s? t? ??ng chuy?n h??ng (redirect) t?i trang qu?ng cáo.
  4. Advertiser có th? truy v?n h? th?ng Click Processor Service ?? tính toán ???c các s? li?u.

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.

  • V?i kh?i l??ng 10,000 click/giay và th?c hi?n x? ly Batch m?i 5 phút, m?i s? ki?n có kích th??c kho?ng 100 bytes, v?y t?ng d? li?u mà Spark c?n x? ly trong m?i batch s? vào kho?ng 300MB. ?ay là kh?i l??ng x? ly khá nh? nhàng và hoàn toàn phù h?p v?i kh? n?ng c?a Spark.

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à:

  1. S? ki?n ???c ghi nh?n ? Click Processor Service s? ???c write vào Cassandra ?? l?u raw data.
  2. M?i N phút, Cronjob Scheduler s? kích ho?t Spark ??c d? li?u t? Cassandra và tính t?ng chúng.
  3. K?t qu? s? ???c l?u t?i OLAP Database dành cho vi?c truy v?n.
  4. Advertisers có th? truy v?n vào OLAP database ?? l?y s? li?u th?ng kê.

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à:

  • Click Processor s? ghi s? ki?n m?i vào Data Streaming(Kafka).
  • Data Streaming Processor sau khi nh?n ???c s? m?i t? Kafka s? ??c và tính toán chúng trong real-time.
  • K?t qu? tính toán xong sau m?i kho?ng th?i gian s? ???c update vào database OLAP cho vi?c phan tích.
  • Advertiser s? có th? truy v?n d? li?u t? database OLAP v?i th?i gian near real-time.

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:

  • Click Processor Service: Có th? s? d?ng các d?ch v? c?a Cloud ?? h? tr? m? r?ng theo hàng ngang (horizontally scale) b?ng cách t?ng s? l??ng instance ho?c t?ng dung l??ng CPU và memory khi c?n thi?t. Chúng ta c?ng c?n thêm m?t balancer (API Gateway) ? tr??c ?? phan b? t?i xuyên su?t các instances c?ng nh? b?o ??m ch? có Advertiser m?i có th? truy v?n ?? l?y d? li?u t?ng h?p ???c.
  • Data Streaming: Có th? s? d?ng Kafka Cluster trong data streaming ?? ??m b?o kh? n?ng m? r?ng, ch?u l?i và phan ph?i t?i 1 cách hi?u qu?. Vi?c s?p x?p các event chung key vào cùng m?t partition và s? d?ng Consumer Groups s? giúp h? th?ng ??t ???c kh? n?ng x? ly song song. Trong tr??ng h?p này, ta có th? chia theo Ad_id thành các partition ?? có th? t?ng hi?u su?t tính toán t?i processor.
  • Stream Processor: Spark có th? m? r?ng theo hàng ngang (scale horizontally) b?ng cách b? sung thêm nhi?u tasks ho?c jobs. Chúng ta có th? chia nhi?u jobs khác nhau ?? ??c các partition và t?ng h?p theo Ad_id.
  • OLAP Database: Có th? m? r?ng b?ng cách b? sung thêm các nodes ?? cùng l?u tr? và t?ng t?c ?? truy v?n t? Advertiser.

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à:

  • Sau khi d? li?u ???c g?i ??n stream processor, b?n g?c c?a d? li?u v?n ???c gi? trong Kafka.
  • Trong tr??ng h?p stream processor g?p l?i trong vòng 7 ngày, h? th?ng v?n có th? truy xu?t l?i d? li?u t? Kafka ?? kh?i ph?c và x? ly l?i mà kh?ng b? m?t d? li?u.

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:

  • Streaming processor nh? là Spark có kh? n?ng l?u tr? tr?ng thái c?a h? (checkpoint) vào trong ? ??a c?ng ho?c S3 storage, ??m b?o d? li?u s? ???c an toàn.
  • N?u processor b? l?i, nó có th? restart t? checkpoint cu?i cùng, tránh tr??ng h?p ph?i ch?y l?i toàn b?.
  • Nh?ng nó ch? phù h?p v?i kho?ng th?i gian t?ng h?p l?n (large aggregation windows - daily or weeks...). N?u kh?ng có checkpoint, khi h? th?ng fail thì toàn b? các d?ch v? khác có th? b? ?nh h??ng.
  • ??i v?i th?i gian t?ng h?p nh?, thì checkpointing s? kh?ng có y ngh?a nhi?u l?m b?i vì l??ng data b? miss s? ít, và h? th?ng s? có th? ??c l?i nh?ng s? ki?n b? m?t t?i Stream và ti?n hành tính toán l?i chúng nhanh chóng.

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à:

  • Ad Placement Service s? t?o ra 1 m? impressive_id duy nh?t và g?i t?i client cùng v?i qu?ng cáo.
  • Client click vào qu?ng cáo thì th?ng tin qu?ng cáo s? ?i cùng v?i impressive_id t?i click Processor.
  • Processore s? xác ??nh là impressive_id này ?? tòn t?i hay ch?a. N?u ch?a thì s? ???c l?u vào Redis cache ?? so sánh và ti?p t?c hành trình t?i Data Streaming. N?u ?? t?n t?i r?i thì s? b? t? ch?i.

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:

[1]. Evan King - Design an Ad Click Aggregator
















Minh Nguyen Dang

?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

回复
??t Tr??ng Thành

? Software Developer | Java Spring boot | Database | Studies Performance Tuning at Wecommit Vi?t Nam. Let's connect!

1 个月

Hay quá b?n ?i

Chien Cao

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ì…

Th?ng L?u ?

??Senior Data Engineer, Database Optimizer at Gtel ICT??

1 个月

?? quá hay em ?i

要查看或添加评论,请登录

Nguy?n Tu?n D??ng的更多文章