Aller au contenu principal

Haute disponibilité

Former un cluster​

Le proxy passe en mode cluster dès que CLUSTER_MEMBERS ou CLUSTER_DNS est défini. Chaque nœud accepte alors toutes les requêtes, et les route de façon cohérente vers le nœud responsable de leur bucket, d'après son empreinte.

Tous les nœuds devraient se joindre par le réseau local. Dans un conteneur, réglez CLUSTER_ADVERTISE_ADDR si les nœuds ne se voient pas.

Quand un nœud tombe​

Pendant un court moment, un nœud défaillant n'est pas encore marqué comme tel et reçoit encore des requêtes. Quand elles échouent, le proxy renvoie une 429 simulée qui invite le client à attendre une seconde, avec l'en-tête generated-by-proxy. Votre bibliothèque réessaie donc sans rien faire de spécial ; pour appliquer votre propre attente, repérez cet en-tête.

À l'arrivée ou au départ d'un nœud, la table de hachage change et les 429 peuvent augmenter un moment, le temps que le cluster se stabilise. Pour déployer, remplacez les nœuds un par un, idéalement avec le remplaçant déjà démarré.

Protocole​

Le cluster repose sur SWIM, via memberlist de HashiCorp. C'est un système AP : il n'a besoin d'aucun quorum et tolère une partition réseau. En cas de partition, vous obtenez deux clusters indépendants, ce qui peut ou non vous convenir : configurez votre réseau en conséquence.

Limite globale​

La limite globale d'un bot est gérée par un seul nœud du cluster, sans leader ni élection : si ce nœud part, le cluster en choisit simplement un autre. C'est un goulot d'étranglement qui peut allonger la latence des requêtes les plus lentes, mais les alternatives demandaient un stockage externe ou un quorum. Les webhooks et les requêtes sans jeton ne passent pas par ce mécanisme.

Jetons Bearer​

Les files des bots vivent aussi longtemps que le proxy. Celles des jetons Bearer sont gardées dans un cache LRU (voir MAX_BEARER_COUNT) et réparties selon l'empreinte du jeton plutôt que celle du chemin, pour mieux les étaler entre les nœuds. Leur limite globale est toujours gérée localement.

Cibler un nœud​

Pour déboguer, ajoutez l'en-tête nirn-routed-to à une requête, avec n'importe quelle valeur : le nœud qui la reçoit la traite lui-même au lieu de la router.