Некоторые услуги предоставляются нашим клиентам третьей стороной. Данные, которые создаются на их удаленных серверах, реплицируются на локальный SQL-сервер. Мне нужно выполнить некоторую работу на этом стороннем сервере, база данных которого недоступна мне напрямую. Для этой цели они предоставляют набор API. Работа выполняется на связанном сервере SQL заданием агента SQL Server.
Бизнес-сценарий: клиенты могут получать «значки». Значок может быть предоставлен клиенту, вызвав веб-метод UpdateCustomerBadgeInfo
на стороннем сервере.
Таким образом, типичное требование для автоматизированной задачи будет выглядеть так:
"Найдите всех клиентов, которые заходили в систему более 50 раз в течение дня, дайте им значок [has-no-life]
и отправьте им SMS-уведомление"
Алгоритм будет таким:
- Select all the matching accounts into a #TempTable
for each customer record:
- Call UpdateCustomerBadgeInfo() method (via CLR)
- If successfully updated badge info-> Enqueue SMS message (queue table)
- Log successful actions (so that the record will not be picked up next time)
Самая большая проблема с тем, как это работает сейчас, заключается в том, что обработка больших наборов данных в цикле WHILE занимает много времени.
Поэтому сторонний поставщик создал решение для пакетного обновления данных о клиентах. Они создали таблицу на локальном SQL-сервере, в которую отправляются запросы на пакетное обновление, а затем их служба принимает для проверки и обработки.
Вопрос в том :
Как следует изменить приведенный выше алгоритм, чтобы он соответствовал этой асинхронной модели?