中间件优先队列:按条件降级或限流请求
设计智能中间件,根据用户等级或请求路径动态调整处理优先级,并在高负载时优雅降级。 · 难度:入门 · +10XP
优先队列中间件
Django 中间件按顺序执行,但无法动态跳过低优先级请求。本教程将实现一个基于 Redis 有序集合的优先级队列中间件:高等级用户的请求直接通过,普通用户的请求在压力过大时被延迟处理或返回 503。你将学习 process_request 与 process_response 的协作,以及利用 threading 或 asyncio 实现非阻塞排队。
import redis
from django.http import HttpResponse
class PriorityMiddleware:
def __init__(self, get_response):
self.get_response = get_response
self.redis = redis.Redis()
def __call__(self, request):
user_level = request.user.level if request.user.is_authenticated else 0
if user_level >= 10:
# VIP 直通
return self.get_response(request)
# 检查队列长度
queue_len = self.redis.zcard('request_queue')
if queue_len > 100 and user_level < 5:
return HttpResponse('Busy, try later', status=503)
return self.get_response(request)