Domanda

Attualmente sto sviluppando una domanda di Azure Storage Table. In tale domanda ho tavolo che avrà relativamente pochi inserti (un paio di migliaia / giorno) e la chiave primaria di queste entità sarà utilizzato in un altro tavolo, che avrà miliardi di righe.

Quindi sto cercando un modo per utilizzare un intero auto-incrementato, invece di GUID, come chiave primaria nella piccola tavola (dal momento che vi farà risparmiare un sacco di stoccaggio e la scalabilità degli inserti non è davvero un problema).

Ci sono stati alcune discussioni sul tema, per esempio http: //social.msdn. microsoft.com/Forums/en/windowsazure/thread/6b7d1ece-301b-44f1-85ab-eeb274349797 .

Tuttavia, dal momento che problemi di concorrenza può essere davvero difficile da eseguire il debug e posto, io sono un po 'a disagio con l'attuazione del presente sul proprio. La mia domanda è quindi se c'è un impelemntation ben collaudato di questo?

È stato utile?

Soluzione

Non ho ancora implementato questo, ma sto lavorando su di esso ...

Si potrebbe seminare una coda con i tuoi prossimi id da usare, quindi basta far fuori la coda quando ne avete bisogno.

È necessario mantenere una tabella per contenere il valore del più grande numero di aggiunto alla coda. Se sai che non si utilizza una tonnellata di numeri interi, si potrebbe avere un lavoratore ogni tanto si svegliano e assicurarsi che la coda ha ancora interi in esso. Si potrebbe anche avere un usato int coda il lavoratore potrebbe controllare per tenere d'occhio l'utilizzo.

Si potrebbe anche collegare il lavoratore in modo se la coda era vuota quando il codice necessario un id (per caso) potrebbe Interupt pisolino del lavoratore di creare più chiavi al più presto.

Se la chiamata non è riuscita si avrebbe bisogno di un modo per (dire al lavoratore che si sta per fare il lavoro per loro (blocco), quindi fare il lavoro dei lavoratori di ottenere il prossimo id e sbloccare)

  1. blocco
  2. avere l'ultima chiave creata dalla tabella
  3. incremento e salvare
  4. Sblocca

quindi utilizzare il nuovo valore.

Altri suggerimenti

Per tutti coloro che si troveranno in cerca, c'è una soluzione migliore. tempo minimo per il blocco tabella è 15 secondi - questo è terribile. Non utilizzare se si vuole creare una soluzione realmente scalabile. Utilizzare Etag!

Create un'unica entità nella tabella per ID (si può anche chiamarla come ID o qualsiasi altra cosa).

1) Leggi.

2) Incremento.

3) InsertOrUpdate ETag specificato (dalla query di lettura).

se l'ultima operazione (InsertOrUpdate) ha successo, allora avete un nuovo, unico auto-incrementato ID,. Se fallisce (eccezione con HttpStatusCode == 412), significa che qualche altro client cambiato. Quindi, ripetere 1,2 e 3. Il tempo usuale per Read+InsertOrUpdate è inferiore a 200 ms . La mia prova di utilità con sorgente su GitHub .

La soluzione che ho trovato che impedisce ID duplicati e consente di auto-incremento è da

  1. blocco (leasing) un blob lasciare che agiscono come una porta logica.

  2. Poi leggi il valore.

  3. Scrivi il valore incrementato

  4. Rilasciare il contratto di locazione

  5. utilizzare il valore della tua app / tabella

Poi, se il vostro ruolo lavoratore dovesse bloccarsi durante il processo, allora si avrebbe solo un ID mancante nel tuo negozio. IMHO che è meglio di duplicati.

Ecco un esempio e ulteriori informazioni su questo approccio di Steve Marx

Se si ha realmente bisogno per evitare di GUID, Hai pensato di usare qualcosa sulla base di data / ora e poi sfruttando tasti di parzializzazione per minimizzare il rischio di concorrenza.

La chiave di partizione potrebbe essere per utente, anno, mese, giorno, ora, ecc e la chiave di fila potrebbe essere il resto del datetime in un piccolo periodo sufficiente a controllare la concorrenza.

Naturalmente dovete chiedere a voi stessi, al prezzo di data Azure, se evitando un Guid è davvero la pena tutto questo sforzo in più (assumendo una Guid sarà solo di lavoro).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top