Introducció
En aquest tema, explorarem dos conceptes crucials per a la gestió de l'ús de les APIs: el rate limiting i el throttling. Aquests mecanismes són essencials per assegurar que les APIs siguin utilitzades de manera justa i eficient, evitant sobrecàrregues i abusos.
Què és el Rate Limiting?
El rate limiting és una tècnica utilitzada per controlar el nombre de sol·licituds que un client pot fer a una API en un període de temps determinat. Això ajuda a prevenir l'ús excessiu i protegeix els recursos del servidor.
Principis del Rate Limiting
- Límit de Sol·licituds: Defineix el nombre màxim de sol·licituds que es permeten en un interval de temps específic (per exemple, 100 sol·licituds per minut).
- Interval de Temps: El període durant el qual es compten les sol·licituds (per exemple, per minut, per hora).
- Respostes d'Error: Quan es supera el límit, el servidor respon amb un codi d'estat HTTP 429 (Too Many Requests).
Exemple de Rate Limiting
from flask import Flask, request, jsonify from time import time app = Flask(__name__) # Configuració del rate limiting RATE_LIMIT = 100 # Nombre màxim de sol·licituds TIME_WINDOW = 60 # Interval de temps en segons # Emmagatzematge de les sol·licituds per IP requests_log = {} @app.route('/api/resource') def resource(): client_ip = request.remote_addr current_time = time() if client_ip not in requests_log: requests_log[client_ip] = [] # Filtrar sol·licituds antigues requests_log[client_ip] = [timestamp for timestamp in requests_log[client_ip] if current_time - timestamp < TIME_WINDOW] if len(requests_log[client_ip]) >= RATE_LIMIT: return jsonify({"error": "Rate limit exceeded"}), 429 # Registrar la nova sol·licitud requests_log[client_ip].append(current_time) return jsonify({"message": "Request successful"}) if __name__ == '__main__': app.run()
Què és el Throttling?
El throttling és una tècnica similar al rate limiting, però en lloc de bloquejar completament les sol·licituds addicionals, les retarda o les distribueix en el temps per evitar sobrecàrregues.
Principis del Throttling
- Control de Flux: Redueix la velocitat de processament de les sol·licituds per evitar sobrecàrregues.
- Distribució de Sol·licituds: Les sol·licituds es distribueixen en el temps per mantenir una càrrega constant i manejable.
- Respostes d'Error: Pot incloure respostes amb codi d'estat HTTP 503 (Service Unavailable) amb un capçalera Retry-After.
Exemple de Throttling
import time from flask import Flask, request, jsonify app = Flask(__name__) # Configuració del throttling THROTTLE_LIMIT = 10 # Nombre màxim de sol·licituds per segon # Emmagatzematge de les sol·licituds per IP requests_log = {} @app.route('/api/resource') def resource(): client_ip = request.remote_addr current_time = time.time() if client_ip not in requests_log: requests_log[client_ip] = [] # Filtrar sol·licituds antigues requests_log[client_ip] = [timestamp for timestamp in requests_log[client_ip] if current_time - timestamp < 1] if len(requests_log[client_ip]) >= THROTTLE_LIMIT: time.sleep(1) # Retardar la sol·licitud return jsonify({"error": "Throttling applied, please try again later"}), 503 # Registrar la nova sol·licitud requests_log[client_ip].append(current_time) return jsonify({"message": "Request successful"}) if __name__ == '__main__': app.run()
Comparació entre Rate Limiting i Throttling
Característica | Rate Limiting | Throttling |
---|---|---|
Objectiu | Limitar el nombre de sol·licituds | Controlar la velocitat de les sol·licituds |
Resposta a l'excés | Bloqueja sol·licituds addicionals | Retarda o distribueix sol·licituds |
Codi d'estat HTTP | 429 (Too Many Requests) | 503 (Service Unavailable) amb Retry-After |
Ús típic | Prevenir abusos i ús excessiu | Mantenir una càrrega constant i manejable |
Exercici Pràctic
Exercici
Implementa un sistema de rate limiting en una API que permeti un màxim de 50 sol·licituds per minut per usuari. Si un usuari supera aquest límit, la resposta ha de ser un codi d'estat HTTP 429 amb un missatge d'error adequat.
Solució
from flask import Flask, request, jsonify from time import time app = Flask(__name__) # Configuració del rate limiting RATE_LIMIT = 50 # Nombre màxim de sol·licituds TIME_WINDOW = 60 # Interval de temps en segons # Emmagatzematge de les sol·licituds per IP requests_log = {} @app.route('/api/resource') def resource(): client_ip = request.remote_addr current_time = time() if client_ip not in requests_log: requests_log[client_ip] = [] # Filtrar sol·licituds antigues requests_log[client_ip] = [timestamp for timestamp in requests_log[client_ip] if current_time - timestamp < TIME_WINDOW] if len(requests_log[client_ip]) >= RATE_LIMIT: return jsonify({"error": "Rate limit exceeded"}), 429 # Registrar la nova sol·licitud requests_log[client_ip].append(current_time) return jsonify({"message": "Request successful"}) if __name__ == '__main__': app.run()
Conclusió
El rate limiting i el throttling són tècniques essencials per gestionar l'ús de les APIs i assegurar que els recursos del servidor es distribueixin de manera justa i eficient. Implementar aquestes tècniques ajuda a prevenir abusos, mantenir la qualitat del servei i protegir les aplicacions de sobrecàrregues.
Curs de REST API: Principis de Disseny i Desenvolupament d'APIs RESTful
Mòdul 1: Introducció a les APIs RESTful
Mòdul 2: Disseny d'APIs RESTful
- Principis de disseny d'APIs RESTful
- Recursos i URIs
- Mètodes HTTP
- Codis d'estat HTTP
- Versionat d'APIs
- Documentació d'APIs
Mòdul 3: Desenvolupament d'APIs RESTful
- Configuració de l'entorn de desenvolupament
- Creació d'un servidor bàsic
- Gestió de peticions i respostes
- Autenticació i autorització
- Gestió d'errors
- Proves i validació
Mòdul 4: Bones Pràctiques i Seguretat
- Bones pràctiques en el disseny d'APIs
- Seguretat en APIs RESTful
- Rate limiting i throttling
- CORS i polítiques de seguretat
Mòdul 5: Eines i Frameworks
- Postman per a proves d'APIs
- Swagger per a documentació
- Frameworks populars per a APIs RESTful
- Integració contínua i desplegament