Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Accodamento nei messaggi OneWay WCF tramite il servizio Windows e SQL Server

Sono un DBA, quindi questo insaporisce la mia risposta, ma ecco cosa farei:

  1. Se utilizzi SQL 2005+, utilizza Service Broker per archiviare i messaggi nel database anziché archiviarli in una tabella. Ottieni un meccanismo di accodamento con questo, quindi puoi sbarazzarti di MSMQ. Avrai anche una tabella, ma memorizzerà solo l'handle della conversazione (essenzialmente, un puntatore al messaggio) insieme a quante volte ha tentato questo messaggio. Infine, vorrai una sorta di "cassetta delle lettere morte" in cui vanno i messaggi che raggiungono la soglia dei tentativi.
  2. Nel codice di elaborazione del messaggio, procedi come segue:
    • Inizia una transazione
    • Ricevi un messaggio fuori dalla coda
    • Se il numero di tentativi è maggiore della soglia, spostalo nella casella delle lettere non consegnate e conferma
    • Aumenta il contatore sulla tabella per questo messaggio
    • Elabora il messaggio
    • Se l'elaborazione è riuscita, conferma la transazione
    • Se l'elaborazione non è riuscita, metti un nuovo messaggio in coda con lo stesso contenuto e poi conferma la transazione

Si noti che non sono previsti rollback. I rollback in Service Broker possono essere dannosi; se esegui il rollback 5 volte senza una ricezione riuscita, la coda verrà disabilitata sia per l'accodamento che per l'annullamento della coda. Ma vuoi comunque avere transazioni per il caso in cui il tuo elaboratore di messaggi si interrompe durante l'elaborazione (cioè il server si arresta in modo anomalo).