Мы пытаемся заставить Service Broker работать в нашей среде, чтобы решить бизнес-задачу. Я не знаю, подходит ли заголовок сообщения, но мой вопрос ниже. Но, возможно, это не очень хороший вопрос, поэтому после этого мы и делаем то, почему я думаю, что это правильный вопрос.
Сколько сообщений нужно отправить в разговоре до его завершения?
Мы хотим использовать компонент Service Broker для асинхронного обновления таблицы результатов. Таблица результатов сглаживается и быстро. У нас есть триггеры на базовых таблицах, которые отправляют сообщение со своей таблицей и первичным ключом. У нас есть три очереди:
- Низкая задержка - на обработку уходит 15 секунд. Он обрабатывает элементы, которые меняются в зависимости от конкретного элемента.
- Массовая очередь - задача в 5 минут для обработки. Он обрабатывает, когда что-то меняется, затрагивая многие сотни (или тысячи) предметов. Он разбивает список элементов, которые были затронуты, и передает их в отложенную очередь с низкой задержкой
- Отложенная низкая задержка - задача - 30 минут для обработки. Это обрабатывает элементы, но только из основной очереди.
В основном, если информация клиента обновляется; это влияет на многие продукты, поэтому отправляется в массовую очередь для более медленной обработки. Однако, если продукт обновляется, он отправляется в очередь с низкой задержкой.
Мы повторно используем разговоры, похожие на блог Ремуса Русану http://rusanu.com/2007/04/25/reusing-conversations/ , за исключением того, что мы делаем это на основе модуля первичного ключа. У этого есть побочное преимущество помощи в дедупликации первичных ключей.
Таким образом, мы повторно используем разговоры и следуем нашим правилам. С двумя потоками мне удалось прожечь 125 сообщений в секунду (искусственное отбрасывание нескольких тысяч сообщений), что более чем в состоянии поддерживать производительность (оценка 15 сообщений в секунду).
Однако проблема, с которой мы сталкиваемся, заключается в том, что через некоторое время, ~ 4 часа или 120 КБ сообщений, мы начали видеть блоки и высокий уровень конкуренции в sysdesend и таблице очередей. Блокировки LCK_M_U и KEY блокировки. Иногда hobt преобразуется в sysdesend, а иногда в конкретную таблицу очередей (queue_).
У нас есть процесс, который завершает разговоры через 24 часа или 30 минут бездействия, поэтому мы могли бы просто увеличить время перед циклом разговоров.
Мы используем SQL 2016 Enterprise (13.0.4001.0)
- Триггерные огни (отправка с низкой задержкой или массовым)
- Посмотрите или создайте ручку разговора.
- Отправить сообщение
- Процедура активации очереди
- Обновить таблицу результатов
Процесс очистки запускается каждые 10 минут, чтобы увидеть, нет ли каких-либо пустых разговоров. если он находит их более трех раз подряд, он помечает его как неактивный и завершает разговоры.
Пожалуйста, дайте мне знать, если есть какие-либо дополнительные детали, которые могут быть полезны. У меня нет большого опыта работы с Service Broker, поэтому я не знаю, являются ли наши сообщения в секунду низкими, высокими или безразличными.
ОБНОВИТЬ
Поэтому мы попробовали еще раз сегодня и столкнулись с той же проблемой. Мы изменили продолжительность разговора до 2 часов, и это не имело никакого эффекта. Итак, мы реализовали трюк 150; который имел ту же проблему.
Тонны ожидания на отправку разговора, ожидания на sysdesend. У кого-нибудь есть еще идеи?
ОБНОВЛЕНИЕ 2
Сегодня мы продлили тест дольше и в течение одного из 17-минутных тестовых периодов мы обработали 41 тыс. Сообщений на 4 ручках разговора. Мы могли идти в ногу, кроме как к концу, когда блокировки на sysdesend и таблице очереди стали слишком большими, и мы начали дрейфовать позади, прежде чем остановить его. Кажется, у нас нет проблем с обработкой сообщений, без поступления вещей в очередь, мы можем их обработать и обработать как минимум в 5 раз быстрее. Наша скорость кажется ограниченной из-за добавления сообщений.
В последующем тесте мы удалили один из триггеров, на которые приходилось 80% сообщений. Даже с такой значительно сниженной нагрузкой мы начали видеть то же самое ожидание.
ОБНОВЛЕНИЕ 3
Спасибо, Ремус за твой совет (и спасибо за публикацию таких замечательных статей в блоге на эту тему, они сыграли важную роль в достижении этой точки).
Мы повторили это сегодня и сделали лучше (так как мы шли дольше, прежде чем увидели ожидания, и еще дольше, пока это не подорвало нас). Итак, подробности.
Мы изменили: * Увеличено количество поддерживаемых разговоров в потоке с 1: 1 до 2: 1. В основном у нас было 8 дескрипторов разговоров для 4 потоков.
- консолидировать массовую очередь (потому что одно входящее сообщение может означать сотни исходящих сообщений) для консолидации в меньшее количество более крупных сообщений.
Примечания об этой попытке:
отключение процедуры активации целевой очереди. никаких изменений в блокировке (мы подождали 5 минут), и сообщения были отправлены на sys.transmission_queues.
мониторинг sys.conversation_endpoints. Это число очень быстро выросло с 0 до 13 000, а затем более медленно росло в течение дня и заканчивалось около 25 000 через ~ 5 часов. Блокировка не начиналась, пока не достигла 16K +/-
Я вошел в ЦАП и выполнил команды DBREINDEX для очередей, хотя из запроса записи о призраках никогда не превышали 200 или около того, пока не началась очистка, и сбросили счетчик до 0.
sysdesend и sysdercv имели одинаковые значения 24 932, когда я закончил тест.
мы обработали ~ 310K сообщений за 5 часов.
Мы ушли так долго, прежде чем все развалилось, что я действительно думал, что мы сделаем это на этот раз. Завтра мы попытаемся заставить сообщения пройти по проводам.
sys.conversation_endpoints
во время теста (постоянное или увеличивается, и насколько оно велико, когда происходит блокировка). 2) Когда происходит блокировка, делает ли отключение целевой очереди разницу в блокировке SEND (отключение очереди должно направлять SEND к sys.transmission_queue). и 3)
ALTER QUEUE ... REBUILD
когда начинается блокировка?
we started seeing blocks and high contention on sysdesend and the queue table.
-> Какой тип ожидания -PAGELATCH_EX/SH and WRITELOG
? Вы использовали 150 трюк ? Если ваши системные разногласия являются системными таблицами, трюк 150 будет очень полезен.