Аз съм администратор на база данни, така че това подхожда на моя отговор, но ето какво бих направил:
- Ако използвате SQL 2005+, използвайте Service Broker, за да съхранявате съобщенията в базата данни, вместо да ги съхранявате в таблица. С това получавате механизъм за опашка, така че можете да се отървете от MSMQ. Вие също ще имате таблица, но тя просто ще съхранява манипулатора на разговора (по същество указател към съобщението) заедно с колко пъти е опитал това съобщение. И накрая, вие ще искате някакъв вид „мъртва пощенска кутия“, където отиват съобщенията, които достигат прага ви за повторен опит.
- В кода си за обработка на съобщения направете следното:
- Започнете транзакция
- Получаване на съобщение извън опашката
- Ако броят на повторните опити е по-голям от прага, преместете го в кутията за мъртви пощенски съобщения и се ангажирайте
- Увеличете брояча на масата за това съобщение
- Обработете съобщението
- Ако обработката е успешна, извършете транзакцията
- Ако обработката е неуспешна, поставете ново съобщение на опашката със същото съдържание и след това завършете транзакцията
Забележете, че няма планирани връщания назад. Отменянето в Service Broker може да бъде лошо; ако връщате назад 5 пъти без успешно получаване, опашката ще бъде деактивирана както за поставяне на опашка, така и за извеждане от опашка. Но все пак искате да имате транзакции за случая, когато процесорът на съобщенията ви умре по средата на обработката (т.е. сървърът се срине).