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