SlideShare a Scribd company logo
1 of 52
Download to read offline
Kiến trúc hệ thống quảng
cáo lớn trên nền scala.
@huydx (Φφ)
CyberAgent Inc
Agenda
• Giới thiệu
• Quảng cáo trên Internet: Programmatic Ad
• Scale về kiến trúc / middleware trong một hệ
thống quảng cáo lớn
• Scale về code thông qua functional programming
và scala
• Demo
Agenda
• Giới thiệu
• Quảng cáo trên Internet: Programmatic Ad
• Scale về kiến trúc / middleware trong một hệ
thống quảng cáo lớn
• Scale về code thông qua functional programming
và scala
• Demo
Giới thiệu bản thân
• Name: Huy
• Position: Software Engineer
• Location: Tokyo/Japan
• Favourite Language: Ruby/Scala/Java
• Other
• Admin/cofounder of Ruby Vietnam
• cofounder of kipalog.com / ktmt blog
CyberAgent
• Thành lập 1998 (17 năm)
• Các dịch vụ chính: mạng xã hội (ameba (40tr
users)), quảng cáo trên internet (adagency,
adtech), game, investment
• Doanh thu 1 năm ~ 2.4 tỉ USD
• ~5000 nhân viên
Adtech Studio
• Chuyên nghiên cứu, phát triển các hệ thống
quảng cáo (DSP, SSP, AdNetwork, Affiliate, DMP…)
• Một vài con số (trên toàn bộ studio):
• Network Uplink: 160GBS
• Overall QPS: ~2-3millions/per sec
• Overall data size: ~ 30PB
• Overall server instance: ~1-2000 servers (AWS, DC)
• Ngôn ngữ: Scala, Java, PHP, Ruby, Go
Agenda
• Giới thiệu
• Quảng cáo trên Internet: Programmatic Ad
• Scale về kiến trúc / middleware trong một hệ
thống quảng cáo lớn
• Scale về code thông qua functional programming
và scala
• Demo
• Bài nói sẽ nói chính về programmatic
advertising bao gồm: banner ad và in-feed ad,
chủ yếu về khía cạnh kĩ thuật
Chú ý
Quảng cáo==
đem thông tin của
người cần bán
đến người cần mua
Quảng cáo != evil
Nhưng How???
• Tại sao hiện tại chúng ta phải hứng chịu nhiều
quảng cáo tồi??
• Do hiển thị quảng cáo qua thoả thuận trực tiếp
• Do không có đủ thông tin người dùng
• Do máy móc, thuật toán chưa đủ "thông minh"
• Do người cần mua và người cần bán không
đến được với nhau
•......
openRTB ra đời
•RTB == real time bidding
•Việc hiển thị quảng cáo diễn ra tại
realtime thông qua việc "bán" view của
user tại thời điểm user visit website
•Advantage:
•User "ngon" sẽ được mua với giá đắt
•User "tồi" sẽ được mua với giá rẻ
• --> có lợi cho cả bên bán lẫn bên mua
người bán
user
1, visit
2. phát lệnh bán
3. đấu giángười bán
người mua
người mua
1000vnd
2000vnd
3000vnd
người bán
4. hiển thị quảng
cáo của bên thắng
openRTB == ngôn ngữ để bên
mua nói chuyện với bên bán
Đặc điểm:
• Fix format thay vì fix protocol (có thể sử
dụng cả json, xml hay protobuf)
• Format khá uyển chuyển để chứa đủ
thông tin cho việc đấu giá trở nên hiệu
quả
Những khó khăn
• Scale hệ thống (~millions qps)
• Scale dữ liệu lớn ( TB~PB)
• bidding Logic RTB
• Tracking user giữa mobile/web
• Thuật toán để đưa quảng cáo đến đúng với
người dùng
Agenda
• Giới thiệu
• Quảng cáo trên Internet: Programmatic Ad
• Scale về kiến trúc / middleware trong một hệ
thống quảng cáo lớn
• Scale về code thông qua functional programming
và scala
• Demo
Hệ thống phụ trách
• DMP system
• QPS: ~10000req/s (140 instances)
• Hadoop: ~100nodes
• Cassandra: 15nodes (7TB)
• Aerospike: 14nodes (~2TB RAM!)
• MySQL: ~100GB
• Datasize: 4.5billions cookie data
Stack
Architecture in short
front
server
log
aggregator
(fluentd)
redshift
hdfs
BI tool
aerospike
(user data)
(fast layer)
cassandra
(user data)
(slow layer) hadoop
(batch
layer)
spark
ML job
Architecture in short
front
server
log
aggregator
(fluentd)
redshift
hdfs
BI tool
aerospike
(user data)
(fast layer)
cassandra
(user data)
(slow layer) hadoop
(batch
layer)
spark
ML job
Why Aerospike
Aerospike
• Rất nhanh với SSD
• Ghi trực tiếp vào SSD không qua OS
• 99.99% request sẽ dưới 1ms
• Vertical scale với P2P cluster
• Cross-datacenter replication
• Rất ổn định ( chưa thấy chết bao giờ )
• Tuy nhiên giá server đắt do:
• Phải trang bị RAM lớn cho index
• Phải trang bị SSD đúng chuẩn
Aerospike rất được tin dùng bởi các công
ty quảng cáo lớn như: Appnexus, bluekai,
adform… :))))
Tại sao cần cả
cassandra và aerospike
• Aerospike server quá đắt (1server 200GB
Ram ~ 10k$)
• Khi cho data từ batchlayer vào thì việc
rebuild index của aerospike ảnh hưởng
performance
• Cassandra có performance khi batch
write rất tốt, tuy nhiên tốc độ read lại
không đảm bảo
Architecture in short
front
server
log
aggregator
(fluentd)
redshift
hdfs
BI tool
aerospike
(user data)
(fast layer)
cassandra
(user data)
(slow layer) hadoop
(batch
layer)
spark
ML job
Một chút về spark/hadoop
Hadoop & Spark
• Hadoop là solution không thể thiếu để xử
lý dữ liệu lớn
• Tuy nhiên Map/Reduce java code quá
nhiều boilerplate
• Unit test khó viết (MRUnit đã không còn
update từ 1 năm trước)
• Đang viết lại toàn bộ xử lý qua Spark
Hadoop & Spark
• Why Spark
• Code được viết bằng scala (yay!)
• Compability với hadoop (hadoopApiFile)
• Ít boiler plate, code sáng sủa hơn rất
nhiều
• Dễ viết test hơn nhờ khái niệm RDD
• Đi kèm với bộ mlib để xử lý machine
learning
Hadoop & Spark
• Một vài trick thú vị
• Lzo encode để giảm lượng dữ liệu + lzo
có thể đọc được trực tiếp từ mapper
• Serialize data dưới dạng protobuffer có
thể speed up tốc độ xử lý
• Spark có thể đọc trực tiếp dữ liệu từ S3 -
> giảm chi phí HDFS
Architecture in short
front
server
log
aggregator
(fluentd)
redshift
hdfs
BI tool
aerospike
(user data)
(fast layer)
cassandra
(user data)
(slow layer) hadoop
(batch
layer)
spark
ML job
Tạo BI tool với redshift
• Redshift là columnar database của amazon
• Hỗ trợ truy vấn dữ liệu theo PostgreSQL
syntax
• Adhoc query trở nên dễ dàng hơn rất nhiều
(window function support)
• Redshift scale rất tốt chỉ với thêm instance
• Điểm yếu: giá cao, không insert được data
realtime (chỉ support batch insert/ bulk load)
Architecture in short
front
server
log
aggregator
(fluentd)
redshift
hdfs
BI tool
aerospike
(user data)
(fast layer)
cassandra
(user data)
(slow layer) hadoop
(batch
layer)
spark
ML job
Front server với
• Scala lightway webframework ( trong thời
gian gần sẽ thành akka-http)
• Actor model (thông qua akka)
• Tận dụng core rất tốt (% sự dụng trên mỗi
core thường là xấp xỉ nhau)
• Fault-tolerance với rất nhiều pattern thú vị
(tham khảo let-it-crash: reaper pattern,
backpressure streaming….)
Every one
Architecture in short
front
server
log
aggregator
(fluentd)
redshift
hdfs
BI tool
aerospike
(user data)
(fast layer)
cassandra
(user data)
(slow layer) hadoop
(batch
layer)
spark
ML job
Fluentd
• Là một giải pháp aggregate log từ "source"
đến "destination" <made in japan>
• Một số đặc điểm thú vị
• Dựa trên cơ chế plugin
• Code viết trên ruby -> dễ debug, dễ đọc, dễ
viết
• Fault tolerance tốt (cơ chế buffer, retry... khá
thông minh)
fluentd
agent
fluentd
agent
fluentd
agent
fluentd
agent
1xx
instances
fluentd
server
fluentd
server
fluentd
server
3
instances
redshift
buffer &
bulk upload
Agenda
• Giới thiệu
• Quảng cáo trên Internet: Programmatic Ad
• Scale về kiến trúc / middleware trong một hệ
thống quảng cáo lớn
• Scale về code thông qua functional programming
và scala
• Demo
Tại sao lại cần
functional
programming
Thực ra là không cần
Monad
Monoid
Functor
Ring
Endofunctor
Semigroup
Kleisli
FreeMonad
https://michaelochurch.wordpress.com/2012/04/24/functional-
programming-is-a-ghetto/
• Bạn không cần biết tất cả những khái niệm
trên để hiểu về functional programming (FP)
• Nắm vững một số “ cách nghĩ” (concept) của
FP giúp code của bạn (có thể) trong sáng hơn,
(có thể) ít bug hơn, và (có thể) scale tốt hơn rất
nhiều
Important!
• Tách biệt “ hiệu ứng phụ” (side effect) với những
đoạn code thuần ("pure code")
• pure code là những đoạn code với cùng 1 đầu
ra sẽ “ luôn luôn” output ra 1 kết quả
(Referential transparency)
• Một số ví dụ về side effect
• Mutable variable (re-assignment)
• Thao tác IO (database)
• Logger, Cache…
Một số “ cách nghĩ” của FP
• Thay vì nghĩ về từng bước giống như
imperative programming thì hãy nghĩ về
luồng xử lý (how)
• First class function (truyền xử lý, hay là
truyền how) (ví dụ như sử dụng hàm map
trong ruby hay scala thay vì for loop)
• Function combination: kết hợp nhiều xử lý
con thành 1 xử lý to (for comprehension)
Một số “ cách nghĩ” của FP
• Luôn cố gắng tổng quát hoá mọi bài toán bằng hết mức có
thể (generic). Ví dụ:
• Monoid type class mô hình tất cả các đối tượng có khả
năng thao tác với nhau thông qua binary operator (ví dụ
như phép +, phép *)
• Option type class mô hình tất cả các đối tượng có khả
năng chứa giá trị null -> tránh trường hợp NPE trong java
• Chuyển vất vả về library designer, người dùng
(application programmer sẽ rất “ nhàn”)
Recommend cuốn “ From Mathematics to Generic
Programming” của Alexander A. Stepanov
Một số “ cách nghĩ” của FP
Một số tính năng của FP hay
được sử dụng
• Basic
• Kết hợp nhiều function
• Sử dụng linh hoạt Option/Either/Future
• FP Iterator style như foldLeft hay là @tailrec
• Pattern matching
• Advance
• Monadic composition
• Type class
Hiệu quả đạt được
• Tránh mutable state sẽ giúp code có thể lý
luận được chỉ nhờ đọc code, tránh được các
thể loại bug khó phát hiện (heisenbug)
• Generic hoá giúp code dễ mở rộng
• Sử dụng function pipelining (kết hợp nhiều xử
lý con thành 1 xử lý nhỏ) một cách thành thạo
sẽ giúp code dễ hiểu hơn nhiều
Điểm bất lợi của FP
• Functional programming không dễ
• Khó scale về mặt con người
• Khó thực hiện ở giai đoạn “ start up” khi cần
tốc độ nhiều hơn là chất lượng code
• Tìm ra một giới hạn “ vừa đủ” để áp dụng là
rất khó vì thế giới FP rất rộng lớn
Giải quyết
• Thực hiện các buổi học nhóm thường xuyên
trong nội bộ công ty
• Thắt chặt tuyển dụng (những người thành
thạo FP thường sẽ <ít có> khả năng là một lập
trình viên "tồi" !!!)
• Học haskell, closure trước (bắt tay vào học FP
trên scala sẽ không tự nhiên bằng haskell hay
closure)
Một số tài liệu tham khảo
•Paper
•http://monkey.org/~marius/funsrv.pdf (your server as a function)
•Book
•Functional programming in scala
•Functional Programming Patterns in Scala and Clojure: Write
Lean Programs for the JVM
•Learn your haskell for great good
•Slide
•http://www.slideshare.net/pnicolas/advanced-scala-concepts
Demo session
(openrtb +
a little bit of FP)

