Files

300 lines
7.4 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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.