358 lines
		
	
	
		
			9.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			358 lines
		
	
	
		
			9.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package binanceservice
 | |
| 
 | |
| import (
 | |
| 	"fmt"
 | |
| 	"time"
 | |
| 	"github.com/shopspring/decimal"
 | |
| )
 | |
| 
 | |
| // OptimizedConfig 优化配置结构
 | |
| type OptimizedConfig struct {
 | |
| 	// 锁配置
 | |
| 	LockConfig LockConfig `json:"lock_config"`
 | |
| 	
 | |
| 	// 重试配置
 | |
| 	RetryConfig RetryConfig `json:"retry_config"`
 | |
| 	
 | |
| 	// 熔断器配置
 | |
| 	CircuitBreakerConfig CircuitBreakerConfig `json:"circuit_breaker_config"`
 | |
| 	
 | |
| 	// 同步配置
 | |
| 	SyncConfig SyncConfig `json:"sync_config"`
 | |
| 	
 | |
| 	// 性能配置
 | |
| 	PerformanceConfig PerformanceConfig `json:"performance_config"`
 | |
| 	
 | |
| 	// 监控配置
 | |
| 	MonitorConfig MonitorConfig `json:"monitor_config"`
 | |
| }
 | |
| 
 | |
| // LockConfig 锁配置
 | |
| type LockConfig struct {
 | |
| 	// Redis分布式锁超时时间
 | |
| 	RedisLockTimeout time.Duration `json:"redis_lock_timeout"`
 | |
| 	
 | |
| 	// 获取锁等待时间
 | |
| 	LockWaitTimeout time.Duration `json:"lock_wait_timeout"`
 | |
| 	
 | |
| 	// 订单处理锁前缀
 | |
| 	OrderLockPrefix string `json:"order_lock_prefix"`
 | |
| 	
 | |
| 	// 持仓更新锁前缀
 | |
| 	PositionLockPrefix string `json:"position_lock_prefix"`
 | |
| 	
 | |
| 	// 止盈止损锁前缀
 | |
| 	TakeProfitLockPrefix string `json:"take_profit_lock_prefix"`
 | |
| }
 | |
| 
 | |
| // CircuitBreakerConfig 熔断器配置
 | |
| type CircuitBreakerConfig struct {
 | |
| 	Enabled           bool          `json:"enabled"`
 | |
| 	FailureThreshold  int           `json:"failure_threshold"`
 | |
| 	SuccessThreshold  int           `json:"success_threshold"`
 | |
| 	Timeout           time.Duration `json:"timeout"`
 | |
| 	HalfOpenMaxCalls  int           `json:"half_open_max_calls"`
 | |
| }
 | |
| 
 | |
| // RetryConfig 重试配置
 | |
| type RetryConfig struct {
 | |
| 	// 最大重试次数
 | |
| 	MaxRetries int `json:"max_retries"`
 | |
| 	
 | |
| 	// 重试延迟
 | |
| 	RetryDelay time.Duration `json:"retry_delay"`
 | |
| 	
 | |
| 	// 指数退避因子
 | |
| 	BackoffFactor float64 `json:"backoff_factor"`
 | |
| 	
 | |
| 	// 最大重试延迟
 | |
| 	MaxRetryDelay time.Duration `json:"max_retry_delay"`
 | |
| 	
 | |
| 	// API调用重试次数
 | |
| 	ApiRetryCount int `json:"api_retry_count"`
 | |
| 	
 | |
| 	// 数据库操作重试次数
 | |
| 	DbRetryCount int `json:"db_retry_count"`
 | |
| }
 | |
| 
 | |
| // SyncConfig 同步配置
 | |
| type SyncConfig struct {
 | |
| 	// 持仓同步检查间隔
 | |
| 	PositionSyncInterval time.Duration `json:"position_sync_interval"`
 | |
| 	
 | |
| 	// 持仓差异阈值
 | |
| 	PositionDiffThreshold decimal.Decimal `json:"position_diff_threshold"`
 | |
| 	
 | |
| 	// 强制同步阈值
 | |
| 	ForceSyncThreshold decimal.Decimal `json:"force_sync_threshold"`
 | |
| 	
 | |
| 	// 同步超时时间
 | |
| 	SyncTimeout time.Duration `json:"sync_timeout"`
 | |
| 	
 | |
| 	// 是否启用自动同步
 | |
| 	AutoSyncEnabled bool `json:"auto_sync_enabled"`
 | |
| }
 | |
| 
 | |
| // PerformanceConfig 性能配置
 | |
| type PerformanceConfig struct {
 | |
| 	// 批量操作大小
 | |
| 	BatchSize int `json:"batch_size"`
 | |
| 	
 | |
| 	// 异步处理队列大小
 | |
| 	AsyncQueueSize int `json:"async_queue_size"`
 | |
| 	
 | |
| 	// 工作协程数量
 | |
| 	WorkerCount int `json:"worker_count"`
 | |
| 	
 | |
| 	// 数据库连接池大小
 | |
| 	DbPoolSize int `json:"db_pool_size"`
 | |
| 	
 | |
| 	// 缓存过期时间
 | |
| 	CacheExpiration time.Duration `json:"cache_expiration"`
 | |
| 	
 | |
| 	// 是否启用缓存
 | |
| 	CacheEnabled bool `json:"cache_enabled"`
 | |
| }
 | |
| 
 | |
| // MonitorConfig 监控配置
 | |
| type MonitorConfig struct {
 | |
| 	// 是否启用监控
 | |
| 	Enabled bool `json:"enabled"`
 | |
| 	
 | |
| 	// 监控数据收集间隔
 | |
| 	CollectInterval time.Duration `json:"collect_interval"`
 | |
| 	
 | |
| 	// 告警阈值配置
 | |
| 	AlertThresholds AlertThresholds `json:"alert_thresholds"`
 | |
| 	
 | |
| 	// 日志级别
 | |
| 	LogLevel string `json:"log_level"`
 | |
| 	
 | |
| 	// 是否启用性能分析
 | |
| 	ProfileEnabled bool `json:"profile_enabled"`
 | |
| }
 | |
| 
 | |
| // AlertThresholds 告警阈值配置
 | |
| type AlertThresholds struct {
 | |
| 	// 订单处理失败率阈值 (百分比)
 | |
| 	OrderFailureRate float64 `json:"order_failure_rate"`
 | |
| 	
 | |
| 	// 持仓同步失败率阈值 (百分比)
 | |
| 	PositionSyncFailureRate float64 `json:"position_sync_failure_rate"`
 | |
| 	
 | |
| 	// API调用失败率阈值 (百分比)
 | |
| 	ApiFailureRate float64 `json:"api_failure_rate"`
 | |
| 	
 | |
| 	// 响应时间阈值 (毫秒)
 | |
| 	ResponseTimeThreshold time.Duration `json:"response_time_threshold"`
 | |
| 	
 | |
| 	// 内存使用率阈值 (百分比)
 | |
| 	MemoryUsageThreshold float64 `json:"memory_usage_threshold"`
 | |
| 	
 | |
| 	// CPU使用率阈值 (百分比)
 | |
| 	CpuUsageThreshold float64 `json:"cpu_usage_threshold"`
 | |
| }
 | |
| 
 | |
| // GetDefaultOptimizedConfig 获取默认优化配置
 | |
