Sélecteur de nœud par hachage de rendezvous
Attribuez une clé à un nœud de votre liste : user:42 parmi cache-a, cache-b et cache-c tombe sur cache-a et y reste tant que les nœuds et la graine ne changent pas. Le score de chaque nœud est affiché pour auditer le choix. Gratuit dans votre navigateur.
- Gratuit
- Fonctionne dans votre navigateur
- Sans inscription
- Vos données restent sur votre appareil
Lancer gratuitement
Exemple résolu
- Key
- user:42
- Nœuds
- cache-a, cache-b, cache-c
- Graine
- Sélectionné
- cache-a
- Nombre de nœuds
- 3
Le hachage de rendezvous, aussi appelé highest random weight hashing, assigne chaque clé à exactement un nœud de l’ensemble actif sans anneau de nœuds virtuels. Pour chaque nœud candidat, l’algorithme combine la clé avec l’identifiant du nœud, classe les scores et retient le gagnant. Lorsqu’un nœud rejoint ou quitte l’ensemble, seules se déplacent les clés qui préféraient le nœud parti ou qui préfèrent désormais le nouvel arrivant ; le reste reste en place, de sorte que le taux de succès du cache et la propriété des shards restent stables face aux changements d’appartenance. Ce sélecteur accepte une clé de routage, une liste d’identifiants de nœuds, une graine de cluster optionnelle et des poids positifs optionnels, puis renvoie le nœud choisi et le tableau complet des scores pour que vous puissiez auditer ou tester le placement.
Comment le hachage de rendezvous choisit un nœud pour une clé
Le consistent hashing a popularisé l’idée de placer les clés sur un anneau afin qu’ajouter ou retirer un nœud ne remappe qu’une petite fraction des clés. Le hachage de rendezvous résout le même problème d’équilibrage de charge avec un contrat plus simple : pour chaque nœud de l’ensemble d’appartenance courant, calculez un score qui ne dépend que de la clé et de l’identité de ce nœud, puis sélectionnez le score le plus élevé.
Le nom classique « highest random weight » reflète que le hachage se comporte comme un poids pseudo-aléatoire par paire. Comme le score du nœud A ne dépend jamais de la présence de B, retirer B n’affecte que les clés pour lesquelles B était le gagnant ; toutes les autres préfèrent encore le même survivant. Ajouter un nœud C ne vole que les clés qui obtiennent un score plus élevé avec C qu’avec leur propriétaire précédent.
Cette disruption minimale explique pourquoi les caches, les POP de bordure et les bases de données fragmentées utilisent le rendezvous lorsqu’ils veulent une propriété équilibrée sans maintenir un grand anneau de nœuds virtuels. Ce point d’accès implémente le HRW non pondéré avec un mélange FNV-1a 32 bits de graine optionnelle, de clé et de chaque id de nœud : le hachage non signé est le score, pour des comparaisons entières stables.
Lorsque vous fournissez des poids positifs parallèles à la liste de nœuds, l’algorithme passe au HRW pondéré : le hachage est projeté sur un intervalle unitaire u dans (0,1] et le score devient u élevé à un sur le poids, de sorte que les nœuds plus lourds gagnent plus souvent tout en restant pleinement déterministes. Les égalités — rares avec 32 bits mais possibles — se départagent en choisissant l’id de nœud lexicographiquement plus petit afin que deux clients ne divergent jamais.
Où un sélecteur de nœud rendezvous apporte de la valeur
Les développeurs d’applications utilisent un sélecteur de nœud par hachage de rendezvous pour épingler des sessions utilisateur, des shards d’objets ou des compteurs de limitation de débit à un backend stable sans dresser d’anneaux ZooKeeper ni de grandes bibliothèques de consistent hashing. Les équipes CDN et de bordure multi-région mappent les clés de contenu vers des POP pour que l’affinité de cache survive à la montée en charge.
Les flottes de jeux et d’IoT routent les ids d’appareils vers des workers de simulation et ne remaillent que la fraction qui préférait un nœud parti. Les pipelines de données qui partitionnent des clés style Kafka entre consommateurs peuvent simuler hors ligne des changements d’appartenance en alimentant des listes candidates dans la même fonction pure que les workers appelleront.
Cas d’usage
Affinité de cache et de shards
Mappez des clés d’objet ou d’utilisateur vers des répliques de cache ou des shards de base afin qu’un changement d’appartenance ne déplace que les clés qui préféraient le nœud ajouté ou retiré.
Routage de bordure multi-région
Choisissez un POP ou un worker dans une liste saine et à jour pour chaque clé de contenu, avec des poids optionnels lorsque la capacité varie entre régions.
Simulations hors ligne de rééquilibrage
Fournissez des listes de nœuds planifiées au même sélecteur déterministe en CI pour mesurer combien de clés bougeraient avant de changer l’appartenance en production.
Questions fréquentes
Qu’est-ce que le hachage de rendezvous (highest random weight) ?
Il note chaque paire (clé, nœud) avec un hachage et retient le score le plus élevé. Seules se déplacent les clés qui préféraient un nœud retiré ou qui préfèrent un nœud nouvellement ajouté ; le reste reste en place.
Comment sélectionner un nœud pour une clé ?
Envoyez key et nodes (un ou plusieurs ids de nœuds uniques). Le champ selected de la réponse est le nœud gagnant.
En quoi cela diffère-t-il du consistent hashing ?
Le consistent hashing place clés et nœuds virtuels sur un anneau. Le rendezvous n’a besoin ni d’anneau ni de nœuds virtuels : seulement la liste vivante des nœuds et un hachage de clé plus nœud, ce qui simplifie les mises à jour d’appartenance.
Les nœuds peuvent-ils avoir des capacités différentes ?
La méthode bascule en HRW pondéré (u à la puissance 1/poids) pour que les nœuds plus lourds gagnent plus souvent tout en restant déterministes.
Que deviennent les autres clés quand un nœud est retiré ?
Elles restent où elles étaient. Le score d'un nœud ne dépend que de la clé et de ce nœud : retirer un nœud ne déplace que les clés qu'il gagnait, et en ajouter un ne lui attribue que les clés qui obtiennent désormais un meilleur score avec lui.
Outils associés
Pour les développeurs — accès API
Tout sur cette page est disponible par programmation. Cette section s'adresse aux équipes qui veulent l'intégrer à leurs systèmes ; les autres peuvent simplement utiliser l'outil ci-dessus.
Endpoint
Authentification par jeton Bearer : un seul POST met la tâche en file d’attente, et le résultat vous parvient par webhook ou lien signé.
Appeler depuis votre stack
curl -X POST https://api.kit.forhosting.com/dev/rendezvous-hash \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"key":"user:42","nodes":["cache-a","cache-b","cache-c"]}'const res = await fetch("https://api.kit.forhosting.com/dev/rendezvous-hash", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"key": "user:42",
"nodes": [
"cache-a",
"cache-b",
"cache-c"
]
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/dev/rendezvous-hash",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"key": "user:42",
"nodes": [
"cache-a",
"cache-b",
"cache-c"
]
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/dev/rendezvous-hash", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"key":"user:42","nodes":["cache-a","cache-b","cache-c"]}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"key":"user:42","nodes":["cache-a","cache-b","cache-c"]}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/dev/rendezvous-hash", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Exemple de requête
{
"key": "user:42",
"nodes": [
"cache-a",
"cache-b",
"cache-c"
]
}Exemple de réponse
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "dev.rendezvous_hash",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}L’API est asynchrone : chaque appel renvoie un task_id immédiatement, puis vous interrogez l’état à raison d’une requête par seconde.
Tarifs
Le prix est publié, sans tokens ni crédits. Une tâche qui échoue n’est pas facturée.
Erreurs
| HTTP | Code | Signification |
|---|---|---|
401 | unauthorized | Clé API absente ou invalide : vérifiez l’en-tête Authorization. |
402 | insufficient_balance | Solde insuffisant : rechargez votre compte pour lancer cette tâche. |
404 | unknown_type | Type de tâche inconnu : vérifiez le champ type de votre requête. |
429 | rate_limited | Trop de requêtes : ralentissez la cadence, puis réessayez. |
Notes techniques
L’implémentation parse pure est déterministe dans le navigateur et via l’API, ne consomme aucun jeton de modèle et n’accède jamais au réseau.
Contrat d’entrée, forme de la réponse et règles de validation
Ce tableau complet est volontaire : les bancs de charge et les revues de code doivent souvent prouver pourquoi une clé a atterri sur un hôte donné. Associez le sélecteur à vos contrôles de santé — ne passez que des ids sains dans nodes — pour que les hôtes en panne sortent de la course des scores sans logique spéciale dans le hachage. Envoyez un corps JSON avec key (chaîne non vide après trim ; alias object_key) et nodes (tableau d’un à mille ids de nœuds distincts non vides ; alias members). La seed optionnelle (alias salt) est un sel de chaîne préfixé à la clé pour que des clusters indépendants mappent la même clé métier différemment sans collision dans le tableau des scores ; omettez-la ou passez une chaîne vide s’il n’y a pas de sel. weights optionnel est un tableau de nombres finis positifs de même longueur que nodes ; omettez-le pour un rendezvous à poids égaux. Clés vides, listes vides, entrées nulles, ids en double, poids non positifs ou longueurs qui ne correspondent pas échouent avec invalid_input et ne sont pas facturés. En cas de succès, la réponse répète key et seed, nomme le nœud sélectionné, indique node_count, fixe method à rendezvous_hrw ou weighted_rendezvous_hrw et renvoie scores : un tableau d’objets avec node, weight, score et l’entier hash sous-jacent, trié par score décroissant puis nom de nœud croissant. Exemple : key user:42 avec nodes cache-a, cache-b, cache-c produit un seul nom de cache sélectionné qui ne changera pas tant que l’appartenance ou la seed ne changent pas.
Où un sélecteur de nœud rendezvous apporte de la valeur
Les sites de contenu qui se positionnent sur « rendezvous hashing » ou « highest random weight » profitent d’un outil gratuit dans le navigateur dont les réponses coïncident octet pour octet avec l’API payante. Comme l’implémentation est parse pure de niveau A, chaque appel réussi coûte le prix de base publié $0.002 sans jetons de modèle ni réseau sortant ; une validation échouée ne consomme pas le solde.
Questions techniques
Combien coûte le sélecteur de nœud par hachage de rendezvous ?
L’outil navigateur est gratuit. Les requêtes API utilisent le solde prépayé KIT à $0.002 par appel réussi ; une entrée invalide n’est pas facturée.