Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Реализация очереди в sql server  [new]
cavalero
Member

Откуда: Прага
Сообщений: 247
Всем привет!

В приложении, которое мы разрабатываем есть механизм расчета цен. Расчет может занимать около 2-3 минут.

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

Однако, одновременно считающих пользователей может быть несколько и сейчас мы решаем это таким образом, что проверяем если кто то уже считает, то помечаем позицию "к расчету".

Когда текущий расчет заканчивается, то проверяется наличе элемента, помеченного "к расчету". И job-om создается еще один job с параметрами следующего в очереди элемента.

Мне, честно говоря, эта реализация не нравится. Мало того что тяжело отлавливать баги, так еще и новый job не всегда создается.

Как с архитектурной точки зрения можно реализовать подобный механизм? Спасибо!
31 янв 15, 16:08    [17200674]     Ответить | Цитировать Сообщить модератору
 Re: Реализация очереди в sql server  [new]
AsyncRun
Guest
cavalero
Как с архитектурной точки зрения можно реализовать подобный механизм?

Ассинхронным запуском на выполнение ХП с клиента, без всяких джобов
31 янв 15, 16:36    [17200796]     Ответить | Цитировать Сообщить модератору
 Re: Реализация очереди в sql server  [new]
cavalero
Member

Откуда: Прага
Сообщений: 247
AsyncRun,

а как сделать чтобы таск встал в очередь? Расчет много ресурсов требует.
31 янв 15, 17:05    [17200891]     Ответить | Цитировать Сообщить модератору
 Re: Реализация очереди в sql server  [new]
invm
Member

Откуда: Москва
Сообщений: 9845
cavalero
Как с архитектурной точки зрения можно реализовать подобный механизм?
Service Broker
31 янв 15, 17:06    [17200896]     Ответить | Цитировать Сообщить модератору
 Re: Реализация очереди в sql server  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31993
cavalero
Как с архитектурной точки зрения можно реализовать подобный механизм? Спасибо!
- один или несколько джобов, берущих задания из очереди, и делающие расчёты
- Service Broker
- асинхронный вызов из клиента
- синхронный вызов из отдельного потока на клиенте
31 янв 15, 21:11    [17201527]     Ответить | Цитировать Сообщить модератору
 Re: Реализация очереди в sql server  [new]
cavalero
Member

Откуда: Прага
Сообщений: 247
Спасибо за советы!

Реализовал простейшую очередь в Service Broker, вроде бы всё работает как надо.
1 фев 15, 02:35    [17202174]     Ответить | Цитировать Сообщить модератору
 Re: Реализация очереди в sql server  [new]
leov
Member

Откуда: С-Петербург
Сообщений: 616
cavalero,

механизм расчета цен надо допиливать
не дело это что на разрабатываемой системе операция 2-3 минуты занимает
нагрузка при эксплуатации будет только расти
и чем это потом кончится?
1 фев 15, 13:46    [17202558]     Ответить | Цитировать Сообщить модератору
 Re: Реализация очереди в sql server  [new]
приложении, кото
Guest
cavalero,

лучше с описания задачи начните. проблема скорее всего не в том, что джобы не создаются или что расчет 2-3 минуты длится, а в том, почему вообще пользователи пересекаются в "расчете цен". если это пересчет некоего полного прайс-листа, т.е. очень ответственная задача, то второго вполне можно "от ворот поворот". если это корзина одного покупателя, то откуда тут пересечения разных желающих. если это не "цены", а что-то вроде остатков склада, то при чем тут вообще воля каждого желающего нажать кнопку и тем более "очередь расчетов".
1 фев 15, 19:48    [17203243]     Ответить | Цитировать Сообщить модератору
 Re: Реализация очереди в sql server  [new]
cavalero
Member

Откуда: Прага
Сообщений: 247
leov,

согласен. Работаем в этом направлении, однако сейчас нужно было решить с "очередью" расчетов, чтобы в определенный момент времени рассчитывалось не более одного ценника.


Речь идет о системе бронирования и расчете сложных ценников размещения. Детали можно посмотреть тут: https://www.sql.ru/forum/1116223-1/tormozit-zapros

В дальнейшем собираемся считать только изменившиеся данные.
1 фев 15, 20:19    [17203349]     Ответить | Цитировать Сообщить модератору
 Re: Реализация очереди в sql server  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31993
cavalero
Работаем в этом направлении, однако сейчас нужно было решить с "очередью" расчетов, чтобы в определенный момент времени рассчитывалось не более одного ценника.

Речь идет о системе бронирования и расчете сложных ценников размещения. Детали можно посмотреть тут: https://www.sql.ru/forum/1116223-1/tormozit-zapros

