我在Azure中运行了一个带有4个工作器实例的服务。当我扩展到5个工作器实例时,已启动的第一个实例进入“忙”状态。这是为什么?放大期间会发生什么? azure会重新运行所有启动任务吗?我很困惑,似乎无法找到任何关于此的文档。
在扩展到5个实例后,第一个实例将其状态更改为:
Busy (Waiting for role to start... Application startup tasks are running. [2014-08-12T18:36:52Z])
那里运行的java进程停止了。为什么会发生这种情况?!
任何帮助都将不胜感激。
STARTUP.CMD
REM Log the startup date and time.
ECHO Startup.cmd: >> "%TEMP%\StartupLog.txt" 2>&1
ECHO Current date and time: >> "%TEMP%\StartupLog.txt" 2>&1
DATE /T >> "%TEMP%\StartupLog.txt" 2>&1
TIME /T >> "%TEMP%\StartupLog.txt" 2>&1
REM enable ICMP
netsh advfirewall firewall add rule name="ICMPv6 echo" dir=in action=allow enable=yes protocol=icmpv6:128,any
ECHO Starting WebService >> "%TEMP%\StartupLog.txt" 2>&1
tasklist /FI "IMAGENAME eq java.exe" 2>NUL | find /I /N "java.exe" >NUL 2>&1
if "%ERRORLEVEL%"=="0" GOTO running
SET %ERRORLEVEL% = 0
START /B java -jar WEB-SERVICE-1_0--SNAPSHOT.jar app.properties >> "%TEMP%\StartupLog.txt" 2>&1
:running
SET %ERRORLEVEL% = 0
答案 0 :(得分:5)
在扩展操作期间,Azure将通过Changing事件将RoleEnvironmentTopologyChange发送到所有现有实例。这使得这些实例可以发现新的角色实例,以便允许实例之间的通信。请注意,只有在您定义了内部端点时才会发生这种情况(如果您打开RDP然后隐式获取内部端点)。
默认情况下,这些拓扑更改不会影响正在运行的实例。但是,如果您订阅了Changing事件并设置了e.Cancel=True
,则角色实例将重新启动并再次运行您的启动任务。
有关拓扑更改的详细信息,请参阅http://azure.microsoft.com/blog/2011/01/04/responding-to-role-topology-changes/。
所以这里有两个问题:
e.Cancel=true
。答案 1 :(得分:0)
这对于评论来说太长了,只是添加了kwill已经告诉过的内容:
我的ASP.NET Web角色在任何地方都没有e.Cancel = true
但仍然重新启动(或者更确切地说:回收,即使在调用OnStart()
10分钟之前,环境也完全重新初始化,只是在横向扩展之后,比如经过新的部署。所以我继续前进并添加了一个事件处理程序,它只是设置默认值:
public class WebRole : RoleEntryPoint
{
public override bool OnStart()
{
RoleEnvironment.Changing += (sender, e) =>
{
if (e.Changes.Any(change => change is RoleEnvironmentTopologyChange))
{
e.Cancel = false;
}
};
}
}
这有帮助!角色仍然很忙,但只需几秒钟而不是15-20分钟。似乎只有角色中的网站重新启动(或者可能是整个IIS),但角色不会重新启动,整个环境也不会重新初始化。