2017-01-23 1 views
1

Notre produit est une API de repos que nous devons redimensionner et rendre redondante. Notre objectif est d'utiliser nginx comme un équilibreur de charge et un proxy qui transmettra les requêtes api à trois serveurs différents, qui seront tous connectés au même jeu de réplicas MongoDB.Mise à l'échelle API REST - Architecture

Notre api a une limitation de débit basée sur la clé API de l'utilisateur. L'utilisateur aura plusieurs clients et tous signeront leurs demandes avec la même clé API.

J'ai deux questions à ce sujet:

  1. emplois Cron multiples doivent être exécutée sur la base. Comment pouvons-nous nous nous assurons qu'un seul des serveurs exécute les crons, mais si ce serveur est en panne, un autre les exécute à la place?
  2. Comment pouvons-nous appliquer les limites de vitesse combinées sur tous les serveurs. Comment faire , nous permettons une clé API pour obtenir 1000 demandes par jour sur les trois serveurs combinés?

Répondre

0

Plusieurs tâches cron doivent être exécutées dans la base de données. Comment pouvons-nous nous assurer que seulement un des serveurs exécute les crons, mais si ce serveur est en panne, un autre les exécute à la place?

Envisagez d'utiliser une file d'attente. Tous les travaux cron peuvent être récupérés dans une file d'attente. Comment pouvons-nous imposer les limites de vitesse combinées sur tous les serveurs? Comment pouvons-nous permettre une clé API pour obtenir 1000 demandes par jour sur les trois serveurs combinés? Envisagez de conserver un compteur mis à jour chaque fois qu'un serveur reçoit une requête d'un client hébergé (utilisateur avec une clé API). Vérifiez le compteur (compteur < 1000) lorsqu'un serveur reçoit une demande pour voir si le serveur a consommé son quota.

+0

Question sur le point 2: Que se passe-t-il s'il y a plusieurs demandes par seconde? Vous ne pouvez pas aller à la base de données pour mettre à jour le compteur 10 fois dans une seconde. – giliev

+0

Vrai, mais la mise à jour du compteur peut être asynchrone (n'attendez pas la fin de la mise à jour de la base de données, écrivez dans la file d'attente et traitez la file d'attente à l'aide d'un travail en arrière-plan). Nous pouvons également envisager une base de données en mémoire à condition que nous ayons d'autres fonctionnalités qui peuvent nécessiter une lecture-écriture plus rapide. – Sumanth