Search Tool
    • Tổng quan
    • Bussiness | Logic
      • Nghiệp vụ & Luồng Tìm kiếm
      • Task Orchestration
      • Scraping & Execution
      • Exception & Recovery
      • Proxy Orchestration
    • Project
      • Search API
        • Tổng quan Search API
        • Architecture
          • Database Schema
          • System Architecture
          • Code Structure
        • API Interface
          • Go - Auth
            • Đăng nhập
            • Đăng ký (Public)
          • Go - User
            • Danh sách User (Phân trang)
            • Tạo User
            • Lấy tất cả User
            • Profile cá nhân
            • Chi tiết User
            • Cập nhật User
            • Xóa User
            • Đổi mật khẩu
          • Go - System
            • Nhật ký hoạt động (Phân trang)
            • Cập nhật dữ liệu Search
            • Test Webhook receiver
          • Go - Server
            • Danh sách Server (Phân trang)
            • Tạo Server
            • Lấy tất cả Server
            • Chi tiết Server
            • Cập nhật Server
            • Xóa Server
          • Go - Tasks
            • Tạo nhiều task Search
            • Lấy tất cả task Search
            • Reset trạng thái tất cả nhiệm vụ Search
            • Tạo nhiều task Anchor Text
            • Lấy tất cả nhiệm vụ Anchor Text
            • Reset trạng thái tất cả nhiệm vụ Anchor Text
          • Go - Webhook
            • Webhook cập nhật trạng thái (Dùng WEBHOOK_KEY)
            • Lấy Proxy cho Tool
            • Lấy Proxy có thể rotate
            • Cập nhật kết quả Search
            • Kết quả rotate Proxy
            • Cập nhật kết quả Anchor Text
            • Nhận kết quả từ Tool (v2)
        • Deployment
          • Local
          • Staging
          • Product
      • Search tool
        • Tổng quan Search Tool
        • Architecture
          • Database Schema
          • System Architecture
          • Code Structure
        • API Interface
          • Bun - Main
            • Thông tin server Bun
            • Health Check
            • Lấy file Log
          • Bun - Task
            • Danh sách Search Tasks
            • Tạo nhiều Search Tasks
            • Xóa tất cả Search Tasks
            • Xóa Search Task
            • Reset trạng thái Search
            • Reset running process
            • Danh sách Anchor Tasks
            • Tạo nhiều Anchor Tasks
            • Xóa tất cả Anchor Tasks
            • Xóa Anchor Task
            • Reset trạng thái Anchor
            • Reset running process
        • Deployment
          • Local
          • Staging
          • Product
    • Schemas
      • LoginRequest
      • ProxyRequest
      • CreateUserRequest
      • KeywordTaskRequest
      • UpdateUserRequest
      • SearchAutomationRequest
      • ChangePasswordRequest
      • CreateServerRequest
      • AnchorTextTaskRequest

    Tổng quan

    Tổng Quan Vận Hành — Search Tool#

    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ầnTên gọiVai 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ốngHệ thống xử lý thế nào?
    Không tìm được proxyChờ 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ácThử 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
    Tiếp theo
    Nghiệp vụ & Luồng Tìm kiếm
    Built with