web-dev-qa-db-ja.com

Webアプリケーションでデータベース障害を処理するにはどうすればよいですか?

GoのGojiフレームワークを使用して単純なRESTfulAPIを開発しています(この質問は言語に依存しませんが)。このフレームワークでは、URLのパラメーターがPostgreSQLデータベースに対して照会されます。仕組みは次のとおりです。

最初に、ORMへの参照を保持する構造体を定義します

この構造体には、接続を初期化できるInitメソッドが含まれています。この構造体には、HTTP要求を処理する他のメソッドが含まれており、主にデータベースを要求ハンドラに関連付ける手段として存在します。

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
}

この構造は、Webアプリケーションの起動時に一度だけ正確に初期化されます

このアーキテクチャでは、データベースに障害が発生すると、Webアプリを再起動する必要があります。

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

私の質問は次のとおりです:

  1. ソフトウェアアーキテクチャの観点から、データベースのダウンタイムを適切に処理し、DBが利用可能になったときに自動的に再接続するための適切なアプローチは何ですか?
  2. this の推奨事項を設計に反映するにはどうすればよいですか?

tl; dr:ソフトウェアアーキテクチャの観点からWebアプリケーション内でDB障害を処理するための業界標準は何ですか

2
blz

データベースがダウンしたときにアプリケーションの再起動を要求することは間違いなく悪い設計です。それは、稼働時間に悪影響を与えるメンテナンス作業を増加させるためです。

優れた設計では、データベースが再び利用可能になるとすぐにビジネスを継続できるように、数秒ごとにデータベースに再接続しようとします。

それまでの間、「500内部サーバーエラー」を返すことは妥当ですが、データベースを厳密に必要としないアプリケーションの機能がサービスの信頼性に対するユーザーの信頼を損なうことを回避するために機能する場合はより良いでしょう(アプリケーションにそのような機能があることを前提としています)。

4
Philipp