我有一个启动群集工作器实例的中央API服务器。每个实例都有一个特定的较大任务,可能只有我要对该特定实例执行一些操作。我想到的是一个粗略的主意:
每个实例都是一个单独的工作程序进程,我希望我可以将特定工作程序的所有API请求直接委派给工作程序(以在该工作程序中执行功能)。
instance/:id确实表示WorkerID。
客户端可能会请求workerID = x的日志,因此GET/instances/x/logs。
这里的目标是主服务器将实例X的所有请求路由到标识为x的子流程。
这不是为了在实际上是克隆/镜像的工作程序之间进行负载分配。
我的每个 worker 都可能执行一项长期任务(几天,几周,几个月)的变体。方法在所有工作程序之间共享,但是如果我要调用/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进行负载平衡。我无法根据路径将特定的请求路由到特定的工作人员,可以吗?
最佳答案
确实可以做到这一点,但是除非您的instance/:id表示WorkerID,否则您已经走到了尽头。
让我们假设以下示例,其中:id
不是工作程序ID:
W - worker
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 ,上的此路径中,但如果平衡器为您提供 W1 且您使用的是该路线,则会出错,因为fruits
不存在strong_oji_code_AL 最终答案:
您不能要求工作人员弹出并执行您的遗嘱,最好的办法是在主工作人员之间进行某种通信,或者使用一些需要进行某些处理的方法,并根据CPU的使用情况,在服务水平较低的工作人员时触发这些方法。但是请看一看好部分,如果它们死了,则可以
fork
新代码,而不会崩溃整个应用程序。