More Related Content

Similar to Itlc2015

Code Refactoring: Thay đổi nhỏ - Lợi ích lớn
Code Refactoring: Thay đổi nhỏ - Lợi ích lớnCode Refactoring: Thay đổi nhỏ - Lợi ích lớn
Code Refactoring: Thay đổi nhỏ - Lợi ích lớnNhật Nguyễn Khắc
 
Hướng nghiệp Lập trình Web
Hướng nghiệp Lập trình WebHướng nghiệp Lập trình Web
Hướng nghiệp Lập trình WebVKhang Yang
 
Introduction to python 20110917
Introduction to python   20110917Introduction to python   20110917
Introduction to python 20110917AiTi Education
 
Go micro framework to build microservices
Go micro framework to build microservicesGo micro framework to build microservices
Go micro framework to build microservicesTechMaster Vietnam
 
Slide 01-Web Application Overview (1).pdf
Slide 01-Web Application Overview (1).pdfSlide 01-Web Application Overview (1).pdf
Slide 01-Web Application Overview (1).pdfHuyVnh4
 
Lập trình Python GUI vs PySide
Lập trình Python GUI vs PySideLập trình Python GUI vs PySide
Lập trình Python GUI vs PySideChien Dang
 
Software Stack là gì.pdf
Software Stack là gì.pdfSoftware Stack là gì.pdf
Software Stack là gì.pdfGrowup Work
 
