架构的学习

[复制链接]
发表于 2025-12-16 10:51:54 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
后端代码的团体学习思绪


  • 认识后端项目标团体架构

    • 项目分为多个模块,每个模块职责单一。
    • 利用了常见的分层筹划:API 层、服务层、数据层。
    • 高度模块化,比方 API 按版本分别,数据库和缓存独立管理。

  • 相识重要技能栈

    • 确认利用的框架(如 Flask, FastAPI, Django)。
    • 数据库 ORM(如 SQLAlchemy, Django ORM)。
    • 缓存体系(如 Redis)。
    • 异步任务管理工具(如 Celery)。


学习路径:模块拆解分析

1. api:接口开发与版本管理


  • 布局

    • v1/schema 和 v2/schema 是 API 数据模子,界说了前后端交互的哀求与相应格式。
    • errcode 管理错误码或状态码,提拔可维护性。
    • services 中是接口逻辑的具体实现。

  • 学习发起

    • 学习怎样界说 RESTful API 的路由和视图函数。
    • 分析接口版本控制(v1, v2)的筹划思绪。
    • 明白怎样构造和同一错误处理处罚(errcode)。


2. services:服务层逻辑


  • 布局

    • 服务层代码按功能分别,比方:

      • auth: 用户认证与授权。
      • cache: 缓存管理。
      • database: 数据库干系利用。
      • task: 异步任务处理处罚。
      • settings: 体系设置管理。


  • 学习发起

    • 深入分析 auth 模块,看用户身份验证的具体实现(如 JWT Token 或 OAuth)。
    • cache 模块可以资助明白怎样高效利用 Redis 来加快查询或暂时存储。
    • 在 task 模块中,学习怎样筹划异步任务队列和后端任务调治。


3. database:数据层


  • 布局

    • 数据层是后端开发的底子:

        1. models
        复制代码
        : ORM 模子界说。

        • 比方:api_key, user 等代表了项目标核心数据表。

      • data: 数据初始化或迁徙文件。


  • 学习发起

    • 学习怎样筹划和实现数据库模子(ORM)。
    • 通过 models
      下的代码,相识怎样映射关系型数据库表。
    • 假如有迁徙脚本(如 Alembic),研究数据库版本管理的流程。


4. core 和 utils:核心逻辑与工具函数


  • core

    • 存放核心的业务逻辑,大概是项目独特功能的实现。
    • 必要连合项目文档来明白其作用。

  • utils

    • 工具函数聚集,用于解耦重复代码。
    • 大概包罗日志日志记载、时间处理处罚、数据验证等通用逻辑。

  • 学习发起

    • 在 core 中学习复杂逻辑的实现本领。
    • 从 utils 中总结高效编写复用代码的方式。


5. cache 和 worker:缓存与背景任务


  • cache

    • 实现后端缓存机制,通常基于 Redis。
    • 进步体系性能,淘汰数据库查询压力。

  • worker

    • 异步任务调治逻辑。
    • knowledge 大概处理处罚某种知识图谱或大规模数据盘算。

  • 学习发起

    • 阅读缓存模块代码,明白缓存失效战略和数据长期化方案。
    • 学习怎样通过消息队列(如 RabbitMQ, Kafka)或 Celery 筹划背景任务。


6. template:模板与前后端协作


  • 布局

    • 界说前后端交互的底子布局(如字段格式化)。
    • 大概和前端 Vue/React 共同利用。

  • 学习发起

    • 明白后端如作甚前端动态天生数据或模板。
    • 学习模板如安在接口数据层面优化前后端协作。


7. interface:功能模块接口


  • 布局

    • 这是最模块化的部分,功能非常丰富。
    • 模块包罗:

      • document_loaders:文档加载。
      • vector_store:向量存储。
      • text_splitters:文天职割。
      • embeddings:向量化处理处罚。
      • prompts:处理处罚提示词。


  • 学习发起

    • 分析具体模块代码,明白怎样实现数据处理处罚与功能封装。
    • 学习如作甚复杂的功能筹划接口。


