任务与分发(dispatcher / task action)
快速上手
- 按RPC 上手声明方法并生成 action。
- 在
operator()实现业务,通过RPC_AWAIT_*等待异步结果,用RPC_RETURN_*返回。 - 沿用标准服务已有 handler 注册与 dispatcher 初始化;不要手动重复注册每个方法。
定制与详细设计
三层结构
- dispatcher_implement(
src/server_frame/dispatcher/dispatcher_implement.h):atapp module 基类,维护rpc_task_action_set_t(RPC 名 → task action creator)。注册表由 Mako 生成的register_handles_for_<service>()填充。 - 三个单例 dispatcher:
dispatcher 处理消息 cs_msg_dispatcheratgateway 上行的客户端消息(CS RPC) ss_msg_dispatcher服务间 SSMsg(SS RPC)db_msg_dispatcherRedis 连接与回复 - task_manager(
dispatcher/task_manager.h):task 的创建、超时管理、按timeout + type + sequence索引的 generic start/resume 生成器。
task action 基类
| 基类 | 用途 |
|---|---|
task_action_base | 所有 action 的基类:operator() 协程体、超时、trace、result code |
task_action_cs_req_base | 客户端请求:session 校验、响应打包 |
task_action_ss_req_base | 服务间请求:prepare_handle 链、SS 响应打包 |
task_action_ss_rpc_base<Req, Rsp> | 生成的 SS RPC action 使用的类型化请 求/响应基类 |
task_action_no_req_base | 无请求触发的定时/自驱动任务(如 task_action_auto_save_objects) |
生成的 action 在 operator() 中通过 get_request_body() 读取请求,用 get_response_body() 填充响应,
再以 RPC_RETURN_CODE 返回。可直接使用的示例见RPC 上手。
默认生成规则只在业务骨架不存在时创建文件;业务在 operator() 中填充逻辑。
已有骨架整文件保留,自动生成的 handler/API 则会更新。
RPC 签名变化后需手工同步已有业务骨架,不能依赖标记区间自动迁移。
双协程实现
task_type_traits.h(dispatcher/task_type_traits.h)统一抽象两套后端:
- C++20 协程(
PROJECT_SERVER_FRAME_USE_STD_COROUTINE=ON):copp::generator_future/callable_future,RPC_AWAIT_TYPE_RESULT(x)即co_await x; - libcopp cotask:异步等待通过有栈协程挂起/恢复,
rpc_result用 poller 保存结果,rpc_result_guard包装返回值。
业务代码只使用 RPC_AWAIT_* / RPC_RETURN_* 宏与 rpc::result_code_type / rpc_result<T> 类型,不直接
感知后端差异。需要 RPC 回包时用 RPC_AWAIT_CODE_RESULT 或 RPC_AWAIT_TYPE_RESULT 等待完成,
不关注结果时也要用 RPC_AWAIT_IGNORE_RESULT 显式等待。宏定义见 src/server_frame/rpc/rpc_common_types.h,
用法见等待 RPC 完成。
内置 task action
src/server_frame/logic/action/ 提供框架级 action:set_server_time、user_logout、
reload_remote_server_configure、async_invoke 等;src/server_frame/router/action/ 提供路由相关
action(auto save、close、transfer、update_sync)。