7.5 KiB
name, overview, todos, isProject
| name | overview | todos | isProject | ||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 邀请回调改MQ | 将 agent → console 的 Lucky Rewards 邀请助力从 HTTP innerapi 改为经 `console_bus` MQ 投递;删除 innerapi 与 slot_sdk 对应方法;console EventBus 消费后复用现有 `LuckyRewardInviteLogic::handleInviteBind()`。 |
|
false |
Agent 邀请回调改走 console_bus MQ
目标
- 删除:
POST /innerapi/lucky-reward/invite-bind-callback、slot_sdkluckyRewardInviteBindCallback - 新增:agent 发 MQ → console
event:bus消费 → 发 Spin / helper - 复用:
LuckyRewardInviteLogic::handleInviteBind()业务不变;仍仅share_origin=wheel计转盘助力
sequenceDiagram
participant User as slot_user
participant AgentBus as agent_bus
participant Agent as slot_agent
participant ConsoleBus as console_bus
participant Console as slot_console
User->>AgentBus: TYPE_INVITE_BIND
Agent->>AgentBus: 建关系/绑码奖励
Agent->>ConsoleBus: TYPE_LUCKY_REWARD_INVITE_BIND
Console->>Console: handleInviteBind
对照现网邮件:EventBus::notifyRewardEmail() 已用 EXCHANGE_CONSOLE + QUEUE_CONSOLE_BUS。
1. MQ 契约
Exchange / Queue(与现网一致):
- Exchange:
slot_console(MQKeyManagerService::EXCHANGE_CONSOLE) - Queue:
console_bus(MQKeyManagerService::QUEUE_CONSOLE_BUS)
新事件类型(agent、console 两侧常量字符串一致):
const TYPE_LUCKY_REWARD_INVITE_BIND = 'lucky_reward_invite_bind';
消息体(与现 HTTP body 同形,便于 DTO 复用):
{
"uid": 2001,
"type": "lucky_reward_invite_bind",
"data": {
"event_id": "invite_bind:2001",
"inviter_uid": 100,
"invitee_uid": 2001,
"invite_code": "ABC123",
"channel_code": "default",
"bind_time": 1710000000,
"share_origin": "wheel",
"is_new_register": 1,
"landing_scene": "",
"landing_token": ""
}
}
uid= 被邀请人invitee_uid(对齐其它 console_bus 消息)event_id仍用invite_bind:{invitee_uid}幂等
2. slot_agent(生产者)
重构 LuckyRewardInviteCallbackGatewayService:
| 变更 | 说明 |
|---|---|
| 删除 | ConsoleClient、slot_sdk Entity、consoleApiHost、HTTP 重试 |
| 保留 | isEnabled 开关、share_origin=wheel 粗筛、参数校验 |
| 新增 | RabbitMqService::getInstance(EXCHANGE_CONSOLE, QUEUE_CONSOLE_BUS)->sendMessageByBusEntity(...) |
MQBusEntity 增加 TYPE_LUCKY_REWARD_INVITE_BIND。
LuckyRewardInviteCallbackResultEntity:
dispatched=true表示 MQ 发送成功reason:mq_failed替代http_failed;去掉console_api_host_empty
触发点不变:
EventBus::inviteBindEvent()(新建关系)AgentLogic::bindInviteCode()(手工绑码补偿)
配置:LuckyRewardInviteCallbackConfigService 可移除 timeout/retrySleep(HTTP 专用);保留 lucky_reward_callback_enabled。
3. slot_console(消费者)
MQBusEntity:增加 TYPE_LUCKY_REWARD_INVITE_BIND。
EventBus::deal():新增 case,调用 private luckyRewardInviteBindEvent(int $uid, array $data):
$callbackDto = InviteBindCallbackDTO::fromRequest($busEntity->data);
$result = (new LuckyRewardInviteLogic())->handleInviteBind($callbackDto);
LoggerService::info('lucky_reward_invite_bind', $result->activeData());
InviteBindCallbackDTO:fromRequest() 已可读 MQ data 数组,无需改签名;PHPDoc 注明 HTTP/MQ 共用。
ack 策略(对齐业务语义,非 5xx 不重试):
handleInviteBind正常返回(含skipped_*、already_processed)→ ack- 未捕获
Throwable(DB 异常等)→ log + ack(与多数 console_bus 分支一致;避免无限 requeue)。若需失败重试可后续单独加 dead-letter,本期不扩 scope。
删除 app/innerapi/controller/LuckyRewardController.php(仅此一个 action)。
4. slot_sdk(清理)
删除或不再使用:
ConsoleService::luckyRewardInviteBindCallback()LuckyRewardInviteBindCallbackRequestEntityLuckyRewardInviteBindCallbackResultEntity
保留 freeCreditsStatistics/list(admin 仍用)。
agent composer.json 若仅为该回调依赖 console SDK 路径,无需改依赖(agent 仍可能间接用 slot_sdk 其它能力)。
5. 测试
| 仓库 | 用例 |
|---|---|
| slot_console | 新增 EventBusLuckyRewardInviteBindTest:mock AMQPMessage,type=lucky_reward_invite_bind,断言调用 Logic / ack(参考 EventBusFreeCreditInitTest) |
| slot_console | 现有 LuckyRewardInviteBindIntegrationTest 继续直调 Logic,不受影响 |
| slot_agent | 单测 Gateway:wheel 发 MQ、user_agent skip、disabled 不发(可 mock RabbitMqService 或测 payload 组装 private 方法) |
6. 文档
- 01_slot_agent邀请回调对接方案.md:HTTP 改 MQ 时序图、删除 §6.1 innerapi
- 05 §3:接收方式改为 console_bus
- 00 §3.5 时序图:Agent→Console 改为 MQ
- lucky_reward_deploy.md:去掉
consoleApiHost(agent 调 console)与 innerapi 冒烟项;补充 consoleevent:bus需运行
7. 部署注意
- 无需 agent 配置
consoleApiHost(仅此回调) - 必须 slot_console
php webman event:bus消费console_bus(与邮件、注册等共用进程) - 发版顺序建议:console 先上消费 → agent 再切 MQ 生产,避免短暂消息无人消费(旧 agent HTTP + 新 console 无 innerapi 窗口)
涉及文件摘要
改:slot_agent Gateway + MQBusEntity + Config;slot_console EventBus + MQBusEntity
删:slot_console/app/innerapi/controller/LuckyRewardController.php;slot_sdk 3 个 invite callback 文件
不动:LuckyRewardInviteLogic 核心判定、C 端 /api/*