辅助学习发起


  • 从简朴的模块开始

    • 初学者可以先从 api 和 services 学起,由于这些模块直接表现了后端逻辑的底子。
    • 认识 HTTP 哀求与相应、路由筹划以及服务层实现。

  • 调试运行

    • 在本地运行服务,调试 API 的哀求与相应,明白每个模块在项目中的作用。

  • 查阅框架文档

    • 假如项目利用 FastAPI 或 Flask 等框架,发起查察官方文档,明白核心概念和实践方法。

  • 训练动手扩展

    • 为现有的 API 添加一个新功能。
    • 修改 services 的某个逻辑,感受其扩展性。

  • 学习最佳实践

    • 关注代码风格、非常处理处罚、日志日志记载等。
    • 总结代码模块化筹划的头脑,思考怎样将其应用到自己的项目中。

API层的开发核生理念

bisheng/api/services/assistant.py

  • 该项目利用FastAPI框架来处理处罚API哀求,并通过类(如AssistantService)实现业务逻辑。
  • 在AssistantService中,采取**类方法(如@classmethod)**的方式来封装各个业务利用,好比获取助手、创建助手、更新状态等。
1. 路由和视图筹划


  • 路由(Routes):

    • 路由的筹划应该轻便且易于明白,一样寻常采取 RESTful 风格,只管依照标准 HTTP 方法。比方,GET 用于读取数据,POST 用于创建,PUT/PATCH 用于更新,DELETE 用于删除。
    • 路由的定名应只管与资源的实体精密对应,确保 语义化 和 划一性。比方:/api/v1/users/ 表现用户的资源列表,/api/v1/users/{user_id}/ 表现具体用户的利用。

  • 视图函数(Views):

    • 视图函数处理处罚特定的 HTTP 哀求(如 GET, POST, PUT, DELETE)。每个视图函数负责一个特定的动作,确保 单一职责。
    • 路径参数、查询参数 和 哀求体
      在 FastAPI 中有很好的支持,可以通过直接声明范例来快速剖析参数,比方:
      1. @app.get("/items/{item_id}")
      2. async def read_item(item_id: int, q: Optional[str] = None):
      3.     return {"item_id": item_id, "q": q}
      复制代码

2. 相应模子与数据验证


  • Pydantic 模子:

    • Pydantic 是 FastAPI 的核心工具,用于界说数据模子。它确保哀求和相应的数据符合预期的格式,主动举行 数据验证和序列化。
    • 利用 Pydantic,可以方便地界说哀求体和相应体的布局。比方:
      1. from pydantic import BaseModel
      2. class Item(BaseModel):
      3.     name: str
      4.     description: Optional[str] = None
      5.     price: float
      6.     tax: Optional[float] = None
      复制代码
    • 在相应模子中,数据的范例和可选性都可以通过 Pydantic 举行束缚,确保 API 的返回布局 规范化和划一性。

3. 分层筹划与解耦


  • 分层架构:

    • 在 API 层之下,一样寻常存在服务层和数据层。API 层重要处理处罚 用户哀求、验证数据、错误处理处罚、调用服务层逻辑。
    • 服务层 包罗业务逻辑,确保核心逻辑独立于接口。
    • 数据层 负责直接与数据库交互,通常通过 ORM(如 SQLAlchemy)举行封装。如许,API 层不会直接利用数据库,而是通过数据层举行哀求。

  • 解耦的上风:

    • 进步代码的复用性和可维护性。
    • 当数据存储方式发生厘革时,只需修改数据层,不必要调解服务层和 API 层。

4. 哀求验证与权限控制


  • 数据验证:

    • Pydantic 提供了对哀求体、路径参数、查询参数等的验证机制。数据验证应只管在 API 层尽早实行,确保无效的数据不会进入服务层。

  • 权限控制:

    • API 层的每个接口通常必要举行权限查抄,确保用户有权限访问对应的资源。可以通过
      依靠注入(Dependency Injection)
      来实现权限验证:
      1. from fastapi import Depends
      2. def verify_token(token: str = Depends(oauth2_scheme)):
      3.     # 检查 token 是否有效
      4.     return User.get_user(token)
      复制代码

5. 错误处理处罚与日志日志


  • 同一的错误处理处罚:

    • 为了进步客户端体验,API 层应返回划一的错误相应。在 FastAPI 中,可以通过自界说非常处理处罚器(Exception Handlers)来实现:
      1. from fastapi import HTTPException
      2. @app.exception_handler(HTTPException)
      3. async def http_exception_handler(request, exc):
      4.     return JSONResponse(status_code=exc.status_code, content={"message": exc.detail})
      复制代码

  • 日志记载:

    • 日志记载对于 API 层的可维护性和调试至关告急。可以利用 loguru或 logging模块记载告急利用、告诫和错误:
      1. from loguru import logger
      2. logger.info("User requested the assistant list")
      复制代码