Định Hướng Nghề Lập Trình cho Sinh Viên CNTT năm 1
Định Hướng Nghề Lập Trình cho Sinh Viên CNTT năm 1Định Hướng Nghề Lập Trình cho Sinh Viên CNTT năm 1
Định Hướng Nghề Lập Trình cho Sinh Viên CNTT năm 1giapmaster
 
Bạn cần chuẩn bị gì khi đi phỏng vấn vị trí DevOps?
Bạn cần chuẩn bị gì khi đi phỏng vấn vị trí DevOps?Bạn cần chuẩn bị gì khi đi phỏng vấn vị trí DevOps?
Bạn cần chuẩn bị gì khi đi phỏng vấn vị trí DevOps?ITguru.vn
 
Seminar apply OOP in maintain software
Seminar apply OOP in maintain softwareSeminar apply OOP in maintain software
Seminar apply OOP in maintain softwareVKhang Yang
 
How to write good code
How to write good code How to write good code
How to write good code Minh Hoang
 
Câu hỏi phỏng vấn.pdf
Câu hỏi phỏng vấn.pdfCâu hỏi phỏng vấn.pdf
Câu hỏi phỏng vấn.pdfGrowup Work
 
Vận dụng kiến thức lập trình web vào môi trường thực tế
Vận dụng kiến thức lập trình web vào môi trường thực tếVận dụng kiến thức lập trình web vào môi trường thực tế
Vận dụng kiến thức lập trình web vào môi trường thực tếVKhang Yang
 
