Запуск нескольких операций на сервере - PullRequest
2 голосов
/ 25 мая 2011

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

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

Но представьте себе эту ситуацию, модератор # 1 запускает службу. Служба запускается и запускает преобразование файла. Во время этого процесса модератор # 2 начинает преобразование другого файла. Он попытается запустить службу, но потерпит неудачу, потому что она уже запущена. Файл будет помечен для индивидуального преобразования, но не будет преобразован, так как не смог запустить службу.

Теперь я ищу новые идеи, чтобы решить это.

  1. Можно ли запустить несколько экземпляров одного сервиса?
  2. Могу ли я сделать услугу более динамичной? Например, если модератор # 2 начнет преобразование, он запустит службу, но если служба уже запускается, можно ли добавить файл в список? (В начале службы я создаю список, который читает каждый файл из базы данных в поисках индивидуального флага преобразования)
  3. Я знаю, что по существу думал об услуге, есть ли другой способ обработки операций на сервере, который может обрабатывать несколько запросов модераторов?

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

РЕДАКТИРОВАТЬ: Может быть, я должен предоставить некоторую дополнительную информацию, в настоящее время я студент, работающий на стажировке, мои промоутеры не очень хотели, чтобы файл был преобразован почти мгновенно. Они хотели, чтобы преобразование происходило ночью, если модератор не запускает его вручную для одного файла. Также веб-сайт и файловая система находятся на одном сервере (база данных на отдельном сервере). В основном работа будет выполняться на том же сервере, на котором работает веб-сайт (в настоящее время его нельзя разделить). Их беспокоит производительность на сервере.

Любой комментарий будет оценен! С наилучшими пожеланиями, Floris

Ответы [ 2 ]

2 голосов
/ 25 мая 2011

IMO, разумный способ справиться с этим - с любой формой очереди.Достаточно простой таблицы базы данных (или списка повторов).Ваша служба должна просто проверить: есть ли работа?Я бы так: сделай это, иначе поспи на короткое время и перепрошивай.В качестве дополнительной опции можно использовать что-то вроде pub / sub для более быстрого пробуждения, чтобы не было заметной задержки между постановкой в ​​очередь и удалением из очереди - но в идеале цикл очереди / опроса должен работать без этого дополнительного.

Тогда,Пакетный процесс прост: добавьте работу в очередь.При желании вы можете разрешить приоритет, так что модератор (или другой «живой» пользователь) получает работу раньше фоновой обработки.

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

0 голосов
/ 25 мая 2011

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

Если у вас есть код, который находится в службе, вы можете запустить его с помощью функции ниже. Если нет, то оставьте функцию ниже одного потока и запрограммируйте запуск службы в этой функции для выполнения преобразования. Ответ на этот вопрос может кардинально измениться в зависимости от того, есть ли у вас код для службы и можно ли вносить изменения. Вы можете поместить такую ​​же логику в службу, если сможете ее изменить.

В событии Application_Start вашего Global.asax.cs я бы запустил новый поток, который непрерывно зацикливается и проверяет вашу базу данных

using System.Threading;


   void Application_Start(object sender, EventArgs e)        
   {
        Thread VideoConversionThread = new System.Threading.Thread(new ThreadStart(VideoConversion));
        VideoConversionThread.Name = "VideoConversion";
        VideoConversionThread.IsBackground = true;
        VideoConversionThread.Start();
    }
    private void VideoConversion()
    {
        while (true)
        {
            //Get Count of records that need conversion.
            if(Count > 0)
            {
                 var records = //GetRecords from database that require conversion
                 foreach(var record in records)
                 {
                     //either spawn a seperate worker thread for each record or perform tasks here

                     //perform conversion
                     //update database to mark item as completed
                     // or 
                     //in this single thread, you could also start the service
                     //(does the service Stop when it's finished?) 
                     //(if so, you can monitor and wait for it to be stopped for each record)
                 }
             }
             Thread.Sleep(5000); //sleep
         }
      }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...