6. 异步支持与并发性


  • 异步 I/O:

    • FastAPI 支持异步编程(async / await),这使得处理处罚 I/O 麋集型任务(如数据库查询或外部 API 哀求)时非常高效。
    • 公道地将一些不依靠用户输入的利用异步化,可以进步服务器的 并发处理处罚本领。


API 层的开发细节与学习重点

1. 路由的构造与文档天生


  • 路由构造:

    • 随着项目规模扩大,路由大概变得复杂。可以通过 子路由(APIRouter)来构造差别的路由,保持模块化:
      1. from fastapi import APIRouter
      2. user_router = APIRouter()
      3. @user_router.get("/users/")
      4. async def get_users():
      5.     return [{"user_id": 1, "name": "Alice"}]
      6. app.include_router(user_router, prefix="/api/v1")
      复制代码

  • 主动文档天生:

    • FastAPI 提供了基于 OpenAPI 的主动文档天生,全部的 API 路由都可以通过 /docs 或 /redoc 访问主动天生的 API 文档。确保 API 层的每个参数和返回值都明白标注,以便天生清晰的文档。

2. 数据库利用与事故管理


  • ORM 与 DAO 模式:

    • ORM(如 SQLAlchemy 或 Tortoise ORM) 用于将数据库表映射为 Python 对象,简化了数据库利用。
    • 利用 DAO(数据访问对象) 模式,将全部数据库利用封装在 DAO 中,比方 AssistantDao.get_one_assistant(assistant_id),这种方式便于测试和维护。

  • 事故管理:

    • 假如一个 API 利用涉及到多个数据库利用,最好利用变瞎搅包管数据的完备性。比方,利用 SQLAlchemy 的 session:
      1. from sqlalchemy.orm import sessionmaker
      2. Session = sessionmaker(bind=engine)
      3. session = Session()
      4. try:
      5.     # 执行多步数据库操作
      6.     session.commit()
      7. except Exception as e:
      8.     session.rollback()
      9.     raise e
      复制代码

3. 依靠注入(Dependency Injection)


  • 依靠注入 是 FastAPI 中非常强盛的功能,可以用来实现哀求的认证、权限验证、数据库毗连的管理等。
  • 比方,利用依靠注入来管理数据库毗连:
    1. from fastapi import Depends
    2. from sqlalchemy.orm import Session
    3. def get_db():
    4.     db = Session()
    5.     try:
    6.         yield db
    7.     finally:
    8.         db.close()
    9. @app.get("/items/")
    10. def read_items(db: Session = Depends(get_db)):
    11.     return db.query(Item).all()
    复制代码
4. 权限控制的实现细节


  • 在大型项目中,权限控制通常基于 RBAC(基于脚色的访问控制) 或 ABAC(基于属性的访问控制)。
  • 利用脚色访问控制(RBAC):

    • 用户脚色(UserRoleDao) 和 权限表(RoleAccessDao)。
    • 每次 API 哀求都必要验证用户是否有权限实行某个利用,这些利用被抽象成特定的 访问范例(AccessType),比方 ASSISTANT_READ 或 ASSISTANT_WRITE。

5. 哀求钩子与审计日志


  • 在实行告急的 API 利用后,比方创建或删除资源时,常常必要触发一些额外逻辑,这些逻辑可以封装在 钩子函数 中。
  • 审计日志 是用于记载关键利用的日志,确保在发生标题时可以或许追踪利用过程。比方,利用 AuditLogService.create_build_assistant 写入利用记载。
  • 这些审计记载可以资助企业实现 安全合规,特别是在处理处罚敏感数据时,审计日志是须要的要求。
6. API 安全性


  • 认证:

    • API 通常通过 JWT(JSON Web Token) 来实现用户认证。用户登录时获取一个 token,之后的哀求都通过该 token 来认证身份。
    1. from fastapi.security import OAuth2PasswordBearer
    2. oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
    3. @app.get("/users/me")
    4. async def read_users_me(token: str = Depends(oauth2_scheme)):
    5.     return get_user_from_token(token)
    复制代码
  • CORS(跨域资源共享):

    • 后端必要设置 CORS,以允许前端跨域访问。FastAPI 提供了 CORSMiddleware 可以很方便地实现 CORS 设置。

