我正在使用亚马逊提供的Node.JS库来管理EC2和Autosclaing组。我编写了一个删除实例的程序,以便autscaling组创建一个新实例。但在删除任何其他实例之前,我需要确保新的实例是由amazon生成的并且正在运行。为此我需要暂停我的程序并继续检查,直到我得到积极的回应。这就是它的工作原理---
(我通常有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
答案 0 :(得分:1)
你在这里描述的问题是一个'轮询',而谈论'暂停'通常是节点的异步编程模型中的反模式,轮询可能是它有一种情况有效的申请。
但是出于代码可维护性的原因 - 在这种情况下能够稍后添加其他任务(例如其他检查),您还应该异步处理轮询。
以下是一些可以解决您问题的不同方法。
<强> 1 即可。不要在 node.js 中处理问题 - 从主机的 crontab 调用节点应用程序并设计程序退出。这不是节点,但它肯定是强大的解决方案。
2. 使用npm安装节点计时器模块[https://github.com/markussieber/timer]。使用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/]。你可能也有运气。
快乐节点黑客攻击:)
答案 1 :(得分:0)
nodejs没有暂停。你可能正在寻找像eventEmitter这样的东西,所以你可以在发出事件时调用一个函数。 http://nodejs.org/api/events.html
答案 2 :(得分:0)
你永远不应该在节点中暂停。看看async(https://github.com/caolan/async)。您需要的可能是async.forEachSeries(),它允许您以串行方式执行操作,但是不同步。
在你的情况下,它将启动一个服务器,当它启动时,会调用一个回调,使系列继续在下一个服务器上等。
以下是node-levelup https://github.com/rvagg/node-levelup/blob/master/test/benchmarks/index.js#L60-L84
的一些示例代码