Skip to content

同步架构设计 ​

概述 ​

Flask 是一个基于 WSGI 的同步 Web 框架,采用同步编程模型。本文档介绍项目的同步架构设计及其优势。

为什么选择同步架构?

  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 44 个工作进程
-t 4每个进程 4 个线程
app:appFlask 应用实例

同步代码示例 ​

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-SQLAlchemyORM 集成
Flask-Migrate数据库迁移
Flask-CORS跨域资源共享
Flask-WTF表单校验(WTForms 集成)
redis-pyRedis 同步客户端
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 定时任务等技术,可以进一步优化性能。

小蚂蚁云团队 · 提供技术支持