异步信号与分布式锁:防止高并发下重复处理
在Django异步视图中使用信号解耦业务,结合Redis分布式锁确保幂等性,防止事务边界外的重复消费。 · 难度:入门 · +10XP
异步信号与分布式锁
Django信号默认同步执行,在异步环境下可能带来阻塞。本教程教你基于 asgiref.sync.sync_to_async 实现纯异步信号发射器,并集成Redlock算法:当信号处理函数可能被多个worker同时触发时(例如用户注册后发欢迎邮件),先尝试获取锁,获取成功则执行,否则直接返回。最终实现一个防重复、可控制并发度的异步信号系统。
import asyncio
from aioredlock import Aioredlock
from django.dispatch import Signal
class AsyncSignal(Signal):
async def asend(self, sender, **kwargs):
lock = await redis_lock.lock(f'signal:{self}:{sender.pk}', lock_timeout=10)
if lock:
try:
for receiver in self._receivers:
await receiver(sender, **kwargs)
finally:
await redis_lock.unlock(lock)