2015-04-21 3 views
4

Я изучаю реструктуризацию приложения, над которым я работаю, чтобы найти способ сократить расходы и предоставить нам гораздо больше возможностей для масштабируемости. По сути, приложение в настоящее время размещено на Azure как одно крупное веб-приложение, в которое пользователи могут войти в систему, выполнить некоторые вычислительно дорогостоящие работы с данными, хранящимися в памяти в веб-приложении, а затем, в конечном итоге, выйти из системы.Управлять масштабированием роли рабочего программного обеспечения

При изучении другого способа масштабирования одной из идей было использование рабочих ролей. Вместо того, чтобы обрабатывать веб-приложение, которое в настоящее время требует от нас использования довольно дорогого уровня цен, мы могли бы использовать служебную шину для передачи сообщений с соответствующими данными экземпляру рабочей роли, который бы выполнял эту обработку и отправлял результаты ,

Самый эффективный способ сделать это, похоже, - создать небольшой экземпляр роли рабочего для каждого пользователя, который будет работать в сети, что будет касаться исключительно их запросов (используя, например, очередь с именем после идентификатора пользователя), а затем будет уничтожен при завершении сеанса пользователя.

У меня есть код, чтобы определить, когда нужно развернуть экземпляр, как передавать эти сообщения взад и вперед и когда закрыть экземпляр, но мне трудно найти документацию для любых методов или вызовов API, которые позволят я делаю это легко. Самое близкое, что я могу найти для удаления экземпляра, описано here, но я не могу найти что-либо для их создания.

Каков наилучший способ вращения экземпляров вверх и вниз по Azure? Какие альтернативы доступны мне? Я также рад услышать альтернативные предложения о том, как это сделать.

ответ

4

Наиболее экономически эффективный способ сделать это, кажется, было бы создать небольшой экземпляр Worker роли для каждого пользователя, который входит в систему, которая бы заниматься исключительно своими запросами (с использованием, например, , a очередь, названная в честь идентификатора пользователя), а затем уничтожается, когда заканчивается сеанс пользователя .

Я бы не рекомендовал этот подход. Вот мои причины:

  • Количество ядер виртуальной машины ограничены в подписке. Представьте сценарий, в который вы входите 1000 пользователей. Azure может не разрешить создание 1000 экземпляров рабочей роли. Для этого вам потребуется специальное разрешение от Microsoft.
  • Спиннинг виртуальной машины занимает время. Когда вы создаете новое развертывание рабочей роли для своего пользователя, это не мгновенно. В зависимости от сложности вашей роли может потребоваться от 5 до 10 минут, чтобы запустить новый экземпляр рабочей роли.
  • Это не эффективный подход. Основная идея состоит в том, чтобы создать новый экземпляр рабочей роли, когда пользователь входит в систему, основан на предположении, что пользователь выполнит некоторую вычислительную задачу. Что делать, если пользователь не хочет выполнять эту интенсивную задачу (возможно, я ошибаюсь, потому что я мало знаю о вашем приложении). Тогда в этом случае вы создали экземпляр виртуальной машины, который бесполезен. Опять же, ваше предположение заключается в том, что пользователь всегда выйдет из системы. Что делать, если пользователь просто закрывает браузер? Как вы обнаружите, что пользователь оставил ваше приложение, и вам нужно будет прервать экземпляр рабочей роли, созданный для этого пользователя.
  • Это не эффективный подход. Вся предпосылка Cloud Computing построена на общих ресурсах.Наличие виртуальной машины, предназначенной для пользователя, не похоже на эффективный подход.

Возможного решение

Вместо прядение новых случаев работника роли, могу я предлагаю вам взглянуть на опции масштабирования. В основном идея состоит в том, чтобы начать с общего пула экземпляров рабочей роли. Когда пользователь входит в систему и запускает задание, веб-роль записывает сообщение в очереди служебной шины, которое отбрасывается экземпляром рабочей роли, который выполняет работу и возвращает результат. Задайте максимальное количество задач, которые может обрабатывать рабочая роль. Если вы превысите этот счет, открутите новый экземпляр рабочей роли. Вы можете взглянуть на функцию автоматического масштабирования, доступную на портале Azure Management Portal, или посмотреть на некоторые сторонние службы, которые могут сделать это масштабирование для вас.

+0

Спасибо за этот весьма исчерпывающий ответ. У меня были подозрения, что это может не работать по нескольким причинам, спасибо за это. Таким образом, моя проблема с ограниченным числом рабочих ролей заключается в том, что эти задания нужно начинать немедленно, а продолжительность этих заданий может варьироваться от миллисекунд до минут. Мое беспокойство заключается в том, что при ограниченном числе одноядерных рабочих ролей (пытаясь снизить издержки), если одновременно выполнялись несколько длительных заданий, другие пользователи были бы эффективно заблокированы. Извините за то, что вы не более конкретно о приложении. –

+0

Дэн, поэтому рекомендуется использовать метод масштабирования. По мере того, как все больше клиентов запускают работу, которая должна выполняться вашими экземплярами рабочей роли, в очереди будет больше сообщений. Автосканирование может запускаться на основе количества сообщений. Если есть больше сообщений, чем порог (который вы решите), это будет признаком того, что вам понадобятся дополнительные экземпляры рабочей роли, и затем можно соответствующим образом масштабировать ваши экземпляры. Вы можете захотеть просмотреть экземпляры XS вместо небольших, если ваша задача не является интенсивной в процессе. Последнее, что я проверил, может иметь 6 экземпляров XS по цене 1 Small instance. –

+0

С помощью узлов XS вы ссылаетесь на узлы A0, подробно описанные здесь? http://azure.microsoft.com/en-us/pricing/details/cloud-services/ Если это так, я думаю, что мне понадобится хотя бы одно выделенное ядро ​​на одну рабочую роль, хотя желательно больше (некоторые задания будут полезны для мульти- нарезание резьбы, и все они являются достаточно интенсивными процессами). Имеет ли следующий вид жизнеспособный подход: 2 очереди, один для отправки заданий, а другой для отправки результатов. Роли рабочих снимают задания с очереди, запускают задачу (которая не ожидается) и отмечают сообщение как завершенное, а затем через обработчик события отправляет сообщение после завершения? –

1

Использование специальных экземпляров для каждого пользователя - не очень хорошая идея. Утилизация будет низкой, затраты будут высокими, и по умолчанию каждая подписка имеет колпачок из 20 ядер процессора, поэтому вам нужно сначала обратиться за поддержкой для увеличения квоты.

Лучшим подходом было бы combine the web and worker role into one - еще раз вам понадобится дополнительная нагрузка. Вы все равно можете использовать все, что вам удобно, чтобы хранить пользовательские запросы - очередь или что-то еще. Таким образом, IIS этой роли будет толкать данные, а часть «бесконечный цикл» (роль enrty point Run()) будет обрабатывать данные и сохранять результаты, а затем веб-сервер будет получать результаты и возвращать их пользователям.

Смежные вопросы