【问题标题】:Azure Worker Role restarted after receiving "changing" + "changed" event on Node.js在 Node.js 上接收到“更改”+“更改”事件后,Azure 辅助角色重新启动
【发布时间】:2014-09-08 03:19:57
【问题描述】:

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

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');
});

应用程序在 Worker Role 上运行良好,没有问题,直到我通过管理门户修改配置。

我通过管理门户更新了配置并单击了保存。不久之后,我在应用程序上同时收到了 changingchanged 事件。但是在收到这些事件 6 分钟后,整个 Worker Role 重新启动,没有任何 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是我的app)

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

所以有几个问题:

  1. 为什么角色在配置更改后会重新启动?
  2. 如何防止角色在配置更改后重新启动?
  3. 当角色因配置更改而重新启动时,为什么没有 stopping 事件?

谢谢!

【问题讨论】:

    标签: node.js azure


    【解决方案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

    【讨论】:

    • 根据roleenvironment.js的源码,我可以在Node.js中设置Cancel属性。查看代码,如果我没有取消changing 事件,它应该触发changed 事件并更新我的配置设置(代码中的currentEnvironmentData)。否则,如果我取消changing 事件,它将回收我的应用程序实例,我认为这意味着离线。对吗?
    • 仅当您部署了一台服务器时
    猜你喜欢
    • 2013-01-06
    • 2013-02-15
    • 2023-04-03
    • 1970-01-01
    • 2018-11-30
    • 2013-08-07
    • 2014-11-05
    • 1970-01-01
    • 2011-10-05
    相关资源
    最近更新 更多