6.7 KiB
6.7 KiB
SmartPool Quick Reference
Tài liệu tham khảo nhanh cho SmartPool system.
🚀 Quick Start
# 1. Setup ClickHouse
clickhouse-client < src/Icomm.API.SmartPool/clickhouse_init.sql
# 2. Start Redis
redis-server
# 3. Run API
cd src/Icomm.API.SmartPool
dotnet run
# 4. Run Tests
cd src/Icomm.SmartPool.Tests
dotnet test
📦 NuGet Packages
API Backend
<PackageReference Include="MagicOnion.Server" Version="5.1.11" />
<PackageReference Include="ClickHouse.Client" Version="7.7.0" />
<PackageReference Include="EasyCaching.Redis" Version="1.9.2" />
<PackageReference Include="Dapper" Version="2.1.35" />
<PackageReference Include="Serilog.AspNetCore" Version="8.0.1" />
Client SDK
<PackageReference Include="MagicOnion.Client" Version="5.1.11" />
<PackageReference Include="Grpc.Net.Client" Version="2.60.0" />
🎯 Strategies Cheat Sheet
| Strategy | Use Case | Required Params | Best For |
|---|---|---|---|
random |
General purpose | - | Simple crawling |
round_robin |
Load balancing | - | Distributed workload |
least_delay |
Speed optimization | targetDomain |
Fast response needed |
adaptive_ranking |
Reliability | targetDomain |
High success rate needed |
alternative |
Failover | refererProxy |
Retry with similar proxy |
📝 Code Snippets
Client Setup
// Program.cs
services.AddSmartPoolClient(configuration);
// Usage
public class MyService
{
private readonly ISmartPoolClient _client;
public MyService(ISmartPoolClient client) => _client = client;
public async Task DoWork()
{
var proxy = await _client.GetProxyAsync(strategy: "least_delay");
// Use proxy...
}
}
Get Proxy (Simple)
var proxy = await _smartPoolClient.GetProxyAsync(
strategy: "random",
ipVersion: "v6",
country: "US"
);
Get Proxy (Advanced)
var request = new GetProxyRequest
{
AccessToken = "your-token",
Strategy = "adaptive_ranking",
TargetDomain = "facebook.com",
IpVersion = "v6",
Protocol = "http",
Country = "US"
};
var proxy = await _smartPoolClient.GetRawProxyAsync(request);
Log Usage
await _smartPoolClient.LogProxyUsageAsync(
accessToken: "your-token",
proxyId: 123,
targetDomain: "facebook.com",
statusCode: 200,
responseTimeMs: 450
);
Use with HttpClient
var proxy = await _smartPoolClient.GetProxyAsync();
var handler = new HttpClientHandler { Proxy = proxy };
var httpClient = new HttpClient(handler);
var response = await httpClient.GetAsync("https://example.com");
🔌 API Endpoints
HTTP REST
# Get Proxy
POST /api/smart-pool/v1/SmartProxy/get-proxy
Content-Type: application/json
{
"accessToken": "token",
"strategy": "least_delay",
"targetDomain": "facebook.com"
}
# Log Usage
POST /api/smart-pool/v1/SmartProxy/log-usage
Content-Type: application/json
{
"accessToken": "token",
"proxyId": 123,
"targetDomain": "facebook.com",
"statusCode": 200,
"responseTimeMs": 450
}
# Health Check
GET /api/smart-pool/v1/SmartProxy/health
# Get Strategies
GET /api/smart-pool/v1/SmartProxy/strategies
gRPC
var channel = GrpcChannel.ForAddress("http://localhost:5001");
var client = MagicOnionClient.Create<ISmartProxyService>(channel);
var response = await client.GetProxy(new GetProxyRequest { ... });
await client.LogProxyUsage(new ProxyUsageLogRequest { ... });
var status = await client.Ping();
🗄️ ClickHouse Queries
View Proxy Stats
SELECT
proxy_id,
avgMerge(avg_response_time_state) as avg_time,
sumIfMerge(success_count_state) / countMerge(request_count_state) as success_rate
FROM smart_pool_logs.proxy_stats_hourly
WHERE access_token = 'your-token'
AND hour >= now() - INTERVAL 24 HOUR
GROUP BY proxy_id
ORDER BY success_rate DESC;
View Recent Logs
SELECT *
FROM smart_pool_logs.proxy_usage_logs
WHERE access_token = 'your-token'
AND timestamp >= now() - INTERVAL 1 HOUR
ORDER BY timestamp DESC
LIMIT 100;
Add Proxy
INSERT INTO smart_pool_meta.proxy_metadata
(id, host, port, protocol, ip_version, country, status)
VALUES
(1, '192.168.1.100', 8080, 'http', 'v4', 'VN', 1);
Add Access Mapping (Cluster-based)
INSERT INTO smart_pool_meta.proxy_access_mapping
(access_token, cluster, priority)
VALUES
('your-token', 'cluster_vn_http', 10);
⚙️ Configuration Templates
appsettings.json (API)
{
"ClickHouse": {
"Host": "localhost",
"Port": 8123,
"MetaDatabase": "smart_pool_meta",
"LogsDatabase": "smart_pool_logs",
"Username": "default",
"Password": ""
},
"Redis": {
"Configuration": "localhost:6379"
},
"Kestrel": {
"Endpoints": {
"Http": { "Url": "http://0.0.0.0:5000" },
"Grpc": { "Url": "http://0.0.0.0:5001", "Protocols": "Http2" }
}
}
}
appsettings.json (Client)
{
"SmartPool": {
"Protocol": "Grpc",
"Host": "localhost",
"Port": 5001,
"UseSecureConnection": false,
"DefaultAccessToken": "your-token",
"TimeoutMs": 30000
}
}
🐛 Troubleshooting
Proxy không available
var proxy = await _client.GetProxyAsync();
if (proxy == null)
{
// Check:
// 1. Access token có đúng không?
// 2. Có proxy nào được map với token này không?
// 3. Filters có quá strict không?
}
Connection timeout
// Tăng timeout
services.AddSmartPoolClient(options =>
{
options.TimeoutMs = 60000; // 60 seconds
});
Strategy không hoạt động
// Check logs có đủ không (cho least_delay, adaptive_ranking)
// Cần ít nhất 10 logs để adaptive_ranking hoạt động
📊 Performance Tips
- Use gRPC for production - Faster than HTTP
- Log asynchronously - Don't block main flow
- Cache proxy info - Reduce API calls
- Use appropriate strategy - Match use case
- Monitor ClickHouse - Check query performance
🔒 Security Notes
- Always use HTTPS in production
- Rotate access tokens regularly
- Limit proxy access by token
- Monitor unusual usage patterns
- Set appropriate TTL for logs
📚 Documentation Links
🆘 Support
For issues or questions:
- Check logs in
logs/smartpool-*.log - Verify ClickHouse connection
- Check Redis connection
- Review configuration
- Contact development team
Version: 1.0.0
Last Updated: 2026-01-22