ITLC - Hanoi - NodeJS - ArrowJS - 27-11 - 2015
ITLC - Hanoi - NodeJS - ArrowJS - 27-11 - 2015ITLC - Hanoi - NodeJS - ArrowJS - 27-11 - 2015
ITLC - Hanoi - NodeJS - ArrowJS - 27-11 - 2015IT Expert Club
 
đồ áN thiết kế web tuyển dụng sử dụng asp.net
đồ áN thiết kế web tuyển dụng sử dụng asp.netđồ áN thiết kế web tuyển dụng sử dụng asp.net
đồ áN thiết kế web tuyển dụng sử dụng asp.netnataliej4
 

Similar to Itlc2015 (20)

Code Refactoring: Thay đổi nhỏ - Lợi ích lớn
Code Refactoring: Thay đổi nhỏ - Lợi ích lớnCode Refactoring: Thay đổi nhỏ - Lợi ích lớn
Code Refactoring: Thay đổi nhỏ - Lợi ích lớn
 
Hướng nghiệp Lập trình Web
Hướng nghiệp Lập trình WebHướng nghiệp Lập trình Web
Hướng nghiệp Lập trình Web
 
Introduction to python 20110917
Introduction to python   20110917Introduction to python   20110917
Introduction to python 20110917
 
Go micro framework to build microservices
Go micro framework to build microservicesGo micro framework to build microservices
Go micro framework to build microservices
 
07 web course 1 php co ban
07 web course   1 php co ban07 web course   1 php co ban
07 web course 1 php co ban
 
Slide 01-Web Application Overview (1).pdf
Slide 01-Web Application Overview (1).pdfSlide 01-Web Application Overview (1).pdf
Slide 01-Web Application Overview (1).pdf
 
Lập trình Python GUI vs PySide
Lập trình Python GUI vs PySideLập trình Python GUI vs PySide
Lập trình Python GUI vs PySide
 
03 udpt php
03 udpt   php03 udpt   php
03 udpt php
 
Software Stack là gì.pdf
Software Stack là gì.pdfSoftware Stack là gì.pdf
Software Stack là gì.pdf
 
