Tài liệu này mô tả sơ đồ vận hành của hệ thống Search Tool ở mức tổng quan.
1. Hệ thống gồm những gì?#
Search Tool bao gồm 2 thành phần chính hoạt động phối hợp với nhau:| Thành phần | Tên gọi | Vai trò |
|---|
| API (Go) | api/ | Bộ não trung tâm — nhận yêu cầu, quản lý danh sách task, điều phối công việc |
| Tool tự động hóa (Bun) | tools/ | Cỗ máy thực thi — dùng trình duyệt ảo để thực sự vào Google và lấy dữ liệu |
Ngoài ra, hệ thống sử dụng các kho lưu trữ dữ liệu:MongoDB — lưu danh sách task, kết quả tìm kiếm
MySQL — lưu thông tin người dùng, cấu hình server
Redis — bộ nhớ đệm tốc độ cao, tránh tìm kiếm trùng lặp
2. Hai luồng nghiệp vụ chính#
Hệ thống phục vụ 2 mục đích riêng biệt:Luồng A — Tìm kiếm từ khóa (Keyword Search)#
"Gõ từ khóa này lên Google, xem những tên miền nào đang nổi top — thu thập danh sách đó để phân tích SEO."
Luồng B — Tìm kiếm anchor text (Anchor Text Search)#
"Vào website này, tìm xem có đường link nào trỏ đến domain tôi quan tâm không?"
3. Sơ đồ vận hành — Luồng A: Tìm kiếm từ khóa#
Mục đích: Tự động gõ từ khóa lên Google, thu thập danh sách tên miền đang đứng top cùng thứ hạng của chúng. Dữ liệu này dùng để phân tích SEO, theo dõi đối thủ, hoặc xác định các trang web tiềm năng để xây dựng backlink.
Người dùng / Hệ thống bên ngoài
│
│ Gửi yêu cầu tìm kiếm (từ khóa, thiết bị, số kết quả...)
▼
┌─────────────────────────────┐
│ API Trung tâm (Go) │
│ │
│ 1. Tiếp nhận yêu cầu │
│ 2. Lưu task vào hàng đợi │
│ 3. Kiểm tra cache Redis │──── Có cache? ──► Gửi kết quả ngay về Webhook
│ 4. Phân phối task │
│ đến các Tool Server │
└────────────┬────────────────┘
│ Giao task (có trọng số ưu tiên)
▼
┌─────────────────────────────┐
│ Tool Tự Động Hóa (Bun) │
│ │
│ 5. Nhận danh sách task │
│ 6. Lấy proxy từ API │◄── Proxy Service bên ngoài
│ 7. Mở trình duyệt ảo │
│ 8. Vào Google tìm kiếm │
│ 9. Kiểm tra captcha? │
│ - Có captcha → thử lại │
│ với proxy mới (tối đa │
│ 10 lần) │
│ 10. Thu thập kết quả │
│ (URL, thứ hạng, tiêu │
│ đề, mô tả) │
│ 11. Lưu kết quả vào DB │
└────────────┬────────────────┘
│
│ Gửi kết quả về
▼
┌─────────────────────────────┐
│ Webhook (Hệ thống │
│ nhận kết quả) │
│ │
│ 12. Nhận dữ liệu kết quả │
│ tìm kiếm │
└─────────────────────────────┘
Giải thích bằng ngôn ngữ đơn giản:1.
Có người gửi yêu cầu: "Hãy gõ từ khóa X lên Google và thu thập danh sách các domain đang đứng top"
2.
API tiếp nhận và lưu yêu cầu vào danh sách chờ
3.
Nếu từ khóa này đã từng tìm trước đó và còn trong bộ nhớ đệm → trả kết quả ngay, không cần tìm lại
4.
Nếu chưa có cache → API giao việc cho các Tool Server (ưu tiên server mạnh hơn)
5.
Tool Server mở một trình duyệt ảo (giống như bạn mở Chrome), dùng proxy để giả lập người dùng thật tại Việt Nam
6.
Trình duyệt vào Google, gõ từ khóa, chờ trang tải, cuộn xuống để nội dung hiện đủ
7.
Thu thập toàn bộ kết quả tự nhiên: domain nào đứng thứ mấy, tiêu đề là gì, mô tả ra sao
8.
Nếu Google chặn bằng captcha → hệ thống tự đổi proxy và thử lại
9.
Sau khi lấy được kết quả → gửi về địa chỉ webhook đã đăng ký để hệ thống đặt hàng nhận và phân tích tiếp
4. Sơ đồ vận hành — Luồng B: Tìm kiếm Anchor Text#
Người dùng / Hệ thống bên ngoài
│
│ Gửi yêu cầu: "Vào website X, tìm link trỏ đến domain Y"
▼
┌─────────────────────────────┐
│ API Trung tâm (Go) │
│ (Tiếp nhận & lưu task) │
└────────────┬────────────────┘
│
▼
┌─────────────────────────────┐
│ Tool Tự Động Hóa (Bun) │
│ │
│ 1. Nhận task từ hàng đợi │
│ 2. Lấy proxy │
│ 3. Mở trình duyệt, vào │
│ website cần kiểm tra │
│ 4. Kiểm tra captcha │
│ 5. Cuộn trang để load │
│ toàn bộ nội dung │
│ 6. Quét toàn bộ đường link │
│ (thẻ <a>) trên trang │
│ 7. Quét thêm trong các │
│ file JS của trang │
│ 8. Lọc ra link nào chứa │
│ từ khóa anchor_key │
│ 9. Lưu kết quả │
└────────────┬────────────────┘
│
▼
┌─────────────────────────────┐
│ Webhook │
│ 10. Nhận danh sách anchor │
│ text tìm được │
└─────────────────────────────┘
Giải thích bằng ngôn ngữ đơn giản:1.
Có yêu cầu: "Vào website A, kiểm tra xem có link nào trỏ đến domain B không"
2.
Tool mở trình duyệt ảo, truy cập website đó
3.
Cuộn toàn bộ trang để đảm bảo nội dung động được tải đầy đủ
4.
Quét tất cả các đường link hiển thị trên trang
5.
Đồng thời kiểm tra thêm trong mã nguồn JavaScript của trang (vì một số link được nhúng trong JS)
6.
Lọc ra những link nào chứa từ khóa cần tìm → trả về danh sách kết quả
5. Cơ chế xử lý lỗi & thử lại#
Hệ thống được thiết kế để tự động phục hồi khi gặp sự cố, không cần can thiệp thủ công trong phần lớn trường hợp:| Tình huống | Hệ thống xử lý thế nào? |
|---|
| Không tìm được proxy | Chờ 10 giây rồi thử lại liên tục cho đến khi có proxy |
| Google hiện captcha | Đổi proxy mới, thử lại — tối đa 10 lần |
| Captcha vẫn xuất hiện sau 10 lần | Đổi hệ điều hành giả lập (Windows ↔ MacOS, Android ↔ iOS), thử thêm 10 lần nữa |
| Tìm không có kết quả / lỗi khác | Thử lại tối đa 10 lần với proxy mới |
| Hết tất cả lần thử | Dự phòng: gọi API bên thứ ba (searchapi.io) để lấy dữ liệu |
| Task bị kẹt ở trạng thái "đang chạy" | Người vận hành dùng lệnh reset để đưa task về trạng thái chờ |
6. Vòng đời của một Task#
Gửi yêu cầu
│
▼
[PENDING] ← Task đang chờ xử lý
│
▼
[PROCESSING] ← Tool đang thực thi (mở browser, tìm kiếm)
│
┌───── ─┴──────┐
│ │
▼ ▼
[COMPLETED] [PENDING] ← Lỗi → đưa về hàng đợi để thử lại
│
▼
Gửi Webhook ← Thông báo kết quả về hệ thống đăng ký
│
▼
Xóa Task ← Task hoàn thành, dọn dẹp khỏi DB
7. Vai trò của Proxy trong hệ thống#
Proxy là "danh tính ảo" giúp hệ thống giả lập người dùng thật khi truy cập Google hoặc website:Mỗi lần tìm kiếm, hệ thống lấy một proxy từ dịch vụ proxy bên ngoài (cấu hình qua biến môi trường)
Proxy được gắn cố định vào từng task cho đến khi task hoàn thành
Nếu proxy bị chặn (captcha), hệ thống gỡ proxy cũ và lấy proxy mới
Sau khi task hoàn thành, hệ thống gọi callback về proxy service để thông báo đã dùng xong
8. Cơ chế phân phối công việc giữa các Server#
Khi có nhiều Tool Server cùng chạy song song, API sẽ phân chia task theo trọng số ưu tiên:Tổng số Task cần xử lý
│
├──── Server ưu tiên cao → nhận 5 phần
│
└──── Server bình thường → nhận 2 phần
Ví dụ: 70 task, 1 server ưu tiên + 1 server thường → server ưu tiên nhận ~50 task, server thường nhận ~20 taskĐiều này giúp tận dụng tối đa server mạnh hơn, đồng thời không bỏ phí server yếu hơn.
9. Tóm tắt nhanh#
[Bên ngoài gửi yêu cầu]
↓
[API Go — nhận, lưu, điều phối]
↓
[Tool Bun — mở browser, dùng proxy, vào Google/website]
↓
[Lấy kết quả → lưu DB → gửi Webhook về bên ngoài]
Toàn bộ quá trình từ lúc nhận yêu cầu đến khi có kết quả diễn ra hoàn toàn tự động, không cần con người can thiệp trong điều kiện bình thường. Ngày cập nhật 2026-03-31 07:45:06