Question

Je développe actuellement une application pour Azure Table Storage. Dans cette application, je tableau qui aura des inserts relativement peu (un couple de mille / jour) et la clé primaire de ces entités seront utilisées dans une autre table, ce qui aura des milliards de lignes.

Par conséquent, je suis à la recherche d'un moyen d'utiliser un entier auto-incrémentée, au lieu de GUID, comme clé primaire dans la petite table (car il permettra d'économiser beaucoup de stockage et l'évolutivité des inserts est pas vraiment un problème).

Il y a eu des discussions sur le sujet, par exemple sur http: //social.msdn. microsoft.com/Forums/en/windowsazure/thread/6b7d1ece-301b-44f1-85ab-eeb274349797 .

Cependant, étant donné que les problèmes de concurrence peuvent être vraiment difficiles à déboguer et place, je suis un peu mal à l'aise avec la mise en œuvre cela sur propre. Ma question est donc s'il y a un impelemntation bien testé cela?

Était-ce utile?

La solution

Je ne l'ai pas mis en œuvre ce encore, mais je travaille là-dessus ...

Vous pouvez semer une file d'attente avec vos prochaines ids à utiliser, puis il suffit de les enlever la file d'attente lorsque vous en avez besoin.

Vous devez garder une table pour contenir la valeur du plus grand nombre ajouté à la file d'attente. Si vous savez que vous ne comptez pas utiliser une tonne de nombres entiers, vous pourriez avoir un travailleur tout aussi souvent réveiller et assurez-vous que la file d'attente a encore des entiers en elle. Vous pouvez également avoir une file d'attente utilisé int le travailleur pourrait vérifier de garder un oeil sur l'utilisation.

Vous pouvez également brancher jusqu'à ce travailleur si la file d'attente était vide lorsque votre code avait besoin d'un identifiant (par hasard), il pourrait sieste perpétuellement détaché le travailleur pour créer plus de clés le plus tôt possible.

Si cet appel vous avez échoué auriez besoin d'un moyen de (indiquer au travailleur que vous allez faire le travail pour eux (verrouillage), puis faire le travail des travailleurs d'obtenir le prochain id et déverrouiller)

  1. serrure
  2. obtenir la clé de la dernière création de la table
  3. incrément et économisez
  4. déverrouiller

utiliser la nouvelle valeur.

Autres conseils

Pour tous ceux qui trouveront à la recherche, il y a une meilleure solution. temps minimal pour le verrouillage de la table est 15 secondes - c'est terrible. Ne pas utiliser si vous voulez créer une solution vraiment évolutive. Utilisez Etag!

Créer une entité dans le tableau d'ID (vous pouvez même le nom comme ID ou autre).

1) lire.

2) Increment.

3) InsertOrUpdate ETag spécifiée (à partir de la requête de lecture).

si la dernière opération (InsertOrUpdate) réussit, alors vous avez une nouvelle ID unique, auto-incrémentée. Si elle échoue (exception avec HttpStatusCode == 412), cela signifie qu'un autre client a changé. Donc, répéter à nouveau 1,2 et 3. Le temps habituel pour Read+InsertOrUpdate est inférieure à 200ms . Mon test utilitaire avec la source sur GitHub .

Voir UniqueIdGenerator classe par Josh Twist.

Si vous avez vraiment besoin pour éviter GUIDs, avez-vous pensé à utiliser quelque chose basé sur la date / heure et tirant parti de clés de partition pour minimiser le risque de concurrence.

La clé de partition pourrait être par l'utilisateur, année, mois, jour, heure, etc et la clé de ligne pourrait être le reste du datetime à un assez petit timespan pour contrôler la concurrence.

Bien sûr, vous devez vous demander, au prix de ce jour dans Azure, si éviter une Guid vaut vraiment tout cet effort supplémentaire (en supposant un Guid va juste travailler).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top