У меня есть очередь, которая останавливается без видимой причины, в этой очереди я реализовал обработку сообщений posion . А во время обработки записывает и отбрасывает любые ядовитые сообщения.
Он работал нормально более года без остановки. Но недавно (проблема началась четыре недели назад), она останавливается один или два раза в неделю. И только на этой неделе он остановился дважды.
А когда я проверяю таблицу с новыми отравленными сообщениями, ее нет !! И когда я включаю очередь, обработка возобновляется успешно, а ситуация с «ядовитым сообщением» не воспроизводится.
О задании очереди: Получает около 2-3000 сообщений в день. Он используется для запуска хранимых процедур вне транзакции. Каждое сообщение может обрабатываться немного (делать много операций выбора, вставки, обновления).
Позвольте мне объяснить этот момент: в базе данных есть триггеры, которые запускаются внутри транзакции, триггер отправляет сообщение для запуска некоторого кода вне триггера. Асинхронное поведение предотвращает снижение производительности базы данных.
Я обнаружил, что даже при возникновении взаимоблокировки при обработке сообщений очередь обрабатывает сообщение как отравленное. Так что в принципе это не должно быть проблемой производительности. Но может ли это быть? Может быть, база данных растет и длится слишком долго, чтобы обрабатывать сообщения?
Но как я могу это выяснить, если он не обнаружен как положенный?
Почему по другой причине очередь останавливается?
Как сохранить, когда и с каким сообщением очередь отключена?
Кто-нибудь знает, как я могу провести какой-либо судебный анализ?
Есть идеи?
<ч />
ОБНОВЛЕНИЕ ОБСЛУЖИВАНИЯ ПСЕВДО-РЕШЕНИЯ:
Согласно сообщению Ремуса, я пытался использовать уведомление о событии, чтобы получить точный момент, когда очередь останавливается.
CREATE EVENT NOTIFICATION [QueueDisabledEN]
ON QUEUE [dbo].[ProcessQueue]
FOR BROKER_QUEUE_DISABLED
TO SERVICE 'Queue Watch Service', 'current database';
И затем проверка журнала событий:
select * from sys.event_notificiation
Но так как трудно узнать среду, в которой произошло событие (что еще происходило на моменте?), Криминалистический анализ на этом заканчивается. К счастью, моя реализация службы брокера хранит сообщения с датой отгрузки, датой получения, датой обработки ... Это помогло мне обнаружить, что в течение 3 секунд очередь заполняется сотнями сообщений, обработка которых занимает слишком много времени. .
Хотя я нахожу реальное решение, единственное временное решение - проверять с помощью задания агента каждые x минут состояние очереди и включать его:
IF (EXISTS(SELECT * FROM sys.service_queues WHERE name like 'ProcessQueue' AND (is_receive_enabled = 0 OR is_enqueue_enabled = 0))) BEGIN
PRINT convert(nvarchar, getdate(), 121)+ ': Activando la cola ProcessQueue'
ALTER QUEUE ProcessQueue WITH STATUS = ON
END
Спасибо, Ремус!