Как уменьшить переполнение очереди Service Broker? - PullRequest
2 голосов
/ 23 марта 2009

Я новичок в использовании SQL Service 2005 Service Broker. Я создал очереди и успешно начал вести беседы и т. Д. Однако я хочу сортировать сообщения «дросселя», и я не уверен, как это сделать.

Сообщения отправляются сохраненным процессом, который вызывается многопользовательским приложением. Скажем, 20 пользователей заставляют вызывать этот процесс один раз в течение 30 секунд, его нужно отправить только один раз. Так что я думаю, что мне нужен какой-то путь из моего процесса, чтобы увидеть, было ли отправлено сообщение в течение последних 30 секунд? Есть способ сделать это?

Одна из моих идей заключалась в том, чтобы отправить сообщение в очередь «ответа», которое указывает, был ли вызван процесс активации очереди запросов. Затем в моем сохраненном протоколе (вызываемом приложением пользователя) посмотрите, было ли это конкретное сообщение вызвано недавно. Проблема в том, что я не хочу, чтобы это испортило очередь ответов. Можно ли заглянуть в очередь (не получить), чтобы узнать, существует ли в ней сообщение?

Или есть более простой способ выполнить то, что я ищу?

Ответы [ 2 ]

4 голосов
/ 06 апреля 2009

Да, вы можете заглянуть в очередь, чтобы увидеть, есть ли в ней сообщение перед отправкой. Просто запросите очередь, используя SELECT вместо RECEIVE, и вы сможете просмотреть данные.

Лучше было бы посылать сообщения, и чтобы хранимая процедура, принимающая сообщения, решала, следует ли выбросить сообщение или нет.

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

Если вы видите проблемы с производительностью, попробуйте отправить более одного сообщения за разговор, поскольку это самый быстрый и простой способ повысить производительность компонента Service Broker.

1 голос
/ 23 марта 2009

Не уверен, что вы могли бы сделать это как-то в SB, но могли бы вы просто иметь таблицу с полем отметки времени, которая была обновлена ​​при отправке сообщения. Процесс проверит разницу во времени> 30 секунд и отправит.

...