7. 性能优化与高效开发工具


  • 缓存机制:

    • 对于常常访问但不常变的数据(如用户信息),可以利用缓存(如 Redis 或 InMemoryCache)来淘汰数据库访问次数。

  • 异步任务与队列:

    • 对于复杂、耗时的任务,可以利用 任务队列(如 Celery),将任务放到背景处理处罚,从而提拔 API 相应速率。

  • 代码天生与脚手架:

    • 利用框架天生器或脚手架工具(如 Cookiecutter)可以加快初始项目标开发,确保布局公道并淘汰重复工作。

8. 代码质量与测试


  • 单位测试与集成测试:

    • 编写 单位测试 测试 API 层中的每个独立功能,比方数据验证、权限控制、错误处理处罚等。
    • 编写 集成测试 以测试完备的 API 哀求流(包罗数据库利用)。

  • 主动化测试工具:

    • FastAPI 提供了对 TestClient 的支持,利用它可以模拟 HTTP 哀求,方便编写测试代码:
    1. from fastapi.testclient import TestClient
    2. client = TestClient(app)
    3. def test_read_main():
    4.     response = client.get("/")
    5.     assert response.status_code == 200
    6.     assert response.json() == {"msg": "Hello World"}
    复制代码
Service层的开发核生理念

chat.py→chat_impy.py

好的,我明白了。你想要深入相识从前端发送哀求到 API 层的 chat_completions 方法,再到 services/chat_impl.py 层的 get_connection 方法是怎样被调用的。让我们渐渐梳理这段哀求的整个处理处罚流程。
1. 前端哀求到达 chat_completions API 方法

在前端发起一个哀求时,它会通过 HTTP POST 哀求调用 API 接口。假设这个哀求是发送到 /chat/completions 路径。具体来说,前端发送的哀求内容通常包罗谈天消息(messages)、会话 ID(session_id)、模子范例(model)以及是否开启流式返回(streaming)等信息。
chat_completions 方法(在 chat.py 中)
  1. @router.post('/chat/completions', response_class=StreamingResponse)
  2. async def chat_completions(request: APIChatCompletion, Authorize: AuthJWT = Depends()):
  3.     # messages 为 openai 格式。此时不支持复杂多轮聊天,暂时处理
  4.     message = None
  5.     if request.messages:
  6.         last_message = request.messages[-1]
  7.         if 'content' in last_message:
  8.             message = last_message['content']
  9.         else:
  10.             logger.info('last_message={}', last_message)
  11.             message = last_message
  12.     session_id = request.session_id or uuid1().hex  # 会话ID, 如果没有提供会自动生成
  13.     payload = {'user_name': 'root', 'user_id': 1, 'role': 'admin'}
  14.     access_token = Authorize.create_access_token(subject=json.dumps(payload), expires_time=864000)  # 创建JWT token
  15.     url = f'ws://127.0.0.1:7860/api/v1/chat/{request.model}?chat_id={session_id}&t={access_token}'  # WebSocket连接的URL
  16.     web_conn = await chat_imp.get_connection(url, session_id)  # 调用 services 层的 get_connection 方法,获取 WebSocket 连接
  17.     return StreamingResponse(
  18.         chat_imp.event_stream(web_conn, message, session_id, request.model, request.streaming),
  19.         media_type='text/event-stream'
  20.     )
