Добрый день,
у меня вызывает затруднение реализация подключения ко множеству серверов.
Код следующий:
Я запрашиваю у одной БД список серверов, и к каждому из серверов я подключаюсь, и спрашиваю список находящихся на них баз данных. Серверов около 400, и полюбому кто то из них или отвечает с ошибкой таймаут, или с ошибкой аутентифициации.
Реализуется это всё через ORM Sequelize, что обязывает далее обрабатывать через .then, а значит через promise.
Подключения к отдельным серверам вложено в другой промис, поэтому при ошибке одного из них, блокирует продолжение, и в итоге внешний промис никогда не заканчивается успешно.
Можете ли подсказать, как можно избежать этого ? Вроде как и промис, а вроде как и всегда отвечает позитивно...
Быть может я ещё плохо понял query в Sequelize... надеюсь что правильно, -
docs.sequelizejs.com/en/latest/docs/raw-queries
В данном случае я не получаю списка баз данных в обработчик, через resolve(databases), хотя список кластеров спокойно выводится.
dbAudit.getAllServers = function() {
return new Promise(function(resolve, reject) {
//get all clusters
dbAudit.query(
'SELECT '
+ '"FSDN" AS host, '
+ '"Listen_Port" AS port, '
+ '"Instance" AS "clusterName", '
+ '"Version" AS version '
+'FROM "COLLECTE_POSTGRES"'
).then(function(clusters) {
// resolve(clusters); а вот тут, кластеры я получаю!
var promises = clusters.forEach(function(cluster) {
var remote = new Sequelize('postgres', collector.user, collector.password, {host: cluster.host, port: cluster.port, dialect: 'postgres', logging: false});
remote.query("SELECT datname FROM pg_catalog.pg_database WHERE datname NOT IN ('template0','template1','postgres','repmgr')")
.then(function(databases) {
resolve(databases);
}, reject)
})
},reject);
//regroup clusters by server
})
};