NodeJS Express-将特定的路由发送到特定的群集工作程序?

时间:2018-10-12 13:09:38

标签: node.js express node-cluster

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

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

每个实例都是一个单独的工作程序进程,我希望可以将特定工作程序的所有API请求直接委派给工作程序(以在该工作程序中执行功能)。

instance /:id确实表示WorkerID。

客户端可能会请求workerID = x的日志,因此GET / instances / x / logs。

此处的目标是主服务器将实例X的所有请求路由到标识为x的子流程。

这不是为了在实际上是克隆/镜像的工作程序之间分配负载。

我的每个工人可能正在执行一项长期任务(几天,几周,几个月)的变体。方法在所有工作程序之间共享,但是如果我调用/ instances / x / logs,我只想在该特定工作程序进程上查询该方法。这就是我要找出的目标。

    viewHolder.item.setOnClickListener(new View.OnClickListener() {
       @Override
       public void onClick(View v) {
          //Create Dialog on click
          myDialog = new Dialog(mContext);
           myDialog.setContentView(R.layout.choose_location);
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
              myDialog.create();
            }

我看到我可以在不同进程的同一个端口上有多个Express侦听器,但是如果我理解正确的话,这会自动通过Express进行负载平衡。我无法根据路径将特定的请求路由到特定的工作人员,可以吗?

1 个答案:

答案 0 :(得分:1)

  

每个实例都是一个单独的工作程序进程,我希望可以将特定工作程序的所有API请求直接委派给工作程序(以在该工作程序中执行功能)。

确实可以这样做,但是除非您的instance /:id代表WorkerID,否则您已经走到了尽头。

让我们假设以下示例中:id不是工作者ID:

W -工人

W1 /instances/1/:method-具有以下方法namescitiescars

W2 /instances/2/:method-具有以下方法namesfruitsstats

HTTP客户端将要访问:

  1. GET /instances/1/name,太好了,两条路径中都存在name。 - TRUE
  2. GET /instances/2/fruits,太好了,fruits存在于 W2 上,如果平衡器为您提供 W1 使用该路线,您会出错,因为 W1 - FALSE
  3. 上不存在fruits

最终答案

您不能要求工作人员弹出并履行您的意愿,最好的办法是在主工作人员之间进行某种通信,或者使用一些需要进行某些处理的方法,并根据CPU的使用情况,在工作人员较少时触发这些方法被送达。但是请看一看,如果它们死了,那么您可以fork新建一个,而不会崩溃整个应用程序。