复制代码
chat_completions 方法剖析


  • request 参数:request 是一个 APIChatCompletion 范例的对象,通常由 FastAPI 主动剖析传入的哀求数据。APIChatCompletion 应该是一个 Pydantic 模子,用来界说哀求体的布局,包罗 messages、session_id、model、streaming 等字段。
  • 消息处理处罚:

    • if request.messages::起首查抄哀求中是否包罗消息数据。
    • message = last_message['content']:假如消息数据存在,取出末了一条消息的 content 字段,通常是用户输入的消息。

  • 会话 ID:假如哀求中没有转达 session_id,则会天生一个新的 UUID,作为会话 ID。
  • 天生 JWT token:

    • Authorize.create_access_token(subject=json.dumps(payload), expires_time=864000):创建一个 JWT token,此中 payload 包罗了 user_name、user_id 和 role 等信息,expires_time 设置为 10 天。

  • 构建 WebSocket URL:

    • url = f'ws://127.0.0.1:7860/api/v1/chat/{request.model}?chat_id={session_id}&t={access_token}':根据哀求中的 model(模子范例)和 session_id,构建 WebSocket 毗连的 URL,access_token 作为 URL 参数转达。

  • 调用 get_connection 获取 WebSocket 毗连:

    • web_conn = await chat_imp.get_connection(url, session_id):调用 chat_imp 模块中的 get_connection 方法,获取与长途服务器的 WebSocket 毗连。

  • 返回 StreamingResponse:

    • StreamingResponse 是 FastAPI 提供的相应范例,允许返回流式数据。在这里,chat_imp.event_stream() 是一个异步天生器,它会渐渐返回谈天的结果。
    • media_type='text/event-stream':指定返回数据范例为 text/event-stream,这通常用于服务器发送事故(SSE)或 WebSocket 数据流。

2. get_connection 方法的实现

get_connection 是在 services/chat_impl.py 中界说的一个异步方法。它的任务是管理 WebSocket 毗连,起首查抄是否已经存在该会话的 WebSocket 毗连,假如没有,则创建一个新的毗连,并将其存入毗连池。
get_connection 方法代码(chat_impl.py)
  1. async def get_connection(uri, identifier):
  2.     """
  3.     获取 WebSocket 连接。如果连接池中有可用的连接,则直接返回;
  4.     否则,创建新的连接并添加到连接池。
  5.     """
  6.     if connection_pool[identifier].empty():
  7.         # 建立新的 WebSocket 连接
  8.         websocket = await connect(uri)
  9.         await connection_pool[identifier].put_nowait(websocket)
  10.     # 从连接池中获取连接
  11.     websocket = await connection_pool[identifier].get_nowait()
  12.     return websocket
复制代码
get_connection 方法剖析


  • 查抄毗连池是否有可用的毗连:

    • if connection_pool[identifier].empty():查抄 connection_pool 中是否有指定 identifier(即会话 ID)对应的 WebSocket 毗连池。connection_pool 是一个 defaultdict,每个会话 ID 对应一个 TimedQueue(一个支持异步利用的队列)。假如这个队列为空,表现当前没有可用的毗连。

  • 假如没有毗连,创建新的 WebSocket 毗连:

    • websocket = await connect(uri):假如毗连池中没有可用的毗连,调用 websockets.connect(uri) 创建一个新的 WebSocket 毗连。uri 是之前从 chat_completions 方法构建的 WebSocket 地点。

  • 将新的 WebSocket 毗连加入毗连池:

    • await connection_pool[identifier].put_nowait(websocket):将新创建的 WebSocket 毗连加入对应会话 ID 的毗连池中,供后续利用。

  • 从毗连池中获取 WebSocket 毗连:

    • websocket = await connection_pool[identifier].get_nowait():从毗连池中获取一个 WebSocket 毗连。假如之前已经有毗连存在,则直接返回该毗连,而无需重新创建。

  • 返回 WebSocket 毗连:

    • return websocket:返回获取到的 WebSocket 毗连。

3. WebSocket 毗连的池化管理

在 chat_impl.py 中,WebSocket 毗连池由 TimedQueue 类管理。TimedQueue 维护了一个 asyncio.Queue 用于存储 WebSocket 毗连,同时记载末了一次活动的时间。假如一个毗连长时间没有活动,它会被清算掉。
TimedQueue 类代码
  1. class TimedQueue:
  2.     def __init__(self):
  3.         self.queue = asyncio.Queue()
  4.         self.last_active = datetime.now()
  5.     async def put_nowait(self, item):
  6.         self.last_active = datetime.now()
  7.         await self.queue.put(item)
  8.     async def get_nowait(self):
  9.         self.last_active = datetime.now()
  10.         return await self.queue.get()
  11.     def empty(self):
  12.         return self.queue.empty()
  13.     def qsize(self):
  14.         return self.queue.qsize()