Pbc day-01-introduction
Pbc day-01-introductionPbc day-01-introduction
Pbc day-01-introduction
 
Định Hướng Nghề Lập Trình cho Sinh Viên CNTT năm 1
Định Hướng Nghề Lập Trình cho Sinh Viên CNTT năm 1Định Hướng Nghề Lập Trình cho Sinh Viên CNTT năm 1
Định Hướng Nghề Lập Trình cho Sinh Viên CNTT năm 1
 
Bạn cần chuẩn bị gì khi đi phỏng vấn vị trí DevOps?
Bạn cần chuẩn bị gì khi đi phỏng vấn vị trí DevOps?Bạn cần chuẩn bị gì khi đi phỏng vấn vị trí DevOps?
Bạn cần chuẩn bị gì khi đi phỏng vấn vị trí DevOps?
 
Seminar apply OOP in maintain software
Seminar apply OOP in maintain softwareSeminar apply OOP in maintain software
Seminar apply OOP in maintain software
 
How to write good code
How to write good code How to write good code
How to write good code
 
Code Camp #1
Code Camp #1Code Camp #1
Code Camp #1
 
Arrowjs.io
Arrowjs.ioArrowjs.io
Arrowjs.io
 
Câu hỏi phỏng vấn.pdf
Câu hỏi phỏng vấn.pdfCâu hỏi phỏng vấn.pdf
Câu hỏi phỏng vấn.pdf
 
Vận dụng kiến thức lập trình web vào môi trường thực tế
Vận dụng kiến thức lập trình web vào môi trường thực tếVận dụng kiến thức lập trình web vào môi trường thực tế
Vận dụng kiến thức lập trình web vào môi trường thực tế
 
ITLC - Hanoi - NodeJS - ArrowJS - 27-11 - 2015
ITLC - Hanoi - NodeJS - ArrowJS - 27-11 - 2015ITLC - Hanoi - NodeJS - ArrowJS - 27-11 - 2015
ITLC - Hanoi - NodeJS - ArrowJS - 27-11 - 2015
 
đồ áN thiết kế web tuyển dụng sử dụng asp.net
đồ áN thiết kế web tuyển dụng sử dụng asp.netđồ áN thiết kế web tuyển dụng sử dụng asp.net
đồ áN thiết kế web tuyển dụng sử dụng asp.net
 

More from Huy Do

Distributed Tracing, from internal SAAS insights
Distributed Tracing, from internal SAAS insightsDistributed Tracing, from internal SAAS insights
Distributed Tracing, from internal SAAS insightsHuy Do
 
Write on memory TSDB database (gocon tokyo autumn 2018)
Write on memory TSDB database (gocon tokyo autumn 2018)Write on memory TSDB database (gocon tokyo autumn 2018)
Write on memory TSDB database (gocon tokyo autumn 2018)Huy Do
 
Some note about GC algorithm
Some note about GC algorithmSome note about GC algorithm
Some note about GC algorithmHuy Do
 
Engineering Efficiency in LINE
Engineering Efficiency in LINEEngineering Efficiency in LINE
Engineering Efficiency in LINEHuy Do
 
GOCON Autumn (Story of our own Monitoring Agent in golang)
GOCON Autumn (Story of our own Monitoring Agent in golang)GOCON Autumn (Story of our own Monitoring Agent in golang)
GOCON Autumn (Story of our own Monitoring Agent in golang)Huy Do
 
Story Writing Byte Serializer in Golang
Story Writing Byte Serializer in GolangStory Writing Byte Serializer in Golang
Story Writing Byte Serializer in GolangHuy Do
 
CA15卒勉強会 メタプログラミングについて
CA15卒勉強会 メタプログラミングについてCA15卒勉強会 メタプログラミングについて
CA15卒勉強会 メタプログラミングについてHuy Do
 
Making CLI app in ruby
Making CLI app in rubyMaking CLI app in ruby
Making CLI app in rubyHuy Do
 
CacheとRailsの簡単まとめ
CacheとRailsの簡単まとめCacheとRailsの簡単まとめ
CacheとRailsの簡単まとめHuy Do
 
[Htmlday]present
[Htmlday]present[Htmlday]present
[Htmlday]presentHuy Do
 

More from Huy Do (10)

Distributed Tracing, from internal SAAS insights
Distributed Tracing, from internal SAAS insightsDistributed Tracing, from internal SAAS insights
Distributed Tracing, from internal SAAS insights
 
Write on memory TSDB database (gocon tokyo autumn 2018)
Write on memory TSDB database (gocon tokyo autumn 2018)Write on memory TSDB database (gocon tokyo autumn 2018)
Write on memory TSDB database (gocon tokyo autumn 2018)
 
