在Node.js上收到“更改”+“已更改”事件后,Azure Worker角色重新启动

时间:2014-09-08 03:19:57

标签: node.js azure

我正在使用azure-sdk-for-node包在Azure Worker Role中运行一个简单的Node.js应用。

var azure = require('azure'),
    http = require('http'),
    winston = require('winston'),
    logger = new (winston.Logger)({
        transports: [ new (winston.transports.File)({ filename: 'C:\\log.txt' }) ]
    }),

http.createServer(function (req, res) {
    res.writeHead(200);
    res.end('Hello, World!');
}).listen(process.env.port || 1337);

azure.RoleEnvironment.on('changing', function (changes) {
    winston.info('changing', changes);

    // Got configuration changes here
    // {
    //   "changes": [
    //     {
    //       "type": "ConfigurationSettingChange",
    //       "name": "MyApp.Settings1"
    //     },
    //     {
    //       "type": "ConfigurationSettingChange",
    //       "name": "Microsoft.WindowsAzure.Plugins.RemoteAccess.AccountExpiration"
    //     }
    //   ]
    // }
});

azure.RoleEnvironment.on('changed', function () {
    // Also got this event
    winston.info('changing');
});

azure.RoleEnvironment.on('stopping', function () {
    // Never fired
    winston.info('stopping');
});

应用程序在工作者角色上正常运行,没有问题,直到我通过管理门户修改配置。

我通过管理门户更新了配置,然后点击了保存。不久之后,我在应用上获得了changingchanged个事件。但是在收到这些事件后6分钟,整个工作者角色在没有任何stopping事件的情况下重新启动。我使用包winston登录到C:\,日志通过重启保持不变。

日志显示如下:

00:00 setup_worker.cmd
00:01 server.js with PID 1
00:06 "role changing"
00:06 "role changed"
00:12 setup_worker.cmd
00:13 server.js with PID 2

(注意:setup_worker.cmd是CSDEF中的启动脚本,server.js是我的应用程序)

虽然配置更改后没有stopping个事件,但如果我通过管理门户手动重启实例,则会收到stopping事件。

所以问题很少:

  1. 为什么在配置更改后重新启动角色?
  2. 如何防止角色在配置更改后重新启动?
  3. 为什么在通过配置更改重新启动角色时没有stopping个事件?
  4. 谢谢!

1 个答案:

答案 0 :(得分:1)

  1. Azure假定您希望在配置更改后重新启动服务器,以便新设置可以正常生效。它不知道您是在运行期间还是仅在启动时继续读取配置设置。它还假设您的角色中部署了2台以上的服务器,并且一次重启一台服务器不会损害您的网站

  2. 所以,我不熟悉node.js,但是,在.NET中我们可以监视RoleEnvironment.Changing事件,捕获它并忽略它上面的重启。请查看此文章:http://msdn.microsoft.com/en-us/library/microsoft.windowsazure.serviceruntime.roleenvironment.changing.aspx在捕获更改事件后,您是否可以执行与您的函数委托类似的操作?

  3. 我认为停止事件仅适用于关闭/停止角色的情况。 http://msdn.microsoft.com/en-us/library/microsoft.windowsazure.serviceruntime.roleenvironment.stopping.aspx