0

我正在使用 Amazon 提供的 Node.JS 库来管理 EC2 和 Autosclaing 组。我编写了一个程序来删除一个实例,以便自动缩放组将创建一个新实例。但在我删除任何其他实例之前,我需要确保新实例是由亚马逊生成并正在运行。为此,我需要暂停我的程序并继续检查,直到我得到积极的回应。所以这就是它的工作原理——

(我通常有 3-4 个实例,必须用 3-4 个新类型的实例替换。)

所以我的程序是——

 updateServer(){
      Which has the code to retrieve the instances from the server.
      foreach(instance in the list of instances){
           replace(); (with new one.)
      }
 }

replace() {
   delete the old one.
   while(new instance is not generated) {
      check();
   }
}

check(){
  return the status.
}

现在的问题是我需要按顺序发生。如何暂停程序?因为在我的情况下,foreach 循环执行并且程序结束并且它没有进入该检查循环。你能给我一些想法吗?

谢谢

链接——http: //docs.aws.amazon.com/AWSJavaScriptSDK/latest/frames.html

4

3 回答 3

1

您在这里描述的问题是一个“轮询”,而“暂停”通常是节点异步编程模型中的一种反模式,轮询可能是它具有有效应用程序的一种情况。

然而,出于代码可维护性的原因 - 在这种情况下,以后可以添加其他任务(例如其他检查),您还应该异步处理轮询。

这里有一些不同的方法可以解决您的问题。

1 . 根本不要处理node.js中的问题 - 从主机的crontab调用 node 应用程序并设计程序退出。虽然这不是非常节点化,但它肯定是强大的解决方案。

2.使用npm安装节点定时器模块[https://github.com/markussieber/timer]。使用计时器,您可以将 check() 函数作为参数传递,因此它会定期回调它。这比较棘手,但可以扩展,因为您可以运行大量检查,这对于可扩展的 EC2 部署可能是需要的。

timer = require('timer');   //import the time module    
function check(){           //check function now polls
    //add an if(something==true) statement here to allow you to exit if necessary
    console.log("Checking stuff");
    timer.timer(200, check); //calls this function repeatedly every 200ms
}

check(); //starts the code polling

3.话虽如此,在我看来,您尝试实现的功能与 Amazon Autoscaling [http://aws.amazon.com/autoscaling/] 和 Amazon Elastic Beanstalk [http:// aws.amazon.com/elasticbeanstalk/]。你可能也有一些运气。

快乐的节点黑客 :)

于 2013-07-23T11:23:01.663 回答
0

你永远不应该在 node.js 中暂停。看看异步(https://github.com/caolan/async)。您需要的可能是 async.forEachSeries(),它允许您按顺序执行操作,但异步执行。

在您的情况下,它将启动一个服务器,并在启动时调用一个回调,使该系列在下一个服务器上继续等。

这是来自节点级别的一些示例代码https://github.com/rvagg/node-levelup/blob/master/test/benchmarks/index.js#L60-L84

于 2013-07-23T02:52:44.043 回答
0

nodejs 不会暂停,真的。您可能正在寻找类似 eventEmitter 的东西,因此您可以在发出事件时调用函数。 http://nodejs.org/api/events.html

于 2013-07-23T00:45:47.320 回答