Как я могу заставить SQL Service Broker фактически использовать все доступные средства чтения очереди?

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

Очередь активации имеет MAX_QUEUE_READERS, равное 10, но почти никогда не достигает этого предела. Вместо этого потребуется гораздо больше времени для обработки только 1 или 2 активированных задач, как видно из dm_broker_activated_tasks.

Как я могу стимулировать или даже заставить большее количество работников?


РЕДАКТИРОВАТЬ: ЭТО MS doc говорит об этом только проверяет активацию каждые 5 сек.

Означает ли это, что если мои задачи занимают менее 5 секунд, у меня нет возможности распараллелить их через сервис-брокера?


person meteorainer    schedule 01.12.2017    source источник


Ответы (1)


В Service Broker есть особая концепция параллелизма, а именно группа общения. Параллельно могут обрабатываться только сообщения из разных групп. Это проявляется в том, что RECEIVE заблокирует группу диалогов для исключенного из очереди сообщения, и никакой другой RECEIVE не сможет удалить из очереди сообщения из той же группы диалогов.

Таким образом, даже если у вас есть больше сообщений в очереди, если они принадлежат к одной и той же группе диалогов, SQL Server не может активировать больше параллельных считывателей.

Даже если вы не управляете группами диалогов явно (почти никто этого не делает), они управляются неявно благодаря тому факту, что дескриптор диалога также является группой. По сути, каждый раз, когда вы запускаете один BEGIN DIALOG, за которым следует несколько SEND для одного и того же дескриптора, они не будут обрабатываться параллельно. Если вы выдаете отдельный BEGIN DIALOG для каждого SEND, они обрабатываются параллельно, но вы теряете гарантию порядка.

person Remus Rusanu    schedule 02.12.2017
comment
Я использую курсор, чтобы создать дескриптор диалога и отправить для каждой задачи приема, так что это не так. Хорошая мысль, однако. - person meteorainer; 04.12.2017