如何使用 Django Signal 解耦模块

最近,我负责开发一个重后端的应用。这个应用数据流向复杂,处理逻辑冗余堆积。项目技术栈选择的是 Django + Vuejs。前端使用 Webpack 打包,模块化管理,主要是展示数据。后端涉及的模块多,处理规则多,数据表多,每次涉及之前功能修改时,都消耗大量时间 review 代码。这让我意识到,在复杂应用中,解耦模块非常重要。下面是一些思考和实践。

1. 观察者模式

在实践中,我主要使用的是 Django Signal,实现对模块的解耦。Django Signal 是 Django 对观察者模式的实现和应用。因此,有必要先了解一下观察者模式。观察者模式是软件设计模式的一种。通常,大家会使用等式:发布 + 订阅 = 观察者模式。来表达对观察者模式的理解。实际上,这个等式并不完全正确。发布订阅模式与观察者模式区别:
  • 发布订阅模式的通信依赖于消息队列(RabbitMQ、RocketMQ、ActiveMQ、Kafka、ZeroMQ、MetaMq等),属于异步;观察者模式通常是同步的
  • 发布订阅模式松散耦合,发布者和订阅者甚至所属不同应用;观察者模式所属一个应用
  • Signal,模块内置的信号
  • SignalHandle,模块关注的信号处理句柄
  • CeleryTasks,模块的异步任务