Some note about GC algorithm
Some note about GC algorithmSome note about GC algorithm
Some note about GC algorithm
 
Engineering Efficiency in LINE
Engineering Efficiency in LINEEngineering Efficiency in LINE
Engineering Efficiency in LINE
 
GOCON Autumn (Story of our own Monitoring Agent in golang)
GOCON Autumn (Story of our own Monitoring Agent in golang)GOCON Autumn (Story of our own Monitoring Agent in golang)
GOCON Autumn (Story of our own Monitoring Agent in golang)
 
Story Writing Byte Serializer in Golang
Story Writing Byte Serializer in GolangStory Writing Byte Serializer in Golang
Story Writing Byte Serializer in Golang
 
CA15卒勉強会 メタプログラミングについて
CA15卒勉強会 メタプログラミングについてCA15卒勉強会 メタプログラミングについて
CA15卒勉強会 メタプログラミングについて
 
Making CLI app in ruby
Making CLI app in rubyMaking CLI app in ruby
Making CLI app in ruby
 
CacheとRailsの簡単まとめ
CacheとRailsの簡単まとめCacheとRailsの簡単まとめ
CacheとRailsの簡単まとめ
 
[Htmlday]present
[Htmlday]present[Htmlday]present
[Htmlday]present
 

Itlc2015

  • 1. Kiến trúc hệ thống quảng cáo lớn trên nền scala. @huydx (Φφ) CyberAgent Inc
  • 2. Agenda • Giới thiệu • Quảng cáo trên Internet: Programmatic Ad • Scale về kiến trúc / middleware trong một hệ thống quảng cáo lớn • Scale về code thông qua functional programming và scala • Demo
  • 3. Agenda • Giới thiệu • Quảng cáo trên Internet: Programmatic Ad • Scale về kiến trúc / middleware trong một hệ thống quảng cáo lớn • Scale về code thông qua functional programming và scala • Demo
  • 4. Giới thiệu bản thân • Name: Huy • Position: Software Engineer • Location: Tokyo/Japan • Favourite Language: Ruby/Scala/Java • Other • Admin/cofounder of Ruby Vietnam • cofounder of kipalog.com / ktmt blog
  • 5. CyberAgent • Thành lập 1998 (17 năm) • Các dịch vụ chính: mạng xã hội (ameba (40tr users)), quảng cáo trên internet (adagency, adtech), game, investment • Doanh thu 1 năm ~ 2.4 tỉ USD • ~5000 nhân viên
  • 6. Adtech Studio • Chuyên nghiên cứu, phát triển các hệ thống quảng cáo (DSP, SSP, AdNetwork, Affiliate, DMP…) • Một vài con số (trên toàn bộ studio): • Network Uplink: 160GBS • Overall QPS: ~2-3millions/per sec • Overall data size: ~ 30PB • Overall server instance: ~1-2000 servers (AWS, DC) • Ngôn ngữ: Scala, Java, PHP, Ruby, Go
  • 7. Agenda • Giới thiệu • Quảng cáo trên Internet: Programmatic Ad • Scale về kiến trúc / middleware trong một hệ thống quảng cáo lớn • Scale về code thông qua functional programming và scala • Demo
  • 8. • Bài nói sẽ nói chính về programmatic advertising bao gồm: banner ad và in-feed ad, chủ yếu về khía cạnh kĩ thuật Chú ý
  • 9. Quảng cáo== đem thông tin của người cần bán đến người cần mua Quảng cáo != evil
  • 11. • Tại sao hiện tại chúng ta phải hứng chịu nhiều quảng cáo tồi?? • Do hiển thị quảng cáo qua thoả thuận trực tiếp • Do không có đủ thông tin người dùng • Do máy móc, thuật toán chưa đủ "thông minh" • Do người cần mua và người cần bán không đến được với nhau •......
  • 13. •RTB == real time bidding •Việc hiển thị quảng cáo diễn ra tại realtime thông qua việc "bán" view của user tại thời điểm user visit website •Advantage: •User "ngon" sẽ được mua với giá đắt •User "tồi" sẽ được mua với giá rẻ • --> có lợi cho cả bên bán lẫn bên mua
  • 14. người bán user 1, visit 2. phát lệnh bán 3. đấu giángười bán người mua người mua 1000vnd 2000vnd 3000vnd người bán 4. hiển thị quảng cáo của bên thắng
  • 15. openRTB == ngôn ngữ để bên mua nói chuyện với bên bán Đặc điểm: • Fix format thay vì fix protocol (có thể sử dụng cả json, xml hay protobuf) • Format khá uyển chuyển để chứa đủ thông tin cho việc đấu giá trở nên hiệu quả
  • 16. Những khó khăn • Scale hệ thống (~millions qps) • Scale dữ liệu lớn ( TB~PB) • bidding Logic RTB • Tracking user giữa mobile/web • Thuật toán để đưa quảng cáo đến đúng với người dùng
  • 17. Agenda • Giới thiệu • Quảng cáo trên Internet: Programmatic Ad • Scale về kiến trúc / middleware trong một hệ thống quảng cáo lớn • Scale về code thông qua functional programming và scala • Demo
  • 18. Hệ thống phụ trách • DMP system • QPS: ~10000req/s (140 instances) • Hadoop: ~100nodes • Cassandra: 15nodes (7TB) • Aerospike: 14nodes (~2TB RAM!) • MySQL: ~100GB • Datasize: 4.5billions cookie data
  • 19. Stack
  • 20. Architecture in short front server log aggregator (fluentd) redshift hdfs BI tool aerospike (user data) (fast layer) cassandra (user data) (slow layer) hadoop (batch layer) spark ML job
  • 21. Architecture in short front server log aggregator (fluentd) redshift hdfs BI tool aerospike (user data) (fast layer) cassandra (user data) (slow layer) hadoop (batch layer) spark ML job
  • 23. Aerospike • Rất nhanh với SSD • Ghi trực tiếp vào SSD không qua OS • 99.99% request sẽ dưới 1ms • Vertical scale với P2P cluster • Cross-datacenter replication • Rất ổn định ( chưa thấy chết bao giờ ) • Tuy nhiên giá server đắt do: • Phải trang bị RAM lớn cho index • Phải trang bị SSD đúng chuẩn
  • 24. Aerospike rất được tin dùng bởi các công ty quảng cáo lớn như: Appnexus, bluekai, adform… :))))
  • 25. Tại sao cần cả cassandra và aerospike • Aerospike server quá đắt (1server 200GB Ram ~ 10k$) • Khi cho data từ batchlayer vào thì việc rebuild index của aerospike ảnh hưởng performance • Cassandra có performance khi batch write rất tốt, tuy nhiên tốc độ read lại không đảm bảo
  • 26. Architecture in short front server log aggregator (fluentd) redshift hdfs BI tool aerospike (user data) (fast layer) cassandra (user data) (slow layer) hadoop (batch layer) spark ML job
  • 27. Một chút về spark/hadoop
  • 28. Hadoop & Spark • Hadoop là solution không thể thiếu để xử lý dữ liệu lớn • Tuy nhiên Map/Reduce java code quá nhiều boilerplate • Unit test khó viết (MRUnit đã không còn update từ 1 năm trước) • Đang viết lại toàn bộ xử lý qua Spark
  • 29. Hadoop & Spark • Why Spark • Code được viết bằng scala (yay!) • Compability với hadoop (hadoopApiFile) • Ít boiler plate, code sáng sủa hơn rất nhiều • Dễ viết test hơn nhờ khái niệm RDD • Đi kèm với bộ mlib để xử lý machine learning
  • 30. Hadoop & Spark • Một vài trick thú vị • Lzo encode để giảm lượng dữ liệu + lzo có thể đọc được trực tiếp từ mapper • Serialize data dưới dạng protobuffer có thể speed up tốc độ xử lý • Spark có thể đọc trực tiếp dữ liệu từ S3 - > giảm chi phí HDFS
  • 31. Architecture in short front server log aggregator (fluentd) redshift hdfs BI tool aerospike (user data) (fast layer) cassandra (user data) (slow layer) hadoop (batch layer) spark ML job
  • 32. Tạo BI tool với redshift • Redshift là columnar database của amazon • Hỗ trợ truy vấn dữ liệu theo PostgreSQL syntax • Adhoc query trở nên dễ dàng hơn rất nhiều (window function support) • Redshift scale rất tốt chỉ với thêm instance • Điểm yếu: giá cao, không insert được data realtime (chỉ support batch insert/ bulk load)
  • 33. Architecture in short front server log aggregator (fluentd) redshift hdfs BI tool aerospike (user data) (fast layer) cassandra (user data) (slow layer) hadoop (batch layer) spark ML job
  • 34. Front server với • Scala lightway webframework ( trong thời gian gần sẽ thành akka-http) • Actor model (thông qua akka) • Tận dụng core rất tốt (% sự dụng trên mỗi core thường là xấp xỉ nhau) • Fault-tolerance với rất nhiều pattern thú vị (tham khảo let-it-crash: reaper pattern, backpressure streaming….)
  • 36. Architecture in short front server log aggregator (fluentd) redshift hdfs BI tool aerospike (user data) (fast layer) cassandra (user data) (slow layer) hadoop (batch layer) spark ML job
  • 37. Fluentd • Là một giải pháp aggregate log từ "source" đến "destination" <made in japan> • Một số đặc điểm thú vị • Dựa trên cơ chế plugin • Code viết trên ruby -> dễ debug, dễ đọc, dễ viết • Fault tolerance tốt (cơ chế buffer, retry... khá thông minh)
  • 39. Agenda • Giới thiệu • Quảng cáo trên Internet: Programmatic Ad • Scale về kiến trúc / middleware trong một hệ thống quảng cáo lớn • Scale về code thông qua functional programming và scala • Demo
  • 40. Tại sao lại cần functional programming
  • 41. Thực ra là không cần
  • 43. • Bạn không cần biết tất cả những khái niệm trên để hiểu về functional programming (FP) • Nắm vững một số “ cách nghĩ” (concept) của FP giúp code của bạn (có thể) trong sáng hơn, (có thể) ít bug hơn, và (có thể) scale tốt hơn rất nhiều Important!
  • 44. • Tách biệt “ hiệu ứng phụ” (side effect) với những đoạn code thuần ("pure code") • pure code là những đoạn code với cùng 1 đầu ra sẽ “ luôn luôn” output ra 1 kết quả (Referential transparency) • Một số ví dụ về side effect • Mutable variable (re-assignment) • Thao tác IO (database) • Logger, Cache… Một số “ cách nghĩ” của FP
  • 45. • Thay vì nghĩ về từng bước giống như imperative programming thì hãy nghĩ về luồng xử lý (how) • First class function (truyền xử lý, hay là truyền how) (ví dụ như sử dụng hàm map trong ruby hay scala thay vì for loop) • Function combination: kết hợp nhiều xử lý con thành 1 xử lý to (for comprehension) Một số “ cách nghĩ” của FP
  • 46. • Luôn cố gắng tổng quát hoá mọi bài toán bằng hết mức có thể (generic). Ví dụ: • Monoid type class mô hình tất cả các đối tượng có khả năng thao tác với nhau thông qua binary operator (ví dụ như phép +, phép *) • Option type class mô hình tất cả các đối tượng có khả năng chứa giá trị null -> tránh trường hợp NPE trong java • Chuyển vất vả về library designer, người dùng (application programmer sẽ rất “ nhàn”) Recommend cuốn “ From Mathematics to Generic Programming” của Alexander A. Stepanov Một số “ cách nghĩ” của FP
  • 47. Một số tính năng của FP hay được sử dụng • Basic • Kết hợp nhiều function • Sử dụng linh hoạt Option/Either/Future • FP Iterator style như foldLeft hay là @tailrec • Pattern matching • Advance • Monadic composition • Type class
  • 48. Hiệu quả đạt được • Tránh mutable state sẽ giúp code có thể lý luận được chỉ nhờ đọc code, tránh được các thể loại bug khó phát hiện (heisenbug) • Generic hoá giúp code dễ mở rộng • Sử dụng function pipelining (kết hợp nhiều xử lý con thành 1 xử lý nhỏ) một cách thành thạo sẽ giúp code dễ hiểu hơn nhiều
  • 49. Điểm bất lợi của FP • Functional programming không dễ • Khó scale về mặt con người • Khó thực hiện ở giai đoạn “ start up” khi cần tốc độ nhiều hơn là chất lượng code • Tìm ra một giới hạn “ vừa đủ” để áp dụng là rất khó vì thế giới FP rất rộng lớn
  • 50. Giải quyết • Thực hiện các buổi học nhóm thường xuyên trong nội bộ công ty • Thắt chặt tuyển dụng (những người thành thạo FP thường sẽ <ít có> khả năng là một lập trình viên "tồi" !!!) • Học haskell, closure trước (bắt tay vào học FP trên scala sẽ không tự nhiên bằng haskell hay closure)
  • 51. Một số tài liệu tham khảo •Paper •http://monkey.org/~marius/funsrv.pdf (your server as a function) •Book •Functional programming in scala •Functional Programming Patterns in Scala and Clojure: Write Lean Programs for the JVM •Learn your haskell for great good •Slide •http://www.slideshare.net/pnicolas/advanced-scala-concepts
  • 52. Demo session (openrtb + a little bit of FP)