马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
后端代码的团体学习思绪
- 认识后端项目标团体架构
- 项目分为多个模块,每个模块职责单一。
- 利用了常见的分层筹划: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:数据层
- 布局
- 数据层是后端开发的底子:
- : 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 中有很好的支持,可以通过直接声明范例来快速剖析参数,比方:- @app.get("/items/{item_id}")
- async def read_item(item_id: int, q: Optional[str] = None):
- return {"item_id": item_id, "q": q}
复制代码
2. 相应模子与数据验证
- Pydantic 模子:
- Pydantic 是 FastAPI 的核心工具,用于界说数据模子。它确保哀求和相应的数据符合预期的格式,主动举行 数据验证和序列化。
- 利用 Pydantic,可以方便地界说哀求体和相应体的布局。比方:
- from pydantic import BaseModel
- class Item(BaseModel):
- name: str
- description: Optional[str] = None
- price: float
- tax: Optional[float] = None
复制代码 - 在相应模子中,数据的范例和可选性都可以通过 Pydantic 举行束缚,确保 API 的返回布局 规范化和划一性。
3. 分层筹划与解耦
- 分层架构:
- 在 API 层之下,一样寻常存在服务层和数据层。API 层重要处理处罚 用户哀求、验证数据、错误处理处罚、调用服务层逻辑。
- 服务层 包罗业务逻辑,确保核心逻辑独立于接口。
- 数据层 负责直接与数据库交互,通常通过 ORM(如 SQLAlchemy)举行封装。如许,API 层不会直接利用数据库,而是通过数据层举行哀求。
- 解耦的上风:
- 进步代码的复用性和可维护性。
- 当数据存储方式发生厘革时,只需修改数据层,不必要调解服务层和 API 层。
4. 哀求验证与权限控制
- 数据验证:
- Pydantic 提供了对哀求体、路径参数、查询参数等的验证机制。数据验证应只管在 API 层尽早实行,确保无效的数据不会进入服务层。
- 权限控制:
- API 层的每个接口通常必要举行权限查抄,确保用户有权限访问对应的资源。可以通过
依靠注入(Dependency Injection)
来实现权限验证:- from fastapi import Depends
- def verify_token(token: str = Depends(oauth2_scheme)):
- # 检查 token 是否有效
- return User.get_user(token)
复制代码
5. 错误处理处罚与日志
- 同一的错误处理处罚:
- 为了进步客户端体验,API 层应返回划一的错误相应。在 FastAPI 中,可以通过自界说非常处理处罚器(Exception Handlers)来实现:
- from fastapi import HTTPException
- @app.exception_handler(HTTPException)
- async def http_exception_handler(request, exc):
- return JSONResponse(status_code=exc.status_code, content={"message": exc.detail})
复制代码
- 日志记载:
- 日志记载对于 API 层的可维护性和调试至关告急。可以利用 loguru或 logging模块记载告急利用、告诫和错误:
- from loguru import logger
- logger.info("User requested the assistant list")
复制代码
6. 异步支持与并发性
- 异步 I/O:
- FastAPI 支持异步编程(async / await),这使得处理处罚 I/O 麋集型任务(如数据库查询或外部 API 哀求)时非常高效。
- 公道地将一些不依靠用户输入的利用异步化,可以进步服务器的 并发处理处罚本领。
API 层的开发细节与学习重点
1. 路由的构造与文档天生
- 路由构造:
- 随着项目规模扩大,路由大概变得复杂。可以通过 子路由(APIRouter)来构造差别的路由,保持模块化:
- from fastapi import APIRouter
- user_router = APIRouter()
- @user_router.get("/users/")
- async def get_users():
- return [{"user_id": 1, "name": "Alice"}]
- 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:
- from sqlalchemy.orm import sessionmaker
- Session = sessionmaker(bind=engine)
- session = Session()
- try:
- # 执行多步数据库操作
- session.commit()
- except Exception as e:
- session.rollback()
- raise e
复制代码
3. 依靠注入(Dependency Injection)
- 依靠注入 是 FastAPI 中非常强盛的功能,可以用来实现哀求的认证、权限验证、数据库毗连的管理等。
- 比方,利用依靠注入来管理数据库毗连:
- from fastapi import Depends
- from sqlalchemy.orm import Session
- def get_db():
- db = Session()
- try:
- yield db
- finally:
- db.close()
- @app.get("/items/")
- def read_items(db: Session = Depends(get_db)):
- 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 来认证身份。
- from fastapi.security import OAuth2PasswordBearer
- oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
- @app.get("/users/me")
- async def read_users_me(token: str = Depends(oauth2_scheme)):
- return get_user_from_token(token)
复制代码 - CORS(跨域资源共享):
- 后端必要设置 CORS,以允许前端跨域访问。FastAPI 提供了 CORSMiddleware 可以很方便地实现 CORS 设置。
7. 性能优化与高效开发工具
- 缓存机制:
- 对于常常访问但不常变的数据(如用户信息),可以利用缓存(如 Redis 或 InMemoryCache)来淘汰数据库访问次数。
- 异步任务与队列:
- 对于复杂、耗时的任务,可以利用 任务队列(如 Celery),将任务放到背景处理处罚,从而提拔 API 相应速率。
- 代码天生与脚手架:
- 利用框架天生器或脚手架工具(如 Cookiecutter)可以加快初始项目标开发,确保布局公道并淘汰重复工作。
8. 代码质量与测试
- 单位测试与集成测试:
- 编写 单位测试 测试 API 层中的每个独立功能,比方数据验证、权限控制、错误处理处罚等。
- 编写 集成测试 以测试完备的 API 哀求流(包罗数据库利用)。
- 主动化测试工具:
- FastAPI 提供了对 TestClient 的支持,利用它可以模拟 HTTP 哀求,方便编写测试代码:
- from fastapi.testclient import TestClient
- client = TestClient(app)
- def test_read_main():
- response = client.get("/")
- assert response.status_code == 200
- 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 中)
- @router.post('/chat/completions', response_class=StreamingResponse)
- async def chat_completions(request: APIChatCompletion, Authorize: AuthJWT = Depends()):
- # messages 为 openai 格式。此时不支持复杂多轮聊天,暂时处理
- message = None
- if request.messages:
- last_message = request.messages[-1]
- if 'content' in last_message:
- message = last_message['content']
- else:
- logger.info('last_message={}', last_message)
- message = last_message
- session_id = request.session_id or uuid1().hex # 会话ID, 如果没有提供会自动生成
- payload = {'user_name': 'root', 'user_id': 1, 'role': 'admin'}
- access_token = Authorize.create_access_token(subject=json.dumps(payload), expires_time=864000) # 创建JWT token
- url = f'ws://127.0.0.1:7860/api/v1/chat/{request.model}?chat_id={session_id}&t={access_token}' # WebSocket连接的URL
- web_conn = await chat_imp.get_connection(url, session_id) # 调用 services 层的 get_connection 方法,获取 WebSocket 连接
- return StreamingResponse(
- chat_imp.event_stream(web_conn, message, session_id, request.model, request.streaming),
- media_type='text/event-stream'
- )
复制代码 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)
- async def get_connection(uri, identifier):
- """
- 获取 WebSocket 连接。如果连接池中有可用的连接,则直接返回;
- 否则,创建新的连接并添加到连接池。
- """
- if connection_pool[identifier].empty():
- # 建立新的 WebSocket 连接
- websocket = await connect(uri)
- await connection_pool[identifier].put_nowait(websocket)
- # 从连接池中获取连接
- websocket = await connection_pool[identifier].get_nowait()
- 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 类代码
- class TimedQueue:
- def __init__(self):
- self.queue = asyncio.Queue()
- self.last_active = datetime.now()
- async def put_nowait(self, item):
- self.last_active = datetime.now()
- await self.queue.put(item)
- async def get_nowait(self):
- self.last_active = datetime.now()
- return await self.queue.get()
- def empty(self):
- return self.queue.empty()
- def qsize(self):
- return self.queue.qsize()
复制代码
- put_nowait:将一个 WebSocket 毗连加入队列,并更新近来活动时间。
- get_nowait:从队列中获取一个 WebSocket 毗连,并更新近来活动时间。
- empty 和 qsize:分别查抄队列是否为空和获取队列的巨细。
4. 清算不生动毗连
为了制止内存走漏和积存无用的 WebSocket 毗连,体系会定期清算那些长时间不生动的毗连。- async def clean_inactive_queues(queue: defaultdict, timeout_threshold: timedelta):
- while True:
- current_time = datetime.now()
- for key, timed_queue in list(queue.items()):
- if current_time - timed_queue.last_active > timeout_threshold:
- while not timed_queue.empty():
- timed_queue.get_nowait() # 清理无用连接
- del queue[key] # 删除该会话的连接池
- 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 毗连和会话逻辑的核心部分,公道地抽离到单独的模块是项目布局筹划的最佳实践。
|