У меня есть таблица SQL Server, полная заказов, по которым моя программа должна «следить» (позвоните в веб-службу, чтобы узнать, что-то с ними было сделано). Мое приложение является многопоточным и может иметь экземпляры, работающие на нескольких серверах. В настоящее время очень часто (в таймере потоков) процесс случайным образом (10000 *) выбирает 100 строк из списка «неподтвержденных» заказов и проверяет их, отмечая любые, которые успешно возвращаются.
Проблема в том, что между потоками и между различными процессами существует много совпадений, и они не гарантируют, что новый заказ будет проверен в ближайшее время. Кроме того, некоторые заказы никогда не будут «подтверждены» и являются мертвыми, что означает, что они мешают заказам, которые должны быть подтверждены, замедляя процесс, если я продолжаю выбирать их снова и снова.
Что бы я предпочел, так это систематически проверять все невыполненные заказы. Я могу придумать два простых способа сделать это:
- Приложение извлекает один заказ для проверки за раз, передавая последний заказ, который он проверил в качестве параметра, и SQL Server возвращает обратно следующий неподтвержденный заказ. Больше обращений к базе данных, но это гарантирует, что каждый заказ проверяется в разумные сроки. Однако разные серверы могут перепроверять один и тот же порядок подряд без необходимости.
- SQL Server отслеживает последний порядок, который он запрашивал у процесса для проверки, возможно, в таблице, и дает уникальный порядок каждому запросу, увеличивая его счетчик. Это включает в себя сохранение последнего порядка где-то в SQL, чего я хотел избежать, но также гарантирует, что потоки не будут без необходимости проверять одни и те же порядки одновременно
Есть ли другие идеи, которые я пропускаю? Имеет ли это смысл? Дайте мне знать, если мне понадобятся некоторые разъяснения.
РЕЗУЛЬТАТ:
В итоге я добавил столбец LastCheckedForConfirmation к моей таблице с завершенными заказами, и я добавил хранимую процедуру, которая обновляет одну строку Неподтвержденный с помощью GETDATE () и выводит заказ номер, так что мой процесс может проверить его. Он раскручивает столько, сколько может (учитывая количество потоков, которые процесс хочет запустить), и использует хранимую процедуру для получения нового OrderNumber для каждого потока.
Чтобы справиться с проблемой «Не пытаться строки слишком много раз или когда они слишком старые», я сделал следующее: SP будет возвращать строку только если «Время с последней попытки»> «Время между созданием и последним» try ", так что каждый раз, прежде чем повторить попытку, потребуется вдвое больше времени - сначала он ждет 5 секунд, затем 10, затем 20, 40, 80, 120, а затем после того, как его попробовали 15 раз (6 часов), он отказывается на этот заказ, и SP никогда не вернет его снова.
Спасибо всем за помощь - я знал, что то, как я это делал, было далеко от идеала, и я ценю ваши указатели в правильном направлении.