Maison  >  Article  >  développement back-end  >  Comment gérer les données de configuration client simultanées avec des mises à jour incrémentielles et éviter la perte de données ?

Comment gérer les données de configuration client simultanées avec des mises à jour incrémentielles et éviter la perte de données ?

DDD
DDDoriginal
2024-10-25 15:32:04545parcourir

How to Manage Concurrent Customer Configuration Data with Incremental Updates and Avoid Data Loss?

Charger les données initiales et traiter les mises à jour à partir de fichiers incrémentiels

Énoncé du problème

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.

Solution

La solution proposée simplifie le processus de gestion des données :

  • Créer une structure CustomerConfig : Cette structure contient les données à mettre en cache sous forme d'"instantané".
  • Définir une fonction loadConfig : Cette fonction charge le configuration à partir des fichiers souhaités.
  • Établir une structure ConfigCache : Ce gestionnaire de cache stocke la configuration actuelle et y donne accès. Il garantit un accès simultané sécurisé et a la capacité d'actualiser la configuration mise en cache.
  • Implémentez une fonction Refresher() : Cette goroutine vérifie périodiquement les modifications et charge de nouvelles configurations si elle est détectée. Il respecte closeCh pour s'arrêter si demandé.
  • Implémentez une méthode GetConfig() : Cette méthode fournit un accès en lecture seule à la configuration actuelle.

Détails de l'implémentation

<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>

Utilisation

<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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn