1. Architecture
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
  1. Architecture

System Architecture

1. Tech Stack

Thành phầnCông nghệGhi chú
LanguageGo 1.21+—
HTTP FrameworkFiber v2Fast HTTP dựa trên fasthttp
ORM (MySQL)GORMAuto-migration, soft delete
MongoDB Drivergo.mongodb.org/mongo-driverDocument store cho task pool
CacheRedis (go-redis)Cache kết quả anchor text
DI Containeruber/digDependency injection
AuthJWT (golang-jwt/jwt)Bearer token
Loggeruber/zap + lumberjackStructured logging, log rotation
SchedulerCustom schedulerCron-based task dispatch

2. Sơ đồ kiến trúc tổng quan

┌─────────────────────────────────────────────────────────┐
│                 Search Tool API                       │
│               (Go + Fiber, port 33003)                │
│                                                         │
│  ┌──────────┐  ┌──────────┐  ┌───────────────────────┐ │
│  │  /api/* │  │ /search/ │  │    /anchor-text/      │ │
│  │  (JWT)   │  │ /anchor- │  │    (Search Token)     │ │
│  │          │  │  text/   │  │                       │ │
│  │ User     │  │  (Search │  │  Anchor Text Handler  │ │
│  │ Server   │  │  Token)  │  │  → MongoDB pool       │ │
│  │ CRUD     │  │  → Mongo │  └───────────────────────┘ │
│  └──────────┘  │  pool    │                            │
│                └──────────┘  ┌───────────────────────┐ │
│                              │    /webhook/* │ │
│                              │  (Webhook Key)        │ │
│                              │  - get-proxy          │ │
│                              │  - update-search-result││
│                              │  - update-anchor-text │ │
│                              └───────────────────────┘ │
│                                                         │
│  ┌─────────────────────────────────────────────────┐   │
│  │         Cron Job (goroutine, mỗi 60s)           │   │
│  │  1. Lấy pending tasks từ MongoDB                │   │
│  │  2. Lấy active servers từ MySQL                 │   │
│  │  3. Phân phối tasks → Worker Servers            │   │
│  └─────────────────────────────────────────────────┘   │
└─────────────────────────────────────────────────────────┘
        │                              │
        ▼                              ▼
┌──────────────┐              ┌──────────────────┐
│    MySQL     │              │    MongoDB       │
│  - users     │              │  - keyword tasks │
│  - servers   │              │  - anchor tasks  │
└──────────────┘              └──────────────────┘
        │
        ▼
┌──────────────┐
│    Redis     │
│  Cache (5m)  │
└──────────────┘
        │
        ▼ (callback)
┌──────────────────────────────────┐
│        Worker Servers            │
│  (external — IP lưu trong MySQL) │
│  Chạy tool search thực tế        │
│                                  │ 
│  POST kết quả về /webhook/...    │
└──────────────────────────────────┘

3. Luồng khởi động ứng dụng

main.go
  │
  ├─ pkg.LoadEnv()                  → Đọc .env vào EnvStruct
  ├─ injection.ProvideComponents()  → Khởi tạo DI container (uber/dig)
  │     ├─ database.Connect()       → Kết nối MySQL + MongoDB
  │     ├─ cache.NewRedisCache()    → Kết nối Redis
  │     └─ NewService() x N         → Đăng ký tất cả services
  ├─ fiber.New()                    → Tạo HTTP server
  ├─ middleware (CORS, Helmet, ErrorHandler, Logger)
  ├─ bootstrap.InitRoutes()         → Đăng ký tất cả routes
  │     └─ cron.RunCron()           → Khởi động goroutine cron
  ├─ socket_bootstrap.NewSocketServer() → Socket.IO
  └─ app.Listen(:PORT)             → Lắng nghe HTTP

4. Dependency Injection

Sử dụng uber/dig — IoC container kiểu constructor injection.

Container
  ├─ EnvStruct (pkg.LoadEnv)
  ├─ database.DbConn (MySQL + MongoDB)
  ├─ cache.RedisCache
  ├─ scheduler.Scheduler
  ├─ user.Service
  ├─ activityLog.Service
  ├─ proxy.Service
  ├─ server.Service
  ├─ keyword.Service
  ├─ keywordPoolTask.Service
  ├─ keywordResult.Service
  └─ anchorText.Service

Các handler gọi injection.Container.Invoke(...) để nhận service đã được inject.


5. Cơ chế phân phối task (Weighted Task Dispatch)

Mỗi 60 giây, cron job thực hiện:

  1. Lấy tasks từ MongoDB có status = Status_New
  2. Lấy servers từ MySQL có is_active = true
  3. Tính trọng số phân phối:
    • IsPriority = true → weight 5
    • IsPriority = false → weight 2
  4. Phân bổ số task cho mỗi server theo tỷ lệ weight
  5. Cập nhật status → Status_Processing
  6. Gửi task batch đến từng server qua HTTP POST (retry tối đa 3 lần, exponential backoff)
  7. Nếu server xác nhận nhận task → xoá khỏi pool MongoDB
Ví dụ với 2 servers, 70 tasks:
  Server A (priority=true,  weight=5): 70 * 5/7 = 50 tasks
  Server B (priority=false, weight=2): 70 * 2/7 = 20 tasks

7. Cơ chế xử lý kết quả Anchor Text (với Redis cache)

Worker gọi: POST /webhook/update-search-anchor-text/:id?hook_url=<client_url>
                              │
                    API nhận callback
                              │
              ┌───────────────┴────────────────┐
              │                                │
    Có kết quả (anchor_text > 0)?         Không có kết quả
              │                                │
    Save vào Redis (TTL 5m)         searched < 10? → tăng searched, retry
    key: {domain}_{anchor_keys}           searched >= 10? → drop task
              │
    Forward kết quả đến hook_url của client (POST)
              │
    Client confirm (HTTP 2xx)?
              │
    Xoá task khỏi MongoDB pool

--- Cron job check Redis (lần tiếp theo) ---
Task cùng domain đã có cache?
  → YES: Gọi hook_url trực tiếp từ cache, xoá task (không giao cho worker)
  → NO: Giao cho worker bình thường

8. Middleware Stack

MiddlewareRouteMô tả
cors.New()Toàn bộCORS headers
helmet.New()Toàn bộSecurity HTTP headers
ErrorHandlerToàn bộChuẩn hoá lỗi thành JSON response
fiberLoggerToàn bộHTTP access log
JWTMiddleware/api/* (trừ login/register)Xác thực Bearer JWT
SearchMiddleware/search/, /anchor-text/Xác thực API_SEARCH_TOKEN
WebhookMiddleware/webhook/*Xác thực WEBHOOK_KEY

9. Module nội bộ của API (pkg/)

PackageMô tả
pkg/env.goLoad và parse .env vào struct EnvStruct
pkg/databaseKết nối MySQL (GORM) và MongoDB
pkg/cacheRedis cache wrapper
pkg/jwtJWT generate và validate
pkg/middlewareTất cả middleware
pkg/apperrorError response builder (BadRequest, NotFound, ...)
pkg/messagesResponse builder chuẩn hoá
pkg/validateValidator wrapper (go-playground/validator)
pkg/loggerLogger wrapper (uber/zap)
pkg/helperHelper utilities (mysql_helper, ...)
pkg/schedulerScheduler base
pkg/api/proxyClient gọi external proxy API
pkg/api/search_anchor_textDTO + factory cho anchor text task
pkg/api/search_keywordDTO + factory cho keyword task
Ngày cập nhật 2026-03-31 02:04:22
Trước
Database Schema
Tiếp theo
Code Structure
Built with