2012-10-10 14 views
6

Vorrei archiviare i file in Azure Blob Storage. Fin qui tutto bene. Vorrei anche memorizzare metadati aggiuntivi sul file; per questo io uso un database SQL di Azure (così posso facilmente interrogare i file nella memoria blob).Accesso transazionale allo storage BLOB BLU

Così, quando aggiungo un nuovo file allo store, mi piacerebbe assicurarmi che sia stato scritto correttamente sia il blob che i meta-dati. Quindi mi viene in mente qualcosa di simile a un contesto di transazione.

C'è un modo, per creare un tale contesto di transazione utilizzando l'archiviazione BLOB e l'archiviazione SQL?

risposta

5

Non c'è niente di incorporato che lo farà per quanto ne so; dovrai gestirlo da solo. Lo scenario più semplice è quello di salvare prima il blob, quindi aggiungere il record del database. Poiché il database funge da indice per le tue esigenze, il Blob è essenzialmente invisibile al tuo codice fino a quando i record del database non vengono salvati.

Un'opzione più coinvolta è quella di implementare la propria logica di commit. Dovresti gestire un inserto di database (con un flag sul record impostato su 0 per esempio), salvare il Blob e, se correttamente, impostare il flag nel database su 1.

È anche possibile salvare i metadati in Tabelle di Azure, sebbene la ricerca in tabelle di Azure possa rallentare in modo significativo se si dispone di molti record. La ricerca nel database SQL sarà più veloce la maggior parte del tempo.

Quale approccio scegli dipende dai tuoi obiettivi, ma penso che la prima opzione sia la più semplice.

1

Il blob esistente è innocuo, ma un record del database che punta a un blob che non esiste sarebbe negativo. Pertanto, implementerei la transazione con la seguente logica.

Al momento della creazione ... aggiungere prima il blob, quindi creare il record del database. Se il caricamento del blob fallisce, basta tornare. Se il caricamento blob ha esito positivo, ma il record del database non riesce, eliminare il blob e restituire. Il punto è che non si vorrebbe creare un record del database fino a dopo un caricamento blob riuscito. Si desidera inoltre pulire il BLOB se non è possibile aggiornare il record del database. Se la pulizia del BLOB fallisce, vorrei semplicemente avere un servizio che funzioni periodicamente per ripulire i BLOB senza riferimento creati più di un'ora prima solo così non tenta di cancellarne uno tra il caricamento e la creazione del record del database.

Durante la rimozione ... Eliminare prima il record del database. Se fallisce, basta tornare, il blob e il record del database sono entrambi ancora lì. Se il record del database è cancellato ok, il blob non fa male nulla rimanendo lì, quindi puoi provare a eliminarlo immediatamente o lasciarlo per un servizio di pulizia di cui occuparti più tardi.

Problemi correlati