Come guardare un messaggio in coda in modo corretto

1

Ho uno scenario in cui ho bisogno di "guardare" una coda Amazon. Quando arriva un messaggio, ho bisogno di ricevere questo messaggio ed elaborarlo.

Al momento questo è implementato con do/while e Thread.Sleep quando non viene trovato alcun messaggio. Funziona, ma mi piacerebbe sapere se esiste un approccio migliore, possibilmente con un modello di progettazione o qualcosa del genere.

Il codice attuale:

      do
        {
            try
            {
                var message = _queue.GetMessage();
                if (message == null)
                {
                    Thread.Sleep(100000);
                    continue;
                }
                else
                //process message
             }
        } while(true)
    
posta gog 04.08.2015 - 18:53
fonte

1 risposta

1

Questo è un approccio molto simile che ho preso usando Amazon SQS, con alcune differenze per superare alcuni potenziali aspetti negativi;

  • se un messaggio diventa disponibile subito dopo il controllo, lo sarai aspettare 100 secondi prima di dare un'altra sbirciatina, che non lo è particolarmente reattivo.
  • Se molti messaggi arrivano in fretta successione, potresti non essere in grado di tenere il passo con loro usando lo stesso thread per elaborarli come recuperarli.
  • Se si verifica un'eccezione, potresti essere buttato fuori dal giro e non ci saranno più messaggi elaborato, sempre.

Tuttavia, nessuna di queste cose è difficile da superare:

  • come menzionato nei commenti, Polling lungo è una (breve) chiamata di blocco che ritornerà molto rapidamente non appena arriva un messaggio (o ancora restituisce null se nessun messaggio arriva entro il timeout - che è a massimo di 20 secondi.)
  • È possibile recuperare fino a 10 messaggi in una singola chiamata, e questi possono essere consegnato a un pool di thread per elaborarli e mantenere questo thread cercare più lavoro / messaggi.
  • prova / cattura all'interno del ciclo. Sono sicuro che lo hai già coperto e stavo solo fornendo il contorno!
risposta data 10.08.2015 - 23:12
fonte

Leggi altre domande sui tag