måndag, februari 01, 2010

Timeout för kö-meddelanden i Windows Azure

En fråga som har dykt upp många gånger sista tiden i mitt projekt men som vi aldrig sök upp svaret på är hur det funkar med timeout för meddelanden i en kö i Windows Azure Queue Storage. Windows Azure garanterar att meddelanden som placeras i köer kommer att hanteras minst en gång. När man gör ett GET-anrop via REST, alternativt GetMessage() från StorageClient, kan man skicka med en alternativ parameter som sätter hur lång tid timeouten ska vara. Om man inte har tagit bort meddelandet innan tiden för timeouten så dyker meddelandet upp på kön igen.

var message = c.GetMessage(TimeSpan.FromSeconds(10));

Om man inte anger någon tid sätts den till 30 sekunder vilket också är maxtiden för ett meddelande idag. Det har pratats om att möjliggöra längre intervall men det har ännu inte dykt upp. Oavsett hur lång tid man skulle kunna sätta måste applikationer byggas så att dess funktioner är idempotenta. Med idempotent menas att om man anropar en funktion två gånger ska det ge samma resultat, f(f(x)) = f(x).

Ett exempel kan vara att en worker role hämtar ett meddelande och börjar hantera det. När den är klar ska det utföras en loggning till Azure Table Storage som av någon anledning tar väldigt lång tid eller misslyckas. Då dyker meddelandet upp på kön igen och en annan instans av samma worker role kan få tag i meddelandet och påbörja att hantera det på nytt. Då måste applikationen hantera den situationen och inte förändra slutresultatet.

Inga kommentarer: