Pregunta

En el siguiente escenario:

1 base de datos 4 servidores web

¿Cómo generan los servidores web identificaciones únicas para la base de datos para que sean únicas? Sí, es posible usar el incremento automático, pero esto se rastrea / adivina demasiado fácilmente, etc. Por lo tanto, el incremento automático no es actualmente una opción.

¿Fue útil?

Solución

Use un UUID ( http://www.ietf.org/rfc/rfc4122.txt ). Las colisiones son poco probables, y podrían tratarse cuando ocurren mediante la regeneración de un nuevo UUID, o podrían evitarse concatenando una identificación única para cada servidor (como la dirección mac): -

StringBuilder sb = new StringBuilder(UUID.randomUUID());
InetAddress address = InetAddress.getLocalHost();
String uid = sb.append(NetworkInterface.getByInetAddress(address).getHardwareAddress());

Otros consejos

Puede usar un UUID:

import java.util.UUID;        

UUID uuid = UUID.randomUUID();
System.out.println(uuid.toString());

Si está realmente preocupado por las colisiones, puede pregenerar sus claves y almacenarlas en una tabla de base de datos con un índice único. Luego, realice un trabajo periódico que llene la tabla durante el tiempo de inactividad y elimine / archive las claves usadas de vez en cuando.

¿Qué sistema de base de datos está utilizando? ¿La aplicación sabe qué servidor está haciendo la solicitud? ¿Deja que la base de datos decida la clave o la configura en código?

Podría ser tan simple como usar un incremento automático con un prefijo o un segundo campo que indica el servidor que solicitó la clave.

No estoy seguro de por qué un incremento automático o secuencia es inaceptable. ¿Desea que una identificación interna no sea "adivinable"? ¿Es como si fuera un número de cuenta y no quieres que alguien pueda adivinar un número de cuenta válido?

Bueno, está bien, además de los UUID ya mencionados, se me ocurren dos posibilidades obvias.

  1. Use una secuencia, luego genere un número aleatorio y cree el número de cuenta a partir de una combinación de los dos usando un algoritmo tal que dos números de secuencias diferentes no puedan dar el mismo número final. Por ejemplo, un algoritmo simple sería: tomar el siguiente número de secuencia, multiplicar por 12345678, generar un número aleatorio de 0 a 12345678-1 y sumar los dos juntos.

  2. Tener una tabla en la base de datos con un registro, que contiene el último número asignado. Cada vez que necesite un nuevo número, bloquee este registro, use el valor anterior para generar el siguiente valor y actualice el registro. Mientras los números siempre aumenten, se garantiza que no tendrá un duplicado.

Si tiene algún esquema que utiliza un identificador del servidor como parte del identificador, le animo a que no tenga ese identificador simplemente como un número almacenado en un archivo de configuración en alguna parte. Ahora estoy trabajando en un sistema en el que alguien tuvo la brillante idea de dar a cada servidor una "identificación del servidor". que está integrado para registrar las identificaciones, y la identificación del servidor es un número entero pequeño que se asigna manualmente. No es demasiado difícil en la producción donde solo hay 3 servidores. Pero en el desarrollo y las pruebas, donde los nuevos servidores suben y bajan todo el tiempo y los archivos de configuración de prueba se lanzan constantemente, es difícil administrarlos. Evitaría usar un período de identificación del servidor, pero si va a usar uno, haga que un servidor central lo asigne automáticamente, o lo derive de la IP, o algo seguro.

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