Maison >développement back-end >Golang >Comment gérer les données de configuration client simultanées avec des mises à jour incrémentielles et éviter la perte de données ?
Ce code gère une carte simultanée qui stocke les données pour une configuration client. Lors du démarrage du serveur, il charge les données de fichiers spécifiques dans la carte. Il surveille également les nouveaux fichiers et met à jour la carte avec les données de ces fichiers, effaçant ainsi l'ancien état.
Le problème survient lorsque la méthode de lecture rencontre une erreur. Dans ce cas, la carte entière est effacée, la laissant vide même si les données de configuration précédentes doivent être conservées.
La solution proposée simplifie le processus de gestion des données :
<code class="go">type CustomerConfig struct { Data map[string]bool // Add other properties if needed LoadedAt time.Time } func loadConfig() (*CustomerConfig, error) { cfg := &CustomerConfig{ Data: map[string]bool{}, LoadedAt: time.Now(), } // Implement the file loading logic here // If an error occurs, return it // If successful, return the config return cfg, nil } type ConfigCache struct { configMu sync.RWMutex config *CustomerConfig closeCh chan struct{} } 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 goroutine to refresh config 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: // Implement the logic to detect changes changes := false if !changes { continue } cfg, err := loadConfig() if err != nil { log.Printf("Failed to load config: %v", err) continue } cc.configMu.Lock() cc.config = cfg cc.configMu.Unlock() case <-cc.closeCh: return } } } func (cc *ConfigCache) Stop() { close(cc.closeCh) } func (cc *ConfigCache) GetConfig() *CustomerConfig { cc.configMu.RLock() defer cc.configMu.RUnlock() return cc.config }</code>
<code class="go">// Initialize the cache cc, err := NewConfigCache() if err != nil { // Handle the error } // Get the current configuration when needed cfg := cc.GetConfig() // Remember to stop the cache manager when appropriate cc.Stop()</code>
Cette solution évite le problème de perte de la configuration précédente et simplifie la gestion des mises à jour de configuration.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!