Windows Azure Kør en gang rutinemæssigt

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg forsøger at initialisere mine data i mine Azure Datatabeller, men jeg vil kun have at dette sker en gang på serveren ved opstart (dvs. via WebRole Role Entry OnStart-rutinen). Problemet er, om jeg har flere instanser, der starter med det samme tid så potentielt enten en af ​​disse tilfælde kan tilføje optegnelser til det samme bord på samme tid og dermed duplikere dataene ved runtime.


Er der som en overordnet rutine for alle tilfælde? Et programobjekt, hvor jeg kan skubbe en værdi ind og tjekke den i hver af tilfældene for at se om tabellerne er blevet oprettet eller ej? En singleton af den slags, som azurblå udsætter?


Skål
Røve

Bedste reference


Nej, men du kunne bruge en Blob lease som en mutex. Du kan også bruge en bordlås i SQL Azure, hvis du bruger det. [1]

Andre referencer 1


Du kan også bruge en kø, og slip en besked derinde, og så vil kun en rolle afhente meddelelsen og behandle den.

Andre referencer 2


Du kan oprette en ny single-instans rolle, der gør dette job på rollestart.

Andre referencer 3


For at være virkelig paranoid over dette og tage fat på tilfælde af fejl i midten af ​​at skrive dataene, kan du gøre noget endnu mere komplekst.


En kømeddelelse er en fantastisk måde at sikre transaktionsmæssige muligheder på, så længe det arbejde, du laver, kan være idempotent.



  • Hver forekomst tilføjer en meddelelse til en kø.

  • Hver instans afstemmer køen og modtager en besked



    • Læs den låsende række fra bordet.



      • Hvis værdien 'Opret datatilstand' er 'uanmeldt'



        • Forsøg på at opdatere rækken med en 'igangværende' værdi og en timeout-udløbstidsstempel baseret på den tid, der er nødvendigt for at oprette dataene.

        • Hvis opdateringen er vellykket, ejer forekomsten opgaven med at oprette dataene



          • Så opret data
          • opdater 'Create Data State' til 'committed'

          • Slet beskeden


        • Hvis opdateringen ikke lykkes, ejer ejeren opgaven



          • Så fjern kun meddelelsen.



      • Ellers, hvis værdien 'Opret data' er 'i gang', skal du kontrollere, om den aktuelle tid er forbi udløbstidsstemplet.



        • Det ville betyde, at 'under behandling' ikke lykkedes

        • Så prøv igen for at sætte staten til 'i gang', slet de ufuldstændige skriftlige rækker

        • Og prøv at genskabe dataene, opdatere tilstanden og slette meddelelsen


      • Ellers, hvis værdien 'Opret data' er 'forpligtet'




        • Slet kun kømeddelelsen, da arbejdet er udført