| func GetDefaultOptimizedConfig() *OptimizedConfig {
 | |
| 	return &OptimizedConfig{
 | |
| 		LockConfig: LockConfig{
 | |
| 			RedisLockTimeout:     30 * time.Second,
 | |
| 			LockWaitTimeout:      5 * time.Second,
 | |
| 			OrderLockPrefix:      "reverse_order_lock:",
 | |
| 			PositionLockPrefix:   "position_update_lock:",
 | |
| 			TakeProfitLockPrefix: "take_profit_lock:",
 | |
| 		},
 | |
| 		RetryConfig: RetryConfig{
 | |
| 			MaxRetries:    3,
 | |
| 			RetryDelay:    time.Second,
 | |
| 			BackoffFactor: 2.0,
 | |
| 			MaxRetryDelay: 10 * time.Second,
 | |
| 			ApiRetryCount: 3,
 | |
| 			DbRetryCount:  3,
 | |
| 		},
 | |
| 		CircuitBreakerConfig: CircuitBreakerConfig{
 | |
| 			Enabled:          true,
 | |
| 			FailureThreshold: 5,
 | |
| 			SuccessThreshold: 3,
 | |
| 			Timeout:          60 * time.Second,
 | |
| 			HalfOpenMaxCalls: 3,
 | |
| 		},
 | |
| 		SyncConfig: SyncConfig{
 | |
| 			PositionSyncInterval:  30 * time.Second,
 | |
| 			PositionDiffThreshold: decimal.NewFromFloat(0.001),
 | |
| 			ForceSyncThreshold:    decimal.NewFromFloat(0.01),
 | |
| 			SyncTimeout:           10 * time.Second,
 | |
| 			AutoSyncEnabled:       true,
 | |
| 		},
 | |
| 		PerformanceConfig: PerformanceConfig{
 | |
| 			BatchSize:       10,
 | |
| 			AsyncQueueSize:  1000,
 | |
| 			WorkerCount:     5,
 | |
| 			DbPoolSize:      20,
 | |
| 			CacheExpiration: 5 * time.Minute,
 | |
| 			CacheEnabled:    true,
 | |
| 		},
 | |
| 		MonitorConfig: MonitorConfig{
 | |
| 			Enabled:         true,
 | |
| 			CollectInterval: time.Minute,
 | |
| 			AlertThresholds: AlertThresholds{
 | |
| 				OrderFailureRate:        5.0,  // 5%
 | |
| 				PositionSyncFailureRate: 2.0,  // 2%
 | |
| 				ApiFailureRate:          10.0, // 10%
 | |
| 				ResponseTimeThreshold:   5 * time.Second,
 | |
| 				MemoryUsageThreshold:    80.0, // 80%
 | |
| 				CpuUsageThreshold:       70.0, // 70%
 | |
| 			},
 | |
| 			LogLevel:       "info",
 | |
| 			ProfileEnabled: false,
 | |
| 		},
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // ValidateConfig 验证配置有效性
 | |
| func (c *OptimizedConfig) ValidateConfig() error {
 | |
| 	// 验证锁配置
 | |
| 	if c.LockConfig.RedisLockTimeout <= 0 {
 | |
| 		return fmt.Errorf("Redis锁超时时间必须大于0")
 | |
| 	}
 | |
| 	if c.LockConfig.LockWaitTimeout <= 0 {
 | |
| 		return fmt.Errorf("锁等待超时时间必须大于0")
 | |
| 	}
 | |
| 
 | |
| 	// 验证重试配置
 | |
| 	if c.RetryConfig.MaxRetries < 0 {
 | |
| 		return fmt.Errorf("最大重试次数不能为负数")
 | |
| 	}
 | |
| 	if c.RetryConfig.RetryDelay <= 0 {
 | |
| 		return fmt.Errorf("重试延迟必须大于0")
 | |
| 	}
 | |
| 	if c.RetryConfig.BackoffFactor <= 1.0 {
 | |
| 		return fmt.Errorf("退避因子必须大于1.0")
 | |
| 	}
 | |
| 
 | |
| 	// 验证同步配置
 | |
| 	if c.SyncConfig.PositionSyncInterval <= 0 {
 | |
| 		return fmt.Errorf("持仓同步间隔必须大于0")
 | |
| 	}
 | |
| 	if c.SyncConfig.PositionDiffThreshold.IsNegative() {
 | |
| 		return fmt.Errorf("持仓差异阈值不能为负数")
 | |
| 	}
 | |
| 
 | |
| 	// 验证性能配置
 | |
| 	if c.PerformanceConfig.BatchSize <= 0 {
 | |
| 		return fmt.Errorf("批量操作大小必须大于0")
 | |
| 	}
 | |
| 	if c.PerformanceConfig.WorkerCount <= 0 {
 | |
| 		return fmt.Errorf("工作协程数量必须大于0")
 | |
| 	}
 | |
| 	if c.PerformanceConfig.DbPoolSize <= 0 {
 | |
| 		return fmt.Errorf("数据库连接池大小必须大于0")
 | |
| 	}
 | |
| 
 | |
| 	// 验证监控配置
 | |
| 	if c.MonitorConfig.Enabled {
 | |
| 		if c.MonitorConfig.CollectInterval <= 0 {
 | |
| 			return fmt.Errorf("监控数据收集间隔必须大于0")
 | |
| 		}
 | |
| 		if c.MonitorConfig.AlertThresholds.OrderFailureRate < 0 || c.MonitorConfig.AlertThresholds.OrderFailureRate > 100 {
 | |
| 			return fmt.Errorf("订单失败率阈值必须在0-100之间")
 | |
| 		}
 | |
| 		if c.MonitorConfig.AlertThresholds.MemoryUsageThreshold < 0 || c.MonitorConfig.AlertThresholds.MemoryUsageThreshold > 100 {
 | |
| 			return fmt.Errorf("内存使用率阈值必须在0-100之间")
 | |
| 		}
 | |
| 		if c.MonitorConfig.AlertThresholds.CpuUsageThreshold < 0 || c.MonitorConfig.AlertThresholds.CpuUsageThreshold > 100 {
 | |
| 			return fmt.Errorf("CPU使用率阈值必须在0-100之间")
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	return nil
 | |
| }
 | |
| 
 | |
| // GetLockKey 生成锁键名
 | |
| func (c *OptimizedConfig) GetLockKey(lockType, identifier string) string {
 | |
| 	switch lockType {
 | |
| 	case "order":
 | |
| 		return c.LockConfig.OrderLockPrefix + identifier
 | |
| 	case "position":
 | |
| 		return c.LockConfig.PositionLockPrefix + identifier
 | |
| 	case "take_profit":
 | |
| 		return c.LockConfig.TakeProfitLockPrefix + identifier
 | |
| 	default:
 | |
| 		return "unknown_lock:" + identifier
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // IsRetryableError 判断错误是否可重试
 | |
| func (c *OptimizedConfig) IsRetryableError(err error) bool {
 | |
| 	if err == nil {
 | |
| 		return false
 | |
| 	}
 | |
| 	
 | |
| 	errStr := err.Error()
 | |
| 	// 定义不可重试的错误类型
 | |
| 	nonRetryableErrors := []string{
 | |
| 		"余额不足",
 | |
| 		"订单重复",
 | |
| 		"API-key",
 | |
| 		"无效",
 | |
| 		"权限",
 | |
| 		"签名",
 | |
| 		"参数错误",
 | |
| 	}
 | |
| 	
 | |
| 	for _, nonRetryable := range nonRetryableErrors {
 | |
| 		if contains(errStr, []string{nonRetryable}) {
 | |
| 			return false
 | |
| 		}
 | |
| 	}
 | |
| 	
 | |
| 	return true
 | |
| }
 | |
| 
 | |
| // GetRetryDelay 计算重试延迟时间
 | |
| func (c *OptimizedConfig) GetRetryDelay(attempt int) time.Duration {
 | |
| 	if attempt <= 0 {
 | |
| 		return c.RetryConfig.RetryDelay
 | |
| 	}
 | |
| 	
 | |
| 	// 指数退避算法
 | |
| 	delay := c.RetryConfig.RetryDelay
 | |
| 	for i := 0; i < attempt; i++ {
 | |
| 		delay = time.Duration(float64(delay) * c.RetryConfig.BackoffFactor)
 | |
| 		if delay > c.RetryConfig.MaxRetryDelay {
 | |
| 			return c.RetryConfig.MaxRetryDelay
 | |
| 		}
 | |
| 	}
 | |
| 	
 | |
| 	return delay
 | |
| }
 | |
| 
 | |
| // ShouldSync 判断是否需要同步持仓
 | |
| func (c *OptimizedConfig) ShouldSync(exchangePosition, systemPosition decimal.Decimal) bool {
 | |
| 	diff := exchangePosition.Sub(systemPosition).Abs()
 | |
| 	return diff.GreaterThan(c.SyncConfig.PositionDiffThreshold)
 | |
| }
 | |
| 
 | |
| // ShouldForceSync 判断是否需要强制同步
 | |
| func (c *OptimizedConfig) ShouldForceSync(exchangePosition, systemPosition decimal.Decimal) bool {
 | |
| 	diff := exchangePosition.Sub(systemPosition).Abs()
 | |
| 	return diff.GreaterThan(c.SyncConfig.ForceSyncThreshold)
 | |
| }
 | |
| 
 | |
| // 全局配置实例
 | |
| var GlobalOptimizedConfig *OptimizedConfig
 | |
| 
 | |
| // InitOptimizedConfig 初始化优化配置
 | |
| func InitOptimizedConfig() error {
 | |
| 	GlobalOptimizedConfig = GetDefaultOptimizedConfig()
 | |
| 	return GlobalOptimizedConfig.ValidateConfig()
 | |
| }
 | |
| 
 | |
| // GetOptimizedConfig 获取全局优化配置
 | |
| func GetOptimizedConfig() *OptimizedConfig {
 | |
| 	if GlobalOptimizedConfig == nil {
 | |
| 		InitOptimizedConfig()
 | |
| 	}
 | |
| 	return GlobalOptimizedConfig
 | |
| } |