В дальнейшем собираемся считать только изменившиеся данные.
Ну да, если пересчитывать все цены, миллионы комбинаций, при каждом клике мышкой каждого менеджера, то будет долго.

Нужно пеерсчитывать изменившиеся области кеша, либо считать цены по запросу пользователя.
1 фев 15, 21:02    [17203500]     Ответить | Цитировать Сообщить модератору
 Re: Реализация очереди в sql server  [new]
системе бро
Guest
cavalero,

а если цена станет зависеть от конкретного пользователя? гео/возраст/счетчики в куках/бонус на страну/промокод на гостиницу
что будете делать? еще на пару разрезов весь пул вариантов умножите и пересчитывать кэш уже по каждому поисковому запросу?

больше похоже что кэш (текущий вариант/текущий подход) неуместен. если он так часто обновляется, считай в онлайне в течение всего дня правится, и его обновление занимает больше времени чем расчет по конкретному запросу, то зачем он нужен?

и больше похоже на ситуацию с ощущением неконтролируемости расчетов, боязни напортачить с конечными цифрами, основанной на том же ощущении, что херни какой-то понаписали и черт его знает, лучше все пересчитать чтоб уж точно. расковыривайте исходники, пишите тесты, прям здоровенные сценарии. проверьте сколько займет расчет по поисковому запросу без всяких кэшей. подумайте про то, что нужно для кэша, что не нужно для кэша (что кэшировать, а что нет). еще одной причиной отложенного расчета скорее всего являются тормоза при попытках онлайн-расчетов. подход с многомиллионными кэшами "множим все на все, поправили две записи и пересчитываем от 1899-01-01 до getdate+365", а также фильтрация по гуиду в первом попавшемся запросе (и кластерный, начинающийся с него же) намекают что скорее всего проблемы с производительностью есть. и растут скорее всего из не самой удачной модели. а потом к ним добавляются всякие нюансы индексации, в том числе по не самым подходящим для сортировки, поиска, диапазонных выборок полям.

примеры обсуждений в духе "здравствуйте! у меня все на гуидах, я все стираю, потом заново заполняю, потом опять стираю, потом опять пересчитываю. скажите, почему все тормозит?" на форуме имеются.
1 фев 15, 21:29    [17203580]     Ответить | Цитировать Сообщить модератору
 Re: Реализация очереди в sql server  [new]
cavalero
Member

Откуда: Прага
Сообщений: 247
системе бро,

нельзя сказать что кэш обновляется нон стоп. Новые ценники приходят 2 раза в год и менеджеры их начинают активно забивать. В это время как раз нужно не допустить большой нагрузки, т.к. время расчета не так критично. Всё остально время приходят спец предложения, а это 2-5 перерасчетов в день.

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

Считать "по поисковому запросу" к сожалению, нереально. Именно чешские отельеры имеют настолько сложный ценник и настолько запутанную систему скидок, что поиск по с "онлайн" расчетом по 300-400 пражским гостиницам гарантированно переваливает 5 секунд, которые можно считать адекватными при поиске.

Скидки по каждому клиенту считать не нужно. Система хранит цены на 10 групп, которых для работы принимающего туроператора вполне достаточно.
3 фев 15, 00:33    [17209787]     Ответить | Цитировать Сообщить модератору
 Re: Реализация очереди в sql server  [new]
sql001
Member

Откуда:
Сообщений: 10
Не особо понятно это публичная или приватная система. Если публичная, то формирование 2-3 минуты - это недопустимо. Ваш сервер нагнет любой студент. Если приватная, то первое с чего стоит начать - оптимизация работы процедуры расчета. 2-3 минуты для расчетов это несколько сотен миллионов строк должно быть обработано на посредственном сервере. (Скалярные функции? Вы не знаете что такое индексы? угадал?).

Если уж действительно все так круто - выводите функцию расчета из СУБД в отдельный сервис (windows-service):
1. Пусть поддерживает кеш необходимых для расчета данных (в разумных пределах)
2. Не дает пересчитывать одно и тоже чаще определенного времени, а берет из кеша-результатов;
3. Ну и обработка по очереди тут же просто делается;

На основании скудных данных о проекте (задаче) могу только так подсказать...
3 фев 15, 06:13    [17209993]     Ответить | Цитировать Сообщить модератору
 Re: Реализация очереди в sql server  [new]
Скидки по
Guest
cavalero,

переделывайте процесс пересчета. "очередей расчета" пока не видно. пальцем в небо - вполне возможно что для начала достаточно ввести параметр и фильтр в очищалке/считалке по ID гостиницы или вроде того.
3 фев 15, 08:31    [17210121]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить