Балансировка нагрузки с помощью Statefull сессий

Мое приложение в настоящее время развернуто в нескольких экземплярах, и распределение нагрузки выполняется с помощью обратного прокси-сервера NginX.

Проблема в том, что какой-то запрос к серверу может быть очень дорогим. Иногда один узел перегружен, и каждый невезучий пользователь (направленный балансировщиком нагрузки на этот узел) будет испытывать очень малое время отклика.

Вторая проблема - это программное обеспечение, написанное с Opa-фреймворком с statefull сессиями Все запросы от пользователя (включая AJAX и встроенную в фреймворк реализацию сервера) должны соответствовать одному и тому же узлу.

Ни балансировка нагрузки на основе хеширования IP (как NginX с опцией ip_hash), ни циклический перебор не является решением:(

Я хочу попробовать Node's Cluster, который не выполняет балансировку нагрузки циклически, но полагается на операционную систему, чтобы выбрать менее загруженный процесс для нового запроса. К сожалению, похоже на циклический перебор не поддерживает липкие сессии.

Моя идея состоит в том, чтобы использовать Cluster для выбора менее загруженного процесса, прослушивая общий порт и перенаправляя на "частный" URL - различный для каждого процесса. Обратный прокси-сервер может переводить виртуальные домены на основе имен www1.mysite, www2.mysite... в mysite:8001, mysite:8002 и т. д. Таким образом, как только первый контакт установлен, браузер останется с назначенным узлом.

Код Node.js работника кластера:

var cluster = require('cluster');
var http = require('http');
var url = require('url');
var master_port = 8000;
var worker_port = master_port + cluster.worker.id;
http.createServer(function(req, res) {
  res.writeHead(200);
  res.end('Hello ' + cluster.worker.id);
}).listen(worker_port);
http.createServer(function(req, res) {
  res.writeHead(302, {
    'Location': '//mysite:' + worker_port + url.parse(req.url).pathname
  });
  res.end("Redirecting to worker " + cluster.worker.id);
}).listen(master_port);

Этот подход требует много изменений в приложении, потому что я должен убедиться, что все статические ресурсы являются полностью определенными URL-адресами (включая имя сервера) для кэширования. NginX должен быть перенастроен специально для этого приложения, поэтому статические файлы будут перенаправлены с "частных" имен хостов / портов и будут видны в единственном экземпляре. Дополнительное перенаправление также может увеличить время отклика для загрузки страницы.

Есть ли лучший подход для "липких уловок" с кластером? Или, может быть, NginX может каким-то образом перенаправить на выбранный ранее узел на основе какого-либо cookie или другого HTTP-заголовка? Кто-нибудь уже решил эту проблему раньше?

0 ответов

Другие вопросы по тегам