NodeJS Express - 将特定路由发送给特定的集群工作人员?
NodeJS Express - Send specific routes to specific cluster workers?
我有一个中央 API 服务器启动集群工作实例。每个实例都有一个特定的更大的工作,并且我可能只想对该特定实例进行一些操作。这是我的粗略想法:
- API 具有快速主进程的服务器
- 实例 1:获取 /instances/1/*
- 实例2:获取/instances/2/*
每个实例都是一个单独的工作进程,我希望我可以将特定工作人员的所有 API 请求直接委托给工作人员(以在该工作人员中执行功能)。
instance/:id 代表 WorkerID。
客户端可能会请求 workerID = x 的日志,因此 GET /instances/x/logs。
这里的目标是 master 将实例 X 的所有请求路由到标识为 x 的子进程。
这不适用于本质上 clones/mirrors 的工作人员之间的负载分配。
我的每个工人可能都在执行一项长期 运行 任务(数天、数周、数月)的变体。方法在所有工作人员之间共享,但如果我调用 /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/
我看到我可以在不同进程的同一个端口上有多个 express 侦听器,但如果我理解正确的话,express 会自动进行负载平衡。我不能根据路径将特定请求路由到特定工作人员,可以吗?
Each instance is a separate worker process, and I was hoping I could delegate all API requests for specific worker, directly to the worker (to execute functions in that worker).
您确实可以这样做,但除非您的实例/:id 代表 WorkerID,否则您就完蛋了。
让我们假设以下示例,其中 :id
不是工人 ID:
W - 工人
W1/instances/1/:method
- 有以下方法 names
, cities
, cars
W2/instances/2/:method
- 有以下方法 names
, fruits
, stats
HTTP 客户端将要访问:
GET /instances/1/name
,太好了,name
存在于两条路径中。 - 真
GET /instances/2/fruits
,很好,fruits
存在于 W2 上的这条路径中,BUT 如果平衡器用那条路线为你服务 W1 你会遇到错误,因为 W1 上不存在 fruits
- 假
最终答案:
你不能要求worker弹出来服务你的意志,你能做的最好是master和worker之间的一些沟通或者有一些方法需要一些处理,并且根据CPU的用法,触发服务于低级工人时的那些方法。但是看看好的部分,如果它们死了,你可以 fork
新的而不会使你的整个应用程序崩溃。
我有一个中央 API 服务器启动集群工作实例。每个实例都有一个特定的更大的工作,并且我可能只想对该特定实例进行一些操作。这是我的粗略想法:
- API 具有快速主进程的服务器
- 实例 1:获取 /instances/1/*
- 实例2:获取/instances/2/*
每个实例都是一个单独的工作进程,我希望我可以将特定工作人员的所有 API 请求直接委托给工作人员(以在该工作人员中执行功能)。
instance/:id 代表 WorkerID。
客户端可能会请求 workerID = x 的日志,因此 GET /instances/x/logs。
这里的目标是 master 将实例 X 的所有请求路由到标识为 x 的子进程。
这不适用于本质上 clones/mirrors 的工作人员之间的负载分配。
我的每个工人可能都在执行一项长期 运行 任务(数天、数周、数月)的变体。方法在所有工作人员之间共享,但如果我调用 /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/
我看到我可以在不同进程的同一个端口上有多个 express 侦听器,但如果我理解正确的话,express 会自动进行负载平衡。我不能根据路径将特定请求路由到特定工作人员,可以吗?
Each instance is a separate worker process, and I was hoping I could delegate all API requests for specific worker, directly to the worker (to execute functions in that worker).
您确实可以这样做,但除非您的实例/:id 代表 WorkerID,否则您就完蛋了。
让我们假设以下示例,其中 :id
不是工人 ID:
W - 工人
W1/instances/1/:method
- 有以下方法 names
, cities
, cars
W2/instances/2/:method
- 有以下方法 names
, fruits
, stats
HTTP 客户端将要访问:
GET /instances/1/name
,太好了,name
存在于两条路径中。 - 真GET /instances/2/fruits
,很好,fruits
存在于 W2 上的这条路径中,BUT 如果平衡器用那条路线为你服务 W1 你会遇到错误,因为 W1 上不存在fruits
- 假
最终答案:
你不能要求worker弹出来服务你的意志,你能做的最好是master和worker之间的一些沟通或者有一些方法需要一些处理,并且根据CPU的用法,触发服务于低级工人时的那些方法。但是看看好的部分,如果它们死了,你可以 fork
新的而不会使你的整个应用程序崩溃。