Ядовитые сообщения без транзакций - PullRequest
0 голосов
/ 01 мая 2018

Может ли сообщение стать отравленным, если оно не транзакционно?

Документация, кажется, не подразумевает, но я не нахожу прямого утверждения так или иначе.

1 Ответ

0 голосов
/ 02 мая 2018

Да, это возможно при некоторых обстоятельствах.

Отравляющее сообщение - это сообщение, которое остается в очереди, не позволяя другим проходить. Теперь, что делает транзакционные сообщения отравленными? Это когда мы откатываем транзакцию и сообщение возвращается туда, где оно было раньше, прямо в верхней части очереди. Поэтому речь идет не о самом сообщении (по крайней мере, непосредственно), а о том, как мы обрабатываем сообщения и что мы делаем в случае сбоя при обработке, т. Е. Выполняем откат.

Если очередь не транзакционная, и мы «получаем» сообщение из верхней части очереди, оно необратимо. Там нет отката, который вернул бы сообщение на эту верхнюю позицию. Если мы хотим поместить это сообщение обратно в очередь для повторной попытки позже, все, что мы можем сделать, это отправить копию исходного сообщения. И MSMQ Send помещает его в конец очереди. Поэтому он не может блокировать другие сообщения.

Есть один случай, когда это не применимо, и это если мы играем с приоритетом сообщения и отправляем его обратно с более высоким приоритетом, чем остальная часть очереди. Это бы вернуло его на вершину и создало сценарий ядовитых сообщений.

Другой способ, если наша обработка состоит из «Peek» (который не удаляет сообщение), а затем «Receive», если обработка в порядке. В случае сбоя обработки между Peek и Receive сообщение останется в верхней части очереди.

Так что, да, возможно иметь вредоносные сообщения с нетранзакционными сообщениями, но только если делать что-то определенным образом.

...