Come devo gestire gli errori del database in un'applicazione web? [duplicare]

1

Sto sviluppando una semplice API RESTful usando il framework Go's Goji (sebbene questa domanda sia indipendente dalla lingua), in cui i parametri dell'URL vengono interrogati su un database PostgreSQL. Ecco come funziona:

Per prima cosa definiamo una struttura che contiene un riferimento al nostro ORM

Questa struttura contiene un metodo Init che ci consente di inizializzare una connessione. Questa struttura contiene altri metodi per gestire le richieste HTTP ed esiste principalmente come mezzo per associare il database al gestore della richiesta.

type Context struct {
    db *gorm.DB
}

func (ctx Context) Init(user string, name string) (Context, error) {
    db, err := gorm.Open(
        "postgres",
        fmt.Sprintf("port=5432 sslmode=require host=domain.xxx"),
    )
    ctx.db = &db
    return ctx, err
}

func (ctx Context) handleGetRequest(c web.C, w http.ResponseWriter, r *http.Request) {
    // ... business logic
}

Questa struttura viene quindi inizializzata exatly una volta all'avvio dell'applicazione Web

Con questa architettura, qualsiasi errore del database implica che l'app Web deve essere riavviata.

func main() {   
    // "Context" is a means of including a DB object with route handlers
    ctx, err := context.Context{}.Init(dbuser, dbname)
    if err != nil {
        panic(err)
    }
    defer ctx.Close()

    // do other stuff, e.g. set up routing and whatnot ...
}

Le mie domande sono le seguenti:

  1. Da un punto di vista dell'architettura software, qual è un approccio ragionevole per gestire con garbo i tempi di inattività del database e riconnettersi automaticamente quando il DB diventa disponibile?
  2. Come posso lavorare con i consigli nella risposta al mio progetto?

tl; dr: qual è lo standard del settore per la gestione degli errori di DB nelle applicazioni Web, dal punto di vista dell'architettura software ?

    
posta blz 25.03.2015 - 16:53
fonte

1 risposta

4

Richiedere il riavvio dell'applicazione quando il database va giù è decisamente un cattivo progetto, perché aumenta lo sforzo di manutenzione che influirà negativamente sul tempo di attività.

Un buon design proverà a riconnettersi al database ogni pochi secondi così che l'attività possa continuare non appena il database sarà nuovamente disponibile.

Nel frattempo, restituire un "Errore interno del server 500" è ragionevole, anche se sarebbe meglio se quelle funzionalità dell'applicazione che non richiedono strettamente il database continuassero a funzionare per evitare di ferire gli utenti nella fiducia nell'affidabilità di il tuo servizio (con la premessa che l'applicazione abbia tali caratteristiche).

    
risposta data 25.03.2015 - 16:59
fonte

Leggi altre domande sui tag