блокировать маршруты, когда база данных недоступна (изящное «завершение работы») - PullRequest
0 голосов
/ 23 апреля 2020

Я создаю веб-сервер в nodejs, который использует redis, postgresql и mongodb. Я храню все учетные данные в секретном менеджере Google Cloud, поэтому мне нужно использовать асинхронные функции для их получения. Мой код до сих пор:

// Redis.js

const { accessSecretVersion } = require('./google_cloud/secret-manager')

const Redis = require('redis')

// initialize connection (promise because accessSecretVersion is an async function)
const initialize = new Promise(async (resolve, reject) => {
    const redis = Redis.createClient({
        host: await accessSecretVersion('redis_host'),
        port: 6379
    })

    redis.on('error', err => reject(err))

    redis.on('connect', () => resolve(redis))    
}) 

module.exports = {
    initialize
}

// App.js

'use strict'

const express = require('express')

const app = express()

const bodyParser = require('body-parser')

app.use(bodyParser.json())

const Redis = require('./redis')

let redis

// try to initialize a connection
// then => it works!
// catch => it does not work!
Redis.initialize.then(redis => {
    redis = redis
    console.log('redis available')
}).catch(err => console.log(err))

// further on, other stuff rely on 'redis'
// if 'redis' is undefined, they crash, but I want a graceful "shutdown" of the functions

// here, the emitter relies on 'redis'
// the problem is, this code is ran BEFORE the redis connection 
// has established, so it returns an empty
// (when this code runs, 'redis' is still undefined)
const Io = require('./components/socket_io/emitter')(redis)

Как вы можете видеть, в приложении. js, я пытаюсь создать соединение redis. В случае успеха (разрешить в redis. js), «let redis» установлен на соединение redis. Если нет (отклонить), я регистрирую ошибку в консоли.

Проблема в том, что некоторые другие функции этого кода зависят от соединения redis, например socket.io-redis / socket.io-emitter.

Чего я хочу достичь?

Если сервер Redis не работает, я хочу отправить глобальный код состояния 503 (служба недоступна), независимо от того, какой маршрут запрашивается , Сервер не должен создавать sh, но не должен быть доступным, потому что многие функции на моем сервере зависят от данных в базе данных Redis, и без этих данных я не хочу, чтобы люди что-то делали.

Это, вероятно, не лучший подход, который я делаю + это хорошая идея отправить "глобальную" ошибку 503, или лучше проверять каждый отдельный маршрут?

1 Ответ

1 голос
/ 23 апреля 2020

вы не должны делать это на уровне приложения. в идеале он должен обрабатываться вашей инфраструктурой.

на уровне приложения, реализовать маршрут проверки работоспособности и выполнить там логи c. Например: если mysql или redis не работает, верните 500 error. ниже будет отображена эта ошибка, и она прекратит маршрутизацию трафика c к этому экземпляру / серверу / контейнеру.

...