签入版本
This commit is contained in:
@@ -0,0 +1,240 @@
|
||||
# 同步架构设计
|
||||
|
||||
## 概述
|
||||
|
||||
Flask 是一个基于 WSGI 的同步 Web 框架,采用同步编程模型。本文档介绍项目的同步架构设计及其优势。
|
||||
|
||||
:::tip 为什么选择同步架构?
|
||||
1. **成熟稳定**:Flask 的同步模型经过长期验证,稳定可靠
|
||||
2. **易于理解**:同步编程模型更直观,易于调试和维护
|
||||
3. **工具完善**:Flask 生态完善,各种扩展和工具支持良好
|
||||
4. **部署简单**:WSGI 标准,支持多种部署方式
|
||||
:::
|
||||
|
||||
## 同步模型特性
|
||||
|
||||
| 特性 | 说明 |
|
||||
|:-----|:-----|
|
||||
| 编程模型 | 同步 `def` |
|
||||
| 并发处理 | 多线程/多进程(由 WSGI 服务器管理) |
|
||||
| I/O 等待 | 阻塞当前线程,其他线程不受影响 |
|
||||
| 学习曲线 | 平缓,标准 Python 编程 |
|
||||
| 调试难度 | 简单,标准 pdb 调试 |
|
||||
| 生态支持 | 完善,Flask 扩展生态丰富 |
|
||||
|
||||
## Flask 同步模型
|
||||
|
||||
### 请求处理流程
|
||||
|
||||
```
|
||||
客户端请求
|
||||
↓
|
||||
WSGI 服务器(Gunicorn)
|
||||
↓
|
||||
Flask 应用
|
||||
↓
|
||||
中间件链(before_request)
|
||||
↓
|
||||
路由分发(Blueprint)
|
||||
↓
|
||||
视图函数(Router)
|
||||
↓
|
||||
Service 层
|
||||
↓
|
||||
Repository 层
|
||||
↓
|
||||
SQLAlchemy ORM
|
||||
↓
|
||||
数据库
|
||||
↓
|
||||
返回响应
|
||||
```
|
||||
|
||||
### 多线程/多进程
|
||||
|
||||
Flask 通过 WSGI 服务器(如 Gunicorn)实现并发处理:
|
||||
|
||||
```bash
|
||||
# 使用 Gunicorn 启动,4 个工作进程,每个进程 4 个线程
|
||||
gunicorn -w 4 -t 4 app:app
|
||||
```
|
||||
|
||||
| 参数 | 说明 |
|
||||
|:-----|:-----|
|
||||
| `-w 4` | 4 个工作进程 |
|
||||
| `-t 4` | 每个进程 4 个线程 |
|
||||
| `app:app` | Flask 应用实例 |
|
||||
|
||||
## 同步代码示例
|
||||
|
||||
### Service 层
|
||||
|
||||
```python
|
||||
# src/modules/system/position/service.py
|
||||
from src.common.base_service import BaseService
|
||||
from src.core.exceptions import BizError
|
||||
from src.modules.system.position.schema import PositionForm, PositionStatusForm
|
||||
from src.modules.system.position.repository import PositionRepository
|
||||
from src.modules.system.user.repository import UserRepository
|
||||
|
||||
|
||||
class PositionService(BaseService):
|
||||
"""
|
||||
岗位服务类
|
||||
|
||||
所有方法均为同步 classmethod,通过 Repository 访问数据库。
|
||||
"""
|
||||
repository = PositionRepository
|
||||
form = PositionForm
|
||||
status_form = PositionStatusForm
|
||||
model_name = "岗位"
|
||||
|
||||
@classmethod
|
||||
def before_delete(cls, ids):
|
||||
"""删除前校验:检查用户引用"""
|
||||
for pid in ids:
|
||||
if UserRepository.count_by({'position_id': pid}) > 0:
|
||||
raise BizError(f"岗位ID {pid} 已被用户引用,无法删除")
|
||||
```
|
||||
|
||||
### Repository 层
|
||||
|
||||
```python
|
||||
# src/modules/system/position/repository.py
|
||||
from src.common.base_repository import BaseRepository
|
||||
from src.common.constants.common import PAGE_SIZE
|
||||
from src.modules.system.position.models import Position
|
||||
|
||||
|
||||
class PositionRepository(BaseRepository):
|
||||
"""岗位数据仓储"""
|
||||
model = Position
|
||||
|
||||
@classmethod
|
||||
def page(cls, params: dict):
|
||||
"""分页查询:同步调用基类 find_page"""
|
||||
return cls.find_page(
|
||||
page=int(params.get('pageNo', 1)),
|
||||
page_size=int(params.get('pageSize', PAGE_SIZE)),
|
||||
filters={'status': params.get('status')},
|
||||
like_filters={'name': params.get('name')},
|
||||
order_by='sort',
|
||||
)
|
||||
|
||||
@classmethod
|
||||
def list_enabled(cls, params=None):
|
||||
"""查询启用的岗位列表"""
|
||||
params = params or {}
|
||||
return cls.find_list(
|
||||
filters={'status': 1},
|
||||
like_filters={'name': params.get('name')},
|
||||
order_by='sort',
|
||||
)
|
||||
```
|
||||
|
||||
## 同步架构优势
|
||||
|
||||
### 1. 代码简洁
|
||||
|
||||
同步代码更直观,易于理解和维护:
|
||||
|
||||
```python
|
||||
# 同步代码(本项目)
|
||||
from src.modules.system.position.service import get_position_page
|
||||
|
||||
def page():
|
||||
"""同步调用 service"""
|
||||
return R.ok(data=get_position_page(request.args))
|
||||
```
|
||||
|
||||
### 2. 调试简单
|
||||
|
||||
同步代码的调试更简单,标准 Python 调试工具直接可用:
|
||||
|
||||
```python
|
||||
# 同步调试:直接使用 pdb
|
||||
import pdb; pdb.set_trace()
|
||||
```
|
||||
|
||||
### 3. 生态完善
|
||||
|
||||
Flask 生态完善,各种扩展支持良好:
|
||||
|
||||
| 扩展 | 用途 |
|
||||
|:-----|:-----|
|
||||
| Flask-SQLAlchemy | ORM 集成 |
|
||||
| Flask-Migrate | 数据库迁移 |
|
||||
| Flask-CORS | 跨域资源共享 |
|
||||
| Flask-WTF | 表单校验(WTForms 集成) |
|
||||
| redis-py | Redis 同步客户端 |
|
||||
| APScheduler | 定时任务调度 |
|
||||
|
||||
### 4. 部署简单
|
||||
|
||||
WSGI 标准,支持多种部署方式:
|
||||
|
||||
```bash
|
||||
# Gunicorn(推荐)
|
||||
gunicorn -w 4 -t 4 app:app
|
||||
|
||||
# uWSGI
|
||||
uwsgi --http 0.0.0.0:8021 --wsgi-file app.py --callable app
|
||||
|
||||
# Flask 内置服务器(仅开发)
|
||||
python app.py
|
||||
```
|
||||
|
||||
## 性能优化
|
||||
|
||||
### 1. 连接池
|
||||
|
||||
SQLAlchemy 使用连接池管理数据库连接:
|
||||
|
||||
```python
|
||||
from sqlalchemy import create_engine
|
||||
|
||||
engine = create_engine(
|
||||
DB_URL,
|
||||
pool_size=10, # 连接池大小
|
||||
max_overflow=20, # 最大溢出连接数
|
||||
pool_recycle=3600, # 连接回收时间(秒)
|
||||
)
|
||||
```
|
||||
|
||||
### 2. 缓存
|
||||
|
||||
使用 Redis 缓存热点数据:
|
||||
|
||||
```python
|
||||
def get_position_list(self):
|
||||
"""获取岗位列表(带缓存)"""
|
||||
cache_key = "position:list"
|
||||
cached = redis.get(cache_key)
|
||||
if cached:
|
||||
return json.loads(cached)
|
||||
|
||||
# 查询数据库
|
||||
positions = cls.repository.find_list(filters={'status': 1})
|
||||
result = [p.to_dict() for p in positions]
|
||||
|
||||
# 写入缓存
|
||||
redis.set(cache_key, json.dumps(result), ex=3600)
|
||||
return result
|
||||
```
|
||||
|
||||
### 3. 定时任务
|
||||
|
||||
项目使用 APScheduler 实现定时任务调度,任务定义存储在数据库中:
|
||||
|
||||
```python
|
||||
# src/core/scheduler.py
|
||||
from apscheduler.schedulers.background import BackgroundScheduler
|
||||
|
||||
scheduler = BackgroundScheduler()
|
||||
```
|
||||
|
||||
定时任务在独立线程中执行,不阻塞主请求处理流程。支持 Cron、Interval、Date 三种触发器,通过 Redis 实现多实例互斥,避免重复执行。
|
||||
|
||||
## 总结
|
||||
|
||||
项目采用 Flask 同步架构,具有成熟稳定、易于理解、工具完善、部署简单等优势。对于后台管理系统这类以 CRUD 为主的场景,同步模型完全够用,代码更简洁,调试更方便。通过连接池、Redis 缓存、APScheduler 定时任务等技术,可以进一步优化性能。
|
||||
Reference in New Issue
Block a user