我有一个启动群集工作器实例的中央API服务器。每个实例都有一个特定的较大任务,可能只有我要对该特定实例执行一些操作。我想到的是一个粗略的主意:

  • API服务器,具有快速,主流程
  • 实例1:GET/instances/1/*
  • 实例2:GET/instances/2/*

  • 每个实例都是一个单独的工作程序进程,我希望我可以将特定工作程序的所有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-具有以下方法namescitiescars
    W2 /instances/2/:method-具有以下方法namesfruitsstats
    HTTP客户端将要访问:

  • GET /instances/1/name,太好了,这两个路径中都存在name。 -
  • GET /instances/2/fruits,太好了,fruits存在于 W2 上的此路径中,但如果平衡器为您提供 W1 且您使用的是该路线,则会出错,因为fruits不存在strong_oji_code_AL

  • 最终答案:

    您不能要求工作人员弹出并执行您的遗嘱,最好的办法是在主工作人员之间进行某种通信,或者使用一些需要进行某些处理的方法,并根据CPU的使用情况,在服务水平较低的工作人员时触发这些方法。但是请看一看好部分,如果它们死了,则可以fork新代码,而不会崩溃整个应用程序。

    10-06 15:50
    查看更多