112 votes

Distribué numéro de séquence de génération?

J'ai généralement mise en œuvre de la séquence de génération de nombres à l'aide de la base de données de séquences dans le passé.

par exemple, à l'Aide de Postgres SÉRIE du type http://neilconway.org/docs/sequences/

Je suis curieux de savoir si, comme la façon de générer des numéros de séquence pour de grands systèmes distribués où il n'existe pas de base de données. Parviendrez-vous avez de l'expérience ou des suggestions de meilleure pratique pour la réalisation de la séquence de génération de nombres dans un thread-safe manière pour plusieurs clients?

127voto

Jesper Mortensen Points 2028

OK, c'est une très vieille question, qui je suis le premier à voir maintenant.

Vous aurez besoin de différencier les numéros de séquence et les Identifiants uniques qui sont (éventuellement) librement triables par un critère spécifique (généralement le temps de génération). Vrai numéros de séquence implique la connaissance de ce que tous les autres travailleurs ont fait, et de ce fait, exigent un état partagé. Il n'y a pas de moyen facile de faire cela dans un système distribué, à grande échelle. Vous pouvez regarder les choses de réseau, comme les émissions, fenêtré varie pour chaque travailleur, et distribué des tables de hachage unique pour les travailleurs de l'IDs, mais c'est beaucoup de travail.

Les Identifiants uniques sont une autre affaire, il y a plusieurs bonnes façons de générer des Identifiants uniques de manière décentralisée:

a) Vous pouvez utiliser Twitter de Flocon de neige de l'ID de réseau de service. Flocon de neige est un:

  • Service en réseau, c'est à dire que vous faites un appel du réseau pour obtenir un IDENTIFIANT unique;
  • qui produit de 64 bits d'Id uniques qui sont commandés par temps de génération;
  • et le service est très extensible et (potentiellement) très disponible; chaque instance peut générer plusieurs milliers d'utilisateurs par seconde, et vous pouvez exécuter plusieurs instances sur votre réseau LAN/WAN;
  • écrit en Scala, tourne sur la JVM.

b) Vous pouvez générer des Id uniques sur les clients eux-mêmes, à l'aide d'une approche dérivée de la façon dont Uuid et le Flocon de neige à l'IDs sont faites. Il y a plusieurs options, mais quelque chose le long des lignes de:

  • Le plus significatif de 40 bits: Un timestamp; le temps de génération de l'ID. (Nous sommes en utilisant les bits les plus significatifs pour l'horodatage de faire des Id de tri-mesure par temps de génération.)

  • Le prochain de 14 ou alors bits: par générateur de comptoir, qui chaque générateur incréments de un pour chaque nouvelle ID généré. Cela garantit que les Identifiants générés au même moment (même les horodatages) ne se chevauchent pas.

  • Le dernier 10 bits: Une valeur unique pour chaque générateur. Avec cela, nous n'avons pas besoin de faire une synchronisation entre les générateurs (ce qui est extrêmement dur), comme tous les générateurs produisent de la non-cumul des Id en raison de cette valeur.

c) Vous pouvez générer des Id sur les clients, juste en utilisant un horodatage et la valeur aléatoire. Cela évite la nécessité de connaître tous les générateurs, et d'attribuer à chaque générateur d'une valeur unique. Sur le revers de la médaille, ces Id ne sont pas garantis pour être unique au monde, ils sont très susceptibles d'être unique. (À entrer en collision, un ou plusieurs générateurs de créer la même valeur aléatoire à exactement le même temps.) Quelque chose le long des lignes de:

  • Les plus importantes 32 bits: Timestamp, le temps de génération de l'ID.
  • Le moins significatif de 32 bits: 32 bits de l'aléatoire, généré à nouveau pour chaque ID.

d) la voie de La facilité, utiliser les Uuid / Guid.

17voto

Steven Schlansker Points 17463

Vous pourriez avoir chaque nœud avoir un ID unique (à laquelle vous pouvez avoir toute façon) et puis ajouter que le numéro de séquence.

Par exemple, le nœud 1 génère la séquence de 001-00001 001-00002 001-00003 etc. et le nœud 5 génère 005-00001 005-00002

Unique :-)

Alternativement, si vous voulez une sorte d'un système centralisé, vous pourriez envisager d'avoir votre séquence de serveur dans les blocs. Cela réduit la charge considérablement. Par exemple, au lieu de demander un nouveau numéro d'identification à partir du serveur central pour chaque ID, qui doit être attribué, vous demande de l'Id dans des blocs de 10 000 à partir du serveur central et alors plus qu'à faire une autre demande de réseau lorsque vous exécutez.

17voto

Paolo Points 419

Il y a maintenant plus d'options.

- Tu cette question est "vieux", je suis arrivé ici, je pense donc qu'il pourrait être utile de laisser les options que je connais (pour l'instant):

  • Vous pouvez essayer de Hazelcast. Dans sa version 1.9, il comprend un système Distribué de la mise en œuvre de java.util.de façon concomitante.AtomicLong
  • Vous pouvez également utiliser Zookeeper. Il fournit des méthodes pour la création de la séquence de nœuds (en annexe znode noms, tu, je préfère utiliser les numéros de version des nœuds). Être prudent avec celui-ci tu: si vous ne voulez pas manquer les numéros dans votre séquence, il peut ne pas être ce que vous voulez.

Cheers

11voto

Nikita Koksharov Points 1552

Il peut être fait avec Redisson. Il met en œuvre distribuée et scalable version de AtomicLong. Ici est un exemple:

Config config = new Config();
config.addAddress("some.server.com:8291");

Redisson redisson = Redisson.create(config);
RAtomicLong atomicLong = redisson.getAtomicLong("anyAtomicLong");
atomicLong.incrementAndGet();

8voto

wsorenson Points 2364

Si elle a vraiment à être globalement séquentielle, et pas simplement unique, alors je voudrais envisager la création d'un seul et même service pour la distribution de ces numéros.

Systèmes distribués compter sur beaucoup de petits services en interaction, et pour cette simple tâche, avez-vous vraiment besoin ou voulez-vous vraiment profiter de quelques autres complexes, une solution distribuée?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X