Azure Web Sites - запланированные задачи
Я разрабатываю веб-сайт, который планирую разместить в Windows Azure. Сайт должен будет запускать ежедневные/еженедельные запланированные задания, синхронизировать с различными сторонними источниками данных, отправлять уведомления пользователей и т.д. Он также должен иметь возможность запускать асинхронные задачи по требованию, такие как отправка электронной почты пользователям и т.д.
Моя первоначальная мысль заключалась в том, чтобы разместить это с помощью Azure Cloud Services, с одной веб-ролью с MVC 4 и одной рабочей ролью, которая занималась запланированными задачами, и вытаскивая асинхронные задачи (отправка электронной почты и т.д.) из хранилища очередей. Однако, это будет стоить мне, видя, как мне нужно платить вдвое за вычислительные часы.
Проект может оправдать эту стоимость в будущем, но прежде чем бизнес заберет меня, я бы предпочел более дешевую альтернативу. Поэтому я просматриваю веб-сайты Azure.
Я мог бы сократить затраты вдвое, используя Azure Web Sites для сайта MVC и имея роль рабочего, запускающую taks, но мне бы хотелось услышать о других альтернативах, кроме очевидной возможности вручную запускать их из моего admin модуль.
Кроме того, могу ли я подключить сайт к моему домену и использовать ssl бесплатно с помощью Azure Web Sites?
Ответы
Ответ 1
Похоже, что у Azure наконец-то появилось правильное планирование - см. документацию Azure Scheduler
В то время как в предварительном просмотре, и вам, скорее всего, придется использовать REST API на данный момент, я уверен, что это будет незадолго до того, как функциональность будет доступна на портале управления. Я ждал времени для этого!
Ответ 2
Если вам удобнее писать код в node.js, посмотрите Windows Azure Mobile Services
. Он имеет возможность определять и выполнять запланированные задачи. Подробнее об этом можно узнать здесь: http://www.windowsazure.com/en-us/develop/mobile/tutorials/schedule-backend-tasks/.
Другой альтернативой может быть использование службы планировщика Aditi: http://www.aditicloud.com/.
Еще одна альтернатива - написать собственный планировщик и разместить это решение на сайтах Azure. Я бы рекомендовал использовать библиотеку планирования Quartz.net. Он бесплатный, с открытым исходным кодом и используется многими людьми.
Я все еще думаю, что путь рабочей роли для обработки работы - жизнеспособное решение. Что вы можете сделать, так это разместить инфраструктуру front-end на веб-сайте Windows Azure и связать ее с рабочей ролью через очереди Windows Azure. Предполагая, что у вас есть 2 экземпляра рабочих ролей в размере Extra Small VM, это будет стоить вам около 30 долларов США в месяц (0,02 x 2 x 750 часов). Я написал сообщение в блоге о создании собственного планировщика задач и его размещении в рабочей роли не так давно. Вы можете прочитать этот пост здесь: http://gauravmantri.com/2013/01/23/building-a-simple-task-scheduler-in-windows-azure/
Кроме того, я могу подключить сайт к моему домену и использовать ssl для бесплатного использования Лазурные веб-сайты?
Я так не думаю. SSL не является бесплатным с веб-сайтами Windows Azure. Посмотрите на цену SSL здесь: http://www.windowsazure.com/en-us/pricing/details/web-sites/.
Ответ 3
Вы можете использовать класс Timer для запуска планировщика внутри вашего проекта Azure Web Site. Таким образом, вы можете иметь все инкапсулированные внутри вашего проекта ASP.NET MVC.
Информация о классе таймера: http://msdn.microsoft.com/en-us/library/system.timers.timer(v=vs.110).aspx
Я тестировал это в проекте MVC на веб-сайте Azure и могу подтвердить, что он работает. Чтобы получить эту настройку, запустите таймер внутри Application_Start() Global.asax.cs:
private Timer _timer;
protected void Application_Start()
{
_timer = new Timer(1 * 60 * 1000); // 1 minute
_timer.Elapsed += (sender, e) => ScheduledTask.Process();
_timer.Enabled = true;
// other code goes here
}
В моем примере таймер вызывает ScheduledTask.Process() каждую минуту. Вот как выглядит мой класс ScheduledTask:
public class ScheduledTask {
public int Id { get; set; }
public DateTime Time { get; set; }
public static void Process() {
using (var db = new ApplicationDbContext()) {
db.ScheduledTasks.Add(new ScheduledTask {
Time = DateTime.Now
});
db.SaveChanges();
}
}
}
В Process() вы можете делать все, что хотите, но я просто создаю запись в базе данных, чтобы проверить, работает ли это. Я буду держать эту задачу в течение примерно одного дня, и вы можете увидеть результаты здесь:
http://contactmanager1.azurewebsites.net/ScheduledTask
Обновление
Оказывается, что это не лучший способ настроить запланированные задачи, потому что этот таймер умирает, когда время пула приложений (из-за низкой активности на сайте). Таймер автоматически запускается снова, когда пул приложений запускается снова, но для сайтов с низким объемом это не является надежным решением.
Ответ 4
Веб-сайты Azure теперь поддерживают Azure WebJobs - http://www.hanselman.com/blog/IntroducingWindowsAzureWebJobs.aspx
Ответ 5
В статье "Опасности реализации повторяющихся фоновых задач в ASP.NET" есть очень интересная идея, чтобы в вашем Asp.Net была запущена фоновая задача приложение без риска того, что останов AppDomain остановит задачу.
Если вы не хотите платить за роль рабочего Azure, вы можете попробовать.
Ответ 6
Мне просто нужно сначала сказать, что вы неверны о необходимости платить дважды:)
"WebRole" в Azure PaaS (платформа как услуга) - это только WorkerRole + IIS.
Итак, поскольку ваша логика, которая должна быть помещена в таймер, очень минимальна и, вероятно, не займет много ресурсов, вы можете просто начать свой рабочий рабочий поток в OnStart из "WebRole.cs" ", который находится внутри вашего веб-приложения.
Это приведет к тому, что как ваше веб-приложение, так и ваша маленькая рабочая задача будут размещены на одной виртуальной машине - так что вы платите только за нее.
В качестве побочного пункта - если вам нужны 10 "фоновых" задач, но они не выполняют тяжелую работу и не нуждаются в масштабировании независимо, то вы также можете просто разместить или запустить все из них из одного "WorkerRole".
namespace MvcWebRole1
{
public class WebRole : RoleEntryPoint
{
public override bool OnStart()
{
// Start my background thread processing task.
MyBackgroundTaskThing.Start();
return base.OnStart();
}
}
}
Ответ 7
Привет, я добавляю эти ссылки, потому что Microsoft объявляет об удалении запланированной части в Azure.
https://azure.microsoft.com/en-us/updates/azure-scheduler-will-retire-on-september-30-2019/
https://support.microsoft.com/en-us/help/4316957/products-reaching-end-of-support-for-2019
Чтобы выполнить новое запланированное задание (или программу на стороне сервера), вы также должны изучить приложения логики.
https://azure.microsoft.com/fr-fr/services/logic-apps/
https://docs.microsoft.com/en-us/azure/logic-apps/logic-apps-examples-and-scenarios
Я собираюсь показать полный пример кода в блоге в ближайшее время.