Bagaimana untuk Merekabentuk Cache Konfigurasi yang Mengendalikan Kemas Kini dan Ralat dengan Anggun?

Mary-Kate Olsen
Lepaskan: 2024-10-25 06:43:02
asal
723 orang telah melayarinya

How to Design a Configuration Cache That Handles Updates and Errors Gracefully?

Muat Konfigurasi Dari Fail dan Muat Semula dengan Kemas Kini Baharu

Pernyataan Masalah:

Kod reka bentuk melibatkan memuatkan konfigurasi daripada fail pada permulaan dan menyegarkannya secara berkala dengan versi yang lebih baharu. Matlamatnya adalah untuk mempunyai mekanisme yang mengendalikan keperluan berikut:

  • Akses serentak kepada konfigurasi
  • Memuat semula perubahan konfigurasi yang dikesan
  • Kebolehaksesan kepada konfigurasi terkini
  • Kebolehcapaian segera kepada konfigurasi terbaharu semasa kemas kini
  • Pemeliharaan konfigurasi sebelumnya jika kemas kini gagal

Reka bentuk awal menggunakan peta serentak untuk menyimpan konfigurasi , tetapi menghadapi isu di mana ralat semasa mengemas kini boleh membawa kepada peta kosong.

Penyelesaian:

Reka bentuk ringkas dicadangkan yang memenuhi semua keperluan:

Struktur CustomerConfig:

Mentakrifkan konfigurasi untuk dicache:

type CustomerConfig struct {
    Data map[string]bool
    LoadedAt time.Time
}
Salin selepas log masuk

Fungsi loadConfig:

Muat konfigurasi daripada fail:

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
}
Salin selepas log masuk

Struktur ConfigCache:

Mengurus caching konfigurasi:

type ConfigCache struct {
    configMu sync.RWMutex
    config   *CustomerConfig
    closeCh  chan struct{}
}
Salin selepas log masuk

Fungsi NewConfigCache:

Mencipta cache konfigurasi baharu:

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
}
Salin selepas log masuk

Fungsi penyegar:

Semak perubahan konfigurasi dan kemas kini cache secara berkala:

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
        }
    }
}
Salin selepas log masuk

Fungsi Berhenti:

Menghentikan goroutine penyegar:

func (cc *ConfigCache) Stop() {
    close(cc.closeCh)
}
Salin selepas log masuk

Fungsi GetConfig:

Akses konfigurasi semasa:

func (cc *ConfigCache) GetConfig() *CustomerConfig {
    cc.configMu.RLock()
    defer cc.configMu.RUnlock()
    return cc.config
}
Salin selepas log masuk

Penggunaan:

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()
Salin selepas log masuk

Penyelesaian ini memastikan:

  • Akses serentak kepada konfigurasi
  • Muat semula pada perubahan yang dikesan
  • Kebolehaksesan kepada konfigurasi terbaharu
  • Kebolehcapaian segera semasa kemas kini
  • Pemeliharaan konfigurasi sebelumnya pada kegagalan kemas kini

Atas ialah kandungan terperinci Bagaimana untuk Merekabentuk Cache Konfigurasi yang Mengendalikan Kemas Kini dan Ralat dengan Anggun?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!