Компонент Service Broker - несколько очередей и одна очередь при взаимодействии с внешними приложениями - PullRequest
1 голос
/ 04 февраля 2010

В настоящее время у нас есть приложение, которое использует компонент Service Broker для постановки в очередь сообщений, отправляемых во внешнюю систему, с которой мы взаимодействуем через интерфейс веб-службы.

В настоящее время мы интегрируемся только с одной компанией, поэтому достаточно одной очереди - однако нам нужно начать передавать сообщения нескольким компаниям, которые используют один и тот же интерфейс веб-службы.

Мне интересно, достаточно ли для этого одной системы очередей или у нас должна быть очередь на компанию. При наличии очереди на компанию я беспокоюсь о ее масштабировании, поскольку у нас может быть много очередей, а затем множество подключений для проверки очередей.

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

Мы могли бы повторно вставить сообщение, но меня беспокоит то, что мы не гарантируем порядок доставки.

1 Ответ

3 голосов
/ 04 февраля 2010

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

Альтернативный подход, подробно описанный в книге Клауса Ашенбреннера , состоит в том, чтобы иметь таблицу ожидающих запросов. Как только активированная процедура получает сообщение с запросом из очереди компонента Service Broker, она пытается выполнить вызов веб-службы. Если по какой-либо причине это не удается, запрос помещается в таблицу ожидающих запросов и повторяется каждый раз (вы можете использовать таймеры разговора для планирования повторных попыток). Таким образом, если веб-служба недоступна, она не будет блокировать читателя Service Broker от обслуживания других компаний (при условии, что время ожидания для первого запроса достаточно мало). А поскольку получение будет принято независимо от того, успешно ли выполнен вызов веб-службы, вы не столкнетесь с проблемой ядовитых сообщений.

...