Jestem DBA, więc to nadaje smak mojej odpowiedzi, ale oto, co bym zrobił:
- Jeśli używasz SQL 2005+, użyj Service Broker do przechowywania komunikatów w bazie danych zamiast przechowywania ich w tabeli. Dostajesz dzięki temu mechanizm kolejkowania, dzięki czemu możesz pozbyć się MSMQ. Będziesz mieć również tabelę, ale będzie ona przechowywać uchwyt konwersacji (zasadniczo wskaźnik do wiadomości) wraz z liczbą prób tej wiadomości. Na koniec będziesz potrzebować czegoś w rodzaju „skrzynki na martwe listy”, do której trafiają wiadomości, które osiągną próg ponownych prób.
- W kodzie przetwarzania wiadomości wykonaj następujące czynności:
- Rozpocznij transakcję
- Odbierz wiadomość poza kolejką
- Jeśli liczba ponownych prób jest większa niż próg, przenieś ją na pole niedostarczonej litery i zatwierdź
- Zwiększ licznik na stole dla tej wiadomości
- Przetwórz wiadomość
- Jeśli przetwarzanie się powiodło, zatwierdź transakcję
- Jeśli przetwarzanie nie powiodło się, umieść w kolejce nową wiadomość o tej samej zawartości, a następnie zatwierdź transakcję
Zauważ, że nie ma żadnych planowanych cofnięć. Wycofywanie zmian w Service Broker może być złe; jeśli wycofasz się 5 razy bez pomyślnego odbioru, kolejka zostanie wyłączona zarówno dla wpisywania, jak i usuwania z kolejki. Ale nadal chcesz mieć transakcje na wypadek, gdy twój procesor wiadomości umrze w trakcie przetwarzania (tj. Awaria serwera).