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

Обновление

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

Ответ 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

Я собираюсь показать полный пример кода в блоге в ближайшее время.