300 lines
7.4 KiB
Markdown
300 lines
7.4 KiB
Markdown
# SmartPool System
|
||
|
||
Hệ thống quản lý proxy thông minh với nhiều chiến lược lựa chọn và phân tích hiệu suất.
|
||
|
||
## Tổng quan
|
||
|
||
SmartPool là hệ thống quản lý proxy mới được xây dựng từ đầu với các tính năng:
|
||
|
||
- **5 chiến lược lựa chọn proxy thông minh**
|
||
- **Dual protocol support**: gRPC (MagicOnion) và HTTP REST API
|
||
- **ClickHouse integration**: Logging và analytics hiệu suất cao
|
||
- **SDK client**: Dễ dàng tích hợp vào các service
|
||
|
||
## Kiến trúc
|
||
|
||
```
|
||
┌─────────────────┐
|
||
│ Client Services │
|
||
└────────┬────────┘
|
||
│
|
||
↓
|
||
┌─────────────────────┐
|
||
│ SmartPool.Proxy SDK │ (gRPC hoặc HTTP)
|
||
└────────┬────────────┘
|
||
│
|
||
↓
|
||
┌──────────────────────┐
|
||
│ API.SmartPool │
|
||
│ - gRPC Service │
|
||
│ - HTTP Controller │
|
||
│ - Strategy Factory │
|
||
└────────┬─────────────┘
|
||
│
|
||
↓
|
||
┌─────────────────────────────┐
|
||
│ ClickHouse Databases │
|
||
│ │
|
||
│ smart_pool_meta: │
|
||
│ - proxy_metadata │
|
||
│ - proxy_access_mapping │
|
||
│ │
|
||
│ smart_pool_logs: │
|
||
│ - proxy_usage_logs │
|
||
│ - proxy_stats_hourly │
|
||
└─────────────────────────────┘
|
||
```
|
||
|
||
## Các thành phần
|
||
|
||
### 1. Icomm.SmartPool.Abstractions
|
||
Thư viện shared chứa interfaces và models:
|
||
- `ISmartProxyService`: MagicOnion interface
|
||
- Request/Response models
|
||
- Enums (Strategy, Protocol, IpVersion)
|
||
|
||
### 2. Icomm.API.SmartPool
|
||
API Backend với:
|
||
- **Services**: SmartProxyGrpcService (MagicOnion)
|
||
- **Controllers**: SmartProxyController (HTTP REST)
|
||
- **Strategies**: 5 chiến lược pick proxy
|
||
- **Repositories**: ProxyMetadataRepository, ProxyLogRepository
|
||
- **Infrastructure**: ClickHouse context, DI extensions
|
||
|
||
### 3. Icomm.SmartPool.Proxy
|
||
Client SDK hỗ trợ:
|
||
- `ISmartPoolClient`: Interface chính
|
||
- `SmartPoolClient`: Implementation cho cả gRPC và HTTP
|
||
- Extension methods cho DI registration
|
||
|
||
### 4. Icomm.SmartPool.Tests
|
||
Unit tests cho:
|
||
- Strategies
|
||
- Client SDK
|
||
- Factory pattern
|
||
|
||
## Chiến lược Pick Proxy
|
||
|
||
### 1. Random Strategy
|
||
```csharp
|
||
strategy: "random"
|
||
```
|
||
- Pick ngẫu nhiên từ danh sách proxy được phân quyền
|
||
- Hỗ trợ filter: country, ip_version, protocol
|
||
|
||
### 2. Round Robin Strategy
|
||
```csharp
|
||
strategy: "round_robin"
|
||
```
|
||
- Xoay vòng tuần tự qua các proxy
|
||
- Sử dụng Redis để lưu index
|
||
- Đảm bảo phân phối đều workload
|
||
|
||
### 3. Least Delay Strategy
|
||
```csharp
|
||
strategy: "least_delay"
|
||
targetDomain: "facebook.com" // Required
|
||
```
|
||
- Chọn proxy có response time thấp nhất
|
||
- Dựa trên dữ liệu 24h gần nhất
|
||
- Tối ưu cho từng target_domain cụ thể
|
||
|
||
### 4. Adaptive Ranking Strategy
|
||
```csharp
|
||
strategy: "adaptive_ranking"
|
||
targetDomain: "facebook.com" // Required
|
||
```
|
||
- Chọn proxy có điểm số cao nhất
|
||
- Điểm số = success_rate_10 × 0.4 + success_rate_50 × 0.3 + success_rate_100 × 0.2 + success_rate_200 × 0.1
|
||
- Dựa trên dữ liệu 7 ngày gần nhất
|
||
|
||
### 5. Alternative Strategy
|
||
```csharp
|
||
strategy: "alternative"
|
||
refererProxy: { id: 123 } // Required
|
||
```
|
||
- Tìm proxy thay thế tương tự với proxy hiện tại
|
||
- Cùng ip_version, country, protocol
|
||
- Hữu ích khi proxy hiện tại bị lỗi
|
||
|
||
## Cài đặt và Chạy
|
||
|
||
### Bước 1: Setup ClickHouse
|
||
|
||
```bash
|
||
# Chạy script khởi tạo database
|
||
clickhouse-client < src/Icomm.API.SmartPool/clickhouse_init.sql
|
||
```
|
||
|
||
### Bước 2: Cấu hình
|
||
|
||
Sửa `appsettings.json` trong `Icomm.API.SmartPool`:
|
||
|
||
```json
|
||
{
|
||
"ClickHouse": {
|
||
"Host": "localhost",
|
||
"Port": 8123,
|
||
"MetaDatabase": "smart_pool_meta",
|
||
"LogsDatabase": "smart_pool_logs"
|
||
},
|
||
"Redis": {
|
||
"Configuration": "localhost:6379"
|
||
}
|
||
}
|
||
```
|
||
|
||
### Bước 3: Chạy API
|
||
|
||
```bash
|
||
cd src/Icomm.API.SmartPool
|
||
dotnet run
|
||
```
|
||
|
||
API sẽ chạy tại:
|
||
- HTTP: http://localhost:5000
|
||
- gRPC: http://localhost:5001
|
||
- Swagger: http://localhost:5000/swagger
|
||
|
||
### Bước 4: Sử dụng SDK trong Client Service
|
||
|
||
```csharp
|
||
// Trong Program.cs hoặc Startup.cs
|
||
services.AddSmartPoolClient(configuration);
|
||
|
||
// Trong service của bạn
|
||
public class MyService
|
||
{
|
||
private readonly ISmartPoolClient _smartPoolClient;
|
||
|
||
public MyService(ISmartPoolClient smartPoolClient)
|
||
{
|
||
_smartPoolClient = smartPoolClient;
|
||
}
|
||
|
||
public async Task DoWorkAsync()
|
||
{
|
||
// Lấy proxy
|
||
var proxy = await _smartPoolClient.GetProxyAsync(
|
||
strategy: "least_delay",
|
||
targetDomain: "facebook.com"
|
||
);
|
||
|
||
// Sử dụng proxy
|
||
var handler = new HttpClientHandler { Proxy = proxy };
|
||
var httpClient = new HttpClient(handler);
|
||
var response = await httpClient.GetAsync("https://facebook.com");
|
||
|
||
// Ghi log
|
||
await _smartPoolClient.LogProxyUsageAsync(
|
||
accessToken: "your-token",
|
||
proxyId: 123,
|
||
targetDomain: "facebook.com",
|
||
statusCode: (int)response.StatusCode,
|
||
responseTimeMs: 450
|
||
);
|
||
}
|
||
}
|
||
```
|
||
|
||
## Data Flow
|
||
|
||
### Luồng Get Proxy
|
||
|
||
```
|
||
Client Service
|
||
↓
|
||
SmartPool SDK (GetProxyAsync)
|
||
↓
|
||
API Backend (gRPC/HTTP)
|
||
↓
|
||
Strategy Factory
|
||
↓
|
||
Strategy Implementation (Random/RoundRobin/LeastDelay/AdaptiveRanking/Alternative)
|
||
↓
|
||
Repository (Query ClickHouse)
|
||
↓
|
||
Return SmartProxyServer
|
||
```
|
||
|
||
### Luồng Log Usage
|
||
|
||
```
|
||
Client Service
|
||
↓
|
||
SmartPool SDK (LogProxyUsageAsync)
|
||
↓
|
||
API Backend (gRPC/HTTP)
|
||
↓
|
||
ProxyLogRepository
|
||
↓
|
||
INSERT INTO proxy_usage_logs
|
||
↓
|
||
Materialized View tự động aggregate vào proxy_stats_hourly
|
||
```
|
||
|
||
## ClickHouse Schema
|
||
|
||
### Database: smart_pool_meta (Metadata)
|
||
|
||
1. **proxy_metadata**: Thông tin proxy servers
|
||
2. **proxy_access_mapping**: Mapping access_token → cluster (flexible cluster-based access control)
|
||
|
||
### Database: smart_pool_logs (Logs & Analytics)
|
||
|
||
3. **proxy_usage_logs**: Log sử dụng proxy (TTL 90 ngày)
|
||
4. **proxy_stats_hourly**: Thống kê theo giờ (Materialized View)
|
||
|
||
### Queries mẫu
|
||
|
||
```sql
|
||
-- Xem proxy có response time thấp nhất
|
||
SELECT
|
||
proxy_id,
|
||
avgMerge(avg_response_time_state) as avg_time
|
||
FROM smart_pool_logs.proxy_stats_hourly
|
||
WHERE access_token = 'your-token'
|
||
AND hour >= now() - INTERVAL 24 HOUR
|
||
GROUP BY proxy_id
|
||
ORDER BY avg_time ASC
|
||
LIMIT 10;
|
||
|
||
-- Xem success rate của proxy
|
||
SELECT
|
||
proxy_id,
|
||
sumIfMerge(success_count_state) / countMerge(request_count_state) as success_rate
|
||
FROM smart_pool_logs.proxy_stats_hourly
|
||
WHERE access_token = 'your-token'
|
||
GROUP BY proxy_id
|
||
ORDER BY success_rate DESC;
|
||
```
|
||
|
||
## Testing
|
||
|
||
```bash
|
||
# Chạy tất cả tests
|
||
dotnet test
|
||
|
||
# Chạy tests với output chi tiết
|
||
dotnet test --logger "console;verbosity=detailed"
|
||
```
|
||
|
||
## Dependencies
|
||
|
||
- .NET 8.0
|
||
- MagicOnion 5.1.11
|
||
- ClickHouse.Client 7.7.0
|
||
- EasyCaching.Redis 1.9.2
|
||
- Dapper 2.1.35
|
||
- Serilog 8.0.1
|
||
|
||
## Tài liệu tham khảo
|
||
|
||
- [API Backend README](./docs/src/Icomm.API.SmartPool/README.md)
|
||
- [SDK Client README](./docs/src/Icomm.SmartPool.Proxy/README.md)
|
||
- [Tests README](./docs/src/Icomm.SmartPool.Tests/README.md)
|
||
|
||
## License
|
||
|
||
Internal use only.
|