NodeJS Express - отправлять конкретные маршруты конкретным работникам кластера? - PullRequest
0 голосов
/ 12 октября 2018

У меня есть центральный сервер API, запускающий экземпляры рабочих кластера.У каждого экземпляра есть определенная большая работа, и могут быть манипуляции, которые я хочу сделать только на этом конкретном экземпляре.Это была грубая идея, которую я имел в виду:

  • Сервер API с экспресс-мастером
    • экземпляр 1: GET / instances / 1 / *
    • экземпляр 2: GET / instances / 2 / *

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

instance /: id действительно представляет WorkerID.

Клиент может запросить журналы, где workerID = x, поэтому GET / instances / x / logs.

Цель в том, чтобы мастер направил все запросы для экземпляра X в подпроцесс, обозначенный как x.

Это не для распределения нагрузки между рабочими, которые по сути являются клонами / зеркалами.

Каждый из моих работников может выполнять различные задачи, выполняемые долго (дни, недели, месяцы).Методы являются общими для всех работников, но если я вызываю / instances / x / logs, я хочу запросить это только в этом конкретном рабочем процессе.Это цель, которую я хочу выяснить.

// route these to subprocess x
GET /instances/x/logs
POST /instances/x/settings

// route these to subprocess y
GET /instances/y/logs
POST /instances/y/settings

// route these to subprocess z
GET /instances/z/logs
POST /instances/z/settings

// make a new worker process, returns worker ID as reference
POST /instances/

Я видел, что у меня может быть несколько экспресс-слушателей на одном и том же порту для разных процессов, но если я правильно понял, это автоматически компенсирует нагрузку с помощью экспресс,Я не могу направить конкретные запросы конкретным работникам в зависимости от пути, могу ли я?

1 Ответ

0 голосов
/ 12 октября 2018

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

Действительно, вы можете сделать это, но если ваш экземпляр /: id не представляет WorkerID, вы достигли конца.

Давайте предположим следующий пример, где :id не является идентификатором работника:

Ш - Рабочий

Ш1 /instances/1/:method - имеет следующие методы names, cities, cars

W2 /instances/2/:method - имеет следующие методы names, fruits, stats

HTTP-клиент захочет получить доступ:

  1. GET /instances/1/nameОтлично, name существует в обоих направлениях.- TRUE
  2. GET /instances/2/fruits, это замечательно, fruits существует на этом пути в W2 , НО , если вам подходит балансировщик W1 с этим маршрутом у вас будет ошибка, потому что fruits не существует на W1 - FALSE

Окончательный ответ :

Вы не можете попросить работников всплыть и выполнить свою волю. Лучшее, что вы можете сделать, - это какое-то общение между мастером и работниками или какие-то методы, которые требуют некоторой обработки и основанные наиспользование процессора, запуск этих методов, когда обслуживается низкий работник.Но обратите внимание на хорошие стороны, если они умрут, вы можете fork новые, не разбивая все ваше приложение.

...