复制代码

  • put_nowait:将一个 WebSocket 毗连加入队列,并更新近来活动时间。
  • get_nowait:从队列中获取一个 WebSocket 毗连,并更新近来活动时间。
  • empty 和 qsize:分别查抄队列是否为空和获取队列的巨细。
4. 清算不生动毗连

为了制止内存走漏和积存无用的 WebSocket 毗连,体系会定期清算那些长时间不生动的毗连。
  1. async def clean_inactive_queues(queue: defaultdict, timeout_threshold: timedelta):
  2.     while True:
  3.         current_time = datetime.now()
  4.         for key, timed_queue in list(queue.items()):
  5.             if current_time - timed_queue.last_active > timeout_threshold:
  6.                 while not timed_queue.empty():
  7.                     timed_queue.get_nowait()  # 清理无用连接
  8.                 del queue[key]  # 删除该会话的连接池
  9.         await asyncio.sleep(timeout_threshold.total_seconds())
复制代码
总结


  • 前端哀求到达 chat_completions 方法:前端通过 HTTP POST 哀求发送消息到 /chat/completions,哀求中包罗 messages、session_id、model、streaming 等信息。
  • API 层处理处罚哀求:chat_completions 方法从哀求中提取消息,并天生会话 ID 和 JWT token,构建 WebSocket 毗连的 URL。
  • 获取 WebSocket 毗连:chat_completions 调用 get_connection 方法,查抄毗连池是否已有毗连,若没有,则创建新的 WebSocket 毗连并返回。
  • WebSocket 毗连池管理:get_connection 方法负责毗连池的管理,确保每个
会话 ID 都有一个 WebSocket 毗连,并支持复用毗连。 5. 返回流式数据:末了,chat_completions 利用 StreamingResponse 返回流式数据(通过 event_stream 方法)。
manager.py

在这个项目布局中,chat/manager.py 文件为何没有放置到 api/services 文件夹下,而是单独存在于 chat 目次中,这是由其职责和功能决定的。为了更好地明白这种构造方式,我们必要具体地分析代码的作用、项目分层筹划的理念,以及管理层代码和服务层代码的区别。
代码的职责与项目分层的分析

为了明白为什么 ChatManager 存放在 chat 目次中,而不是放在 api/services 中,我们必要深入明白这个项目标分层筹划和每一层的职责。以下是对项目分层及其职责的具体分析:

  • 项目条理分别

    • API 层 (bisheng/api):负责界说接口、路由和 HTTP 或 WebSocket 的处理处罚逻辑。它的职责是吸取外部的哀求,举行验证和转发处理处罚结果。
    • 服务层 (bisheng/api/services):负责具体的业务逻辑实现,它是应用步调的核心。API 层通过调用服务层的接口,来完成具体的业务逻辑利用。
    • 数据库层 (bisheng/database):负责与数据库交互,处理处罚数据的增编削查。重要通过 DAO(Data Access Object)模式与数据库举行交互。
    • 缓存层 (bisheng/cache):用于存储数据缓存、会话状态等,以进步查询的速率,淘汰数据库压力。
    • 谈天逻辑与管理层 (bisheng/chat):负责具体的谈天实现、会话管理、WebSocket 毗连管理等内容。

  • ChatManager 的职责

    • WebSocket 毗连管理:ChatManager 类负责管理 WebSocket 毗连的生命周期,包罗担当毗连、发送消息、处理处罚断开等功能。
    • 谈天会话管理:它负责处理处罚与谈天干系的上下文信息,包罗存储谈天记载、管理汗青信息等。
    • 与后端业务逻辑的交互:它还负责调治和实行后端复杂的谈天逻辑,比方对接模子天生复兴、处理处罚多步调利用(如文件上传息争析)等。

这些职责显着区别于 API 层和服务层的职责:

  • API 层:它只是界说路由并处理处罚哀求的入口,将哀求的验证和处理处罚任务交给服务层。
  • 服务层:负责与具体的业务逻辑有关的处理处罚,如用户登录、权限管理、任务实行等。
  • 谈天逻辑与管理层 (chat/manager.py):负责更为复杂的谈天逻辑、WebSocket 毗连的管理和消息的调治处理处罚。
因此,将 ChatManager 如许与 WebSocket 长毗连和消息调治密切干系的代码放在 chat 目次中,更符合分层筹划原则和代码职责的分别。它是整个体系中非常告急的一个模块,负责实现与前端之间的及时双向通讯,而不但仅是服务层的简朴业务逻辑处理处罚。
ChatManager 不属于服务层的缘故原由

