파일에서 구성 로드 및 새 업데이트로 새로 고침
문제 설명:
코드 설계에는 시작 시 파일에서 구성을 로드하고 정기적으로 최신 버전으로 새로 고치는 작업이 포함됩니다. 목표는 다음 요구 사항을 처리하는 메커니즘을 갖추는 것입니다.
초기 설계에서는 동시 맵을 활용하여 구성을 저장합니다. , 그러나 업데이트 중 오류로 인해 빈 지도가 발생할 수 있는 문제에 직면합니다.
해결책:
모든 요구 사항을 충족하는 단순화된 설계가 제안됩니다.
CustomerConfig 구조:
캐시할 구성 정의:
type CustomerConfig struct { Data map[string]bool LoadedAt time.Time }
loadConfig 함수:
로드 파일의 구성:
func loadConfig() (*CustomerConfig, error) { cfg := &CustomerConfig{ Data: map[string]bool{}, LoadedAt: time.Now(), } // Logic to load files and populate cfg.Data // If an error occurs, return it // If loading succeeds, return the config return cfg, nil }
ConfigCache 구조:
구성 캐싱 관리:
type ConfigCache struct { configMu sync.RWMutex config *CustomerConfig closeCh chan struct{} }
NewConfigCache 함수:
새 구성 캐시 생성:
func NewConfigCache() (*ConfigCache, error) { cfg, err := loadConfig() if err != nil { return nil, fmt.Errorf("loading initial config failed: %w", err) } cc := &ConfigCache{ config: cfg, closeCh: make(chan struct{}), } // Launch a goroutine to periodically check for changes and load new configs go cc.refresher() return cc, nil }
refresher 기능:
정기적으로 구성 변경 사항을 확인하고 캐시를 업데이트합니다.
func (cc *ConfigCache) refresher() { ticker := time.NewTicker(1 * time.Minute) // Every minute defer ticker.Stop() for { select { case <-ticker.C: // Check for changes changes := false // Logic to detect changes if !changes { continue // No changes, continue } // Changes! Load new config: cfg, err := loadConfig() if err != nil { log.Printf("Failed to load config: %v", err) continue // Keep the previous config } // Apply / store new config cc.configMu.Lock() cc.config = cfg cc.configMu.Unlock() case <-cc.closeCh: return } } }
중지 기능:
새로 고침 고루틴 중지:
func (cc *ConfigCache) Stop() { close(cc.closeCh) }
GetConfig 함수:
현재 구성에 액세스:
func (cc *ConfigCache) GetConfig() *CustomerConfig { cc.configMu.RLock() defer cc.configMu.RUnlock() return cc.config }
사용:
cc, err := NewConfigCache() if err != nil { // Handle the error appropriately } // Access the configuration whenever needed: cfg := cc.GetConfig() // Use the configuration here // Stop the cache refreshing when necessary: cc.Stop()
이 솔루션은 다음을 보장합니다.
위 내용은 업데이트와 오류를 적절하게 처리하는 구성 캐시를 설계하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!