tpphu / golang-training

Golang for Backend Developer with Nordic Coder
https://nordiccoder.com/khoa-hoc/golang-for-backend-dev/
132 stars 50 forks source link

Week 2 - Keynotes #21

Closed tpphu closed 5 years ago

tpphu commented 5 years ago

Discussion - How to build a crawler

Database Design

Db có 2 yếu tố, 1 về nghiệp vụ Phú sẽ không bàn ở đây. Còn mình sẽ thiết kế để làm monitoring/analyzer/alert là chính, để biết hiện tại hệ thống đang xử lý những gì, đang bị lỗi ở domain nào, nguyên nhân gì v.v…

Software scaling

Để chạy với khả năng mở rộng cái cần là tư duy theo hướng gọi request, ajax và dùng json, html/jquery để parse thông tin. Nếu dùng browser như selenium, hay thậm chí headless browser như: https://github.com/GoogleChrome/puppeteer thì khả năng scale sẽ khó. Tuy nhiên các bạn có thể thử để có feeling.

Thậm chí chuẩn bị cả giải pháp về login.

Plugin architect

Mình sẽ thiết kế theo hướng generic để chỉ cần add thêm define của một domain khác là ready. Không phải code lại làm gì. Thậm chí có giao diện để vào cấu hình. Stop/Start bằng tool dashboard không cần phải restart hệ thống. Nếu muốn làm theo hướng này.

Dynamic and smart proxy usage

Proxy là phần khó nhất của hệ thống crawler, phải đảm bảo các yếu tố.

Chỉ có n request đến một domain trên 1 IP trong cùng một thời điểm. Chú ý là không phải request nào cũng có response giống nhau, nên phải tính theo thời gian trả về. Tránh DOS server. Trong một khoảng thời gian t chỉ gọi k request đến domain để không bj chặn. Theo rule của các ông system admin hay làm.

Vì mỗi IP tương đương với một VPS, và quan trọng nữa là có thể proxy sẽ phục vụ nhiều account (nếu mua loại này), thậm chí mỗi server chỉ có thể gởi một lượng request nhất định do VPS có cấu hình thấp như 1-2CPU, và 1-2G RAM. Nên do vậy, tổng số request trên cùng một VPS ở một thời điểm phải thiết kế giới hạn theo con số x nào đó. Nguyên nhân là do vấn đề lệ thuộc vào nhà cung cấp proxy. Công ty cũng không thể tự làm cái này. Bởi vì, rất khó linh hoạt trong việc đổi IP, và mua ở số lượng lớn. Phải đổi proxy dễ dàng, nếu vì code lỗi hay hư mà domain nó chặn cái IPs đó.

Nếu một request đến domain bị lỗi thì phải switch sang proxy khác, tức là cơ chế retry thông qua proxy.

tpphu commented 5 years ago

Minh hoa cac van de

Screen Shot 2019-05-09 at 10 46 55 PM
tpphu commented 5 years ago

Minh hoa kien truc

Screen Shot 2019-05-09 at 10 46 11 PM
tpphu commented 5 years ago

Minh hoa ve thiet ke db

Screen Shot 2019-05-09 at 10 49 57 PM
tpphu commented 5 years ago

Khong connect den db dc => chua start db

go run main.go model.go
panic: dial tcp 127.0.0.1:3306: connect: connection refused

goroutine 1 [running]:
main.main()
    /Users/tranphongphu/workspace/golang-training/demo-note/main.go:11 +0x1bb
exit status 2
tpphu commented 5 years ago

Start Docker

docker-compose up -d mariadb
mysql -uroot -proot -h127.0.0.1
CREATE DATABASE demo_note CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;