具体来说,ChatManager 中的许多逻辑超出了传统业务服务的范畴。ChatManager 的职责包罗管理 WebSocket 毗连、调治长时间运行的任务、处理处罚谈天记载、与其他异步任务交互等。而这些功能是直接与谈天的实现和管理干系的,必要与客户端举行高频交互。因此,ChatManager 不能被简朴地分别到服务层中,由于服务层重要是业务逻辑的实现,通常是同步的、短期的任务,而 ChatManager 涉及更多异步、并发、高频交互的逻辑。
谈天逻辑与服务层的区别


  • 业务服务层的特点:

    • 同步利用:大多数利用都是同步的,处理处罚完一次哀求后返回结果,好比用户登录、权限校验等。
    • 短期任务:任务的实行时间较短,是直接相应 HTTP 哀求的。
    • 无状态性:大多数环境下,服务层不维护长时间的状态,除了缓存之外,它重要是通过哀求中转达的数据来处理处罚逻辑。

  • 谈天管理层的特点:

    • 异步与及时交互:WebSocket 毗连必要保持及时通讯,这与 HTTP 哀求/相应模子差别,它必要长时间保持毗连。
    • 长时间的任务与状态管理:在谈天过程中,必要维持会话状态,管理毗连的生命周期,特别是处理处罚流式数据和文件上传等任务。
    • 并发与协程:ChatManager 中利用了 asyncio 和 ThreadPoolManager 来处理处罚并发任务,这些任务通常是长时间的,比方与大语言模子举行多轮对话时,必要异步调用模子服务来获取复兴。

chat/manager.py 的位置分析

在项目布局中,chat/manager.py 位于 bisheng/chat 目次下,这种布局有助于将与谈天干系的逻辑和管理会合在一起,保持代码的模块化和关注点分离。将谈天逻辑与其他范例的服务(如用户管理、权限校验等)区分开,可以制止谈天逻辑与其他业务逻辑的耦合,也可以淘汰复杂度。
别的,chat/manager.py 文件中还界说了一些类,如 ChatHistory 和 ChatManager,这些类直接负责谈天的管理,它们的逻辑与服务层的通例业务逻辑(比方数据库增编削查、任务实行等)有所区别。对于谈天如许的复杂功能模块,单独将其作为一个模块来实现,可以使代码布局更加清晰,有利于维护和扩展。
项目布局的筹划上风


  • 清晰的模块分别:将谈天的管理、服务逻辑、数据处理处罚等模块化分别,符合面向对象筹划的单一职责原则,使每个模块只负责特定的一部分功能。
  • 便于扩展:将谈天管理作为独立模块,可以单独优化谈天逻辑或添加新功能,而无需影响其他部分。比方,后期可以独立改进谈天逻辑,或集成更多的模子和功能。
  • 关注点分离:ChatManager 专注于 WebSocket 长毗连的管理和对话逻辑,而 API 层只负责路由和哀求处理处罚,服务层只负责业务逻辑的实现,这种分离使得各个模块的职责清晰。
代码模块化的总结

项目标模块化筹划,特别是将谈天逻辑单独放置在 chat 目次中,而非将 ChatManager 等逻辑放在服务层中,重要有以下几点缘故原由:

  • 差别职责的模块分离:ChatManager 的职责是 WebSocket 管理和谈天逻辑,这和服务层的业务逻辑有本质区别,它是及时的、必要状态管理的,而服务层的逻辑更方向于处理处罚哀求的一次性任务。
  • 异步与并发处理处罚:ChatManager 必要管理长毗连并发、流式处理处罚、文件传输等任务,这些复杂的异步任务不得当放到通例服务层中。
  • 模块的扩展性和维护性:谈天管理层作为一个独立模块,便于开发者会合精神举行谈天逻辑的优化,而不影响其他业务逻辑的实现。
因此,项目标布局筹划是基于模块化、职责分离以及高内聚低耦合的原则,包管了体系的可扩展性和可维护性。ChatManager 类位于 chat 目次中,属于谈天模块,是 WebSocket 毗连和会话逻辑的核心部分,公道地抽离到单独的模块是项目布局筹划的最佳实践。
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表