Виртуальные машины Azure неожиданно перезагружаются
Эта проблема связана с рабочей ролью размещенной виртуальной машины. У меня есть простая рабочая роль, которая охватывает процесс внутри нее. Возникший процесс - это 32-битное скомпилированное приложение TCPServer. В рабочей роли определена конечная точка, а TCP-сервер привязан к конечной точке рабочей роли. Поэтому, когда я подключаюсь к своей конечной точке рабочей роли и отправляю что-то, TCPserver получает это, обрабатывает и возвращает что-то обратно. Так что здесь конечная точка рабочей роли, которая выставлена внешнему миру, внутренне подключается к TCPserver.
string port = RoleEnvironment.CurrentRoleInstance.InstanceEndpoints[""TCPsocket].IPEndpoint.Port.ToString();
var myProcess = new Process()
{
StartInfo = new ProcessStartInfo(Path.Combine(localstorage.RootPath, "TCPServer.exe"))
{
CreateNoWindow = true,
UseShellExecute = true,
WorkingDirectory = localstorage.RootPath,
Arguments = port
}
};
Работало нормально. Но вдруг Север перестал отвечать. Когда я зарегистрировался на портале, роль виртуальной машины автоматически перезапускалась. Но это никогда не удавалось. Показывал Role Initializing..
статус. Ручная остановка и запуск также не работают. Я повторно развернул тот же пакет без каких-либо изменений в коде. На этот раз само развертывание не удалось.
Warning: All role instances have stopped
- There was no endpoint listening at https://management.core.windows.net/<SubscriptionID>/services/hostedservices/TCPServer/deploymentslots/Production that could accept the message. This is often caused by an incorrect address or SOAP action. See InnerException, if present, for more details.
Но через некоторое время я снова попытался развернуть, все заработало нормально. Может кто-нибудь сказать мне, в чем будет проблема?
Обновить:
public override void Run()
{
Trace.WriteLine("RasterWorker entry point called", "Information");
string configVal = RoleEnvironment.GetConfigurationSettingValue("Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString");
CloudStorageAccount _storageAccount = null;
_storageAccount = CloudStorageAccount.Parse(configVal); // accepts storage cridentials and create storage account
var localstorage = RoleEnvironment.GetLocalResource("MyLocalStorage");
CloudBlobClient _blobClient = _storageAccount.CreateCloudBlobClient();
bool flag = false;
while (true)
{
Thread.Sleep(30000);
if (!flag)
{
if (File.Exists(Path.Combine(localstorage.RootPath, "test.ppm")))
{
CloudBlobContainer _blobContainer = _blobClient.GetContainerReference("reports");
CloudBlob _blob = _blobContainer.GetBlobReference("test.ppm");
_blob.UploadFile(Path.Combine(localstorage.RootPath, "test.ppm"));
Trace.WriteLine("Copy to blob done!!!!!!!", "Information");
flag = true;
}
else
{
Trace.WriteLine("Copy Failed-> File doesnt exist!!!!!!!", "Information");
}
}
Trace.WriteLine("Working", "Information");
}
}
1 ответ
Чтобы предотвратить перезапуск рабочей роли, вам необходимо заблокировать метод Run вашего класса точки входа.
Если вы переопределите метод Run, ваш код должен блокироваться на неопределенный срок. Если метод Run возвращается, роль автоматически перезапускается, вызывая событие Stopping и вызывая метод OnStop, чтобы ваши последовательности завершения работы могли быть выполнены до того, как роль переведена в автономный режим.
Вы должны убедиться, что, что бы ни случилось, вы никогда не вернетесь из метода Run, если хотите сохранить роль.
Теперь, если вы размещаете TCPServer в консольном приложении (я предполагаю, что вы делаете это, поскольку вы вставили код Process.Start), вам необходимо заблокировать метод Run после запуска процесса.
public override void Run()
{
try
{
Trace.WriteLine("WorkerRole entrypoint called", "Information");
var myProcess = new Process()
{
StartInfo = new ProcessStartInfo(Path.Combine(localstorage.RootPath, "TCPServer.exe"))
{
CreateNoWindow = true,
UseShellExecute = true,
WorkingDirectory = localstorage.RootPath,
Arguments = port
}
};
myProcess.Start();
while (true)
{
Thread.Sleep(10000);
Trace.WriteLine("Working", "Information");
}
// Add code here that runs in the role instance
}
catch (Exception e)
{
Trace.WriteLine("Exception during Run: " + e.ToString());
// Take other action as needed.
}
}
PS: Это не имеет ничего общего с вашей проблемой развертывания, я полагаю, это было совпадением