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

  1. 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).
  2. Interval de Temps: El període durant el qual es compten les sol·licituds (per exemple, per minut, per hora).
  3. 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

  1. Control de Flux: Redueix la velocitat de processament de les sol·licituds per evitar sobrecàrregues.
  2. Distribució de Sol·licituds: Les sol·licituds es distribueixen en el temps per mantenir una càrrega constant i manejable.
  3. 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.

© Copyright 2024. Tots els drets reservats