ファイルから設定をロードし、新しい更新で更新
問題ステートメント:
コード設計には、起動時にファイルから構成をロードし、新しいバージョンで定期的に更新することが含まれます。目的は、次の要件を処理するメカニズムを用意することです:
初期設計では同時マップを利用して構成を保存しかし、更新中にエラーが発生して空のマップが表示される可能性があるという問題に直面しています。
解決策:
すべての要件に対処する簡素化された設計が提案されています:
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 }
リフレッシュ機能:
構成の変更を定期的にチェックし、キャッシュを更新します:
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 中国語 Web サイトの他の関連記事を参照してください。