Как я могу сериализовать обработку веб-службы .net?

#.net #asp.net #sql-server #web-services #batch-processing

#.net #asp.net #sql-сервер #веб-службы #пакетная обработка

Вопрос:

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

Есть ли хороший способ сериализации запросов или, возможно, отклонения запросов, если один из них уже выполняется?

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

Есть мысли?

Приветствую, Иэн.

Ответ №1:

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

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

Комментарии:

1. Спасибо за ваш ответ, Эндрю. Я читал о двух других вариантах, которые вы упомянули. Служба Windows имеет немного низкий уровень и требует внедрения планирования, что является случаем повторного изобретения колеса, в то время как планировщик задач Windows звучит ненадежно и может привести к появлению окна CMD. Да, мой план в конечном итоге заключается в переходе от базы данных к веб-службе и обратно, но на начальном этапе база данных используется только для ее функции планирования, поэтому я думаю, что это отвлекающий маневр!

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

3. Но это то, что я имею в виду; почему база данных делает что-то только для того, чтобы что-то запустить, когда для этого предназначен планировщик задач. Это вовсе не ненадежно, и нет никаких причин, по которым is вообще должен открывать командное окно; Он может запускать процесс, у которого нет интерфейса специально для такого рода вещей, и он может управлять ранее запущенными экземплярами гораздо сложнее, чем вам, кажется, нужно.

4. И исправьте; статическое свойство не будет работать в сценарии веб-фермы (или даже веб-сада) … отсюда мой комментарий о том, что нужно входить и выходить из базы данных для чего-то, о чем одна служба (планировщик задач) может позаботиться за вас в одном месте.

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