Pregunta

Actualmente estoy desarrollando una aplicación para Azure Storage Table. En dicha solicitud tengo mesa que tienen relativamente pocas inserciones (un par de miles / día) y la clave principal de estas entidades se utilizará en otra mesa, lo que tendrá mil millones de filas.

Por lo tanto estoy buscando una manera de utilizar un entero auto-incrementales, en lugar de GUID, como clave primaria en la mesa pequeña (ya que se ahorrará un montón de almacenamiento y escalabilidad de los insertos no es realmente un problema).

Ha habido algunos debates sobre el tema, por ejemplo, en http: //social.msdn. microsoft.com/Forums/en/windowsazure/thread/6b7d1ece-301b-44f1-85ab-eeb274349797 .

Sin embargo, ya que los problemas de concurrencia pueden ser muy difíciles de depurar y al contado, estoy un poco incómodo con la aplicación de esto en cuenta. Por lo tanto, mi pregunta es si hay un impelemntation bien probado esto?

¿Fue útil?

Solución

No he implementado este todavía, pero estoy trabajando en ello ...

Se puede sembrar una cola con los siguientes identificadores de usar, y luego simplemente recogerlos de la cola cuando los necesite.

Es necesario tener una tabla para contener el valor del mayor número añadido a la cola. Si sabe que no va a utilizar una tonelada de los números enteros, usted podría tener un trabajador de vez en cuando se despiertan y asegúrese de que la cola todavía tiene enteros en ella. También podría tener una cola int utiliza el trabajador podría comprobar para mantener un ojo en su uso.

También se puede conectar a ese trabajador por lo que si la cola estaba vacía cuando el código necesario un id (por casualidad) que podría interrumpirla siesta del trabajador para crear más teclas lo antes posible.

Si la llamada no se necesitaría una manera de (decirle al trabajador que se va a hacer el trabajo por ellos (bloqueo), y luego hacer el trabajo de los trabajadores de conseguir el siguiente ID y desbloquear)

  1. Bloqueo
  2. obtener la última tecla creado a partir de la tabla
  3. incremento y guardar
  4. desbloqueo

a continuación, utilizar el nuevo valor.

Otros consejos

Para todos los que lo encontrará en la búsqueda, hay una solución mejor. tiempo mínimo para bloqueo de tabla es 15 segundos - eso es horrible. No lo use si desea crear una solución realmente escalable. Utilice Etag!

Crea una entidad en la tabla de ID (incluso se puede nombrar como identificación o lo que sea).

1) leerlo.

2) Incremento.

3) InsertOrUpdate CON ETag especificado (de la consulta de lectura).

Si la última operación (InsertOrUpdate) tiene éxito, entonces usted tiene un nuevo, único, identificador de auto-incrementales. Si se produce un error (excepción con == HttpStatusCode 412), significa que algún otro cliente cambió. Por lo tanto, repetir de nuevo 1,2 y 3. El tiempo habitual para Read+InsertOrUpdate es inferior a 200 ms . Mi utilidad de prueba con fuente en GitHub .

La solución que encontré que impide que los identificadores duplicados y le permite AutoIncrement es a

  1. bloqueo (arrendamiento) una gota y dejar que actúan como una puerta lógica.

  2. A continuación, lea el valor.

  3. Escribir el valor incrementado

  4. Versión el contrato de arrendamiento

  5. Utilice el valor en su aplicación / tabla

A continuación, si su rol de trabajo fueron a estrellarse durante ese proceso, entonces usted sólo tiene un ID que falta en su tienda. En mi humilde opinión que es mejor que los duplicados.

Este es un ejemplo de código y más información en este enfoque de Steve Marx

Si realmente necesita para evitar guids, ¿ha considerado el uso de algo basado en la fecha / hora y luego el aprovechamiento de claves de partición para reducir al mínimo el riesgo de concurrencia.

Su clave de partición podría ser por el usuario, año, mes, día, hora, etc., y la clave de fila podría ser el resto de la fecha y hora en un pequeño lapso de tiempo suficiente para controlar la concurrencia.

Por supuesto, usted tiene que preguntarse, al precio de la fecha en Azure, si evitar un GUID es realmente vale la pena todo este esfuerzo extra (suponiendo un GUID se acaba de trabajar).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top