Discord机器人与网站联动的系统设计方案咨询
先明确核心诉求:不管是网站用户还是Discord指令添加物品,只有在物品成功添加后,才让Discord机器人在指定频道发送New item added by @user,同时要保证流程一致性(避免物品未添加却发通知,或添加成功却无通知的情况)。下面逐个分析疑问与可选方案:
1. 网站开addItem接口给机器人调用是否可行?
可行,但你的现有代码存在逻辑漏洞:机器人在调用接口前就直接发送了消息,会导致若网站添加物品失败,通知已发出,出现数据与通知不一致的问题。
修正后的合理流程:
onNewDiscordMessage(): if (addItemCommand): response = sendPostRequest(websiteUrl, data) if (response.success): sendMessageInChannel("New item added by @user")
同时需给该接口添加鉴权(比如固定API密钥、Discord机器人的OAuth2 Token),防止非法调用。
2. 把Discord机器人改造成Web应用,开放send_discord_message接口?
这是能彻底保证一致性的稳妥方案:
- 场景1(Discord指令触发):机器人收到指令 → 调用网站
addItem接口 → 网站处理成功后,调用机器人的send_discord_message接口发通知 - 场景2(网站用户触发):用户在网站提交物品 → 网站处理成功后,调用机器人的
send_discord_message接口发通知
优点:流程清晰,只有物品确认添加成功才触发通知,无一致性问题;消息发送逻辑集中在机器人,后期修改通知格式只需调整机器人代码。
缺点:需为机器人额外开发Web服务,且要给接口加鉴权避免恶意调用;若机器人服务故障,网站需处理重试或记录失败日志。
3. 消息队列(RabbitMQ/Kafka)方案
这是解耦性最优的方案,适合有后期扩展需求的场景:
- 无论网站还是机器人触发添加操作,只要物品成功入库,就往消息队列发送一个
item_added事件(包含用户ID、用户名等必要信息) - Discord机器人作为消息消费者,监听队列中的
item_added事件,收到后立即发送指定通知
优点:网站与机器人彻底解耦,互不依赖;若一方临时故障,事件会暂存在队列中,服务恢复后自动处理;后期新增通知渠道(如邮件、站内信),只需新增对应消费者即可。
缺点:需额外部署维护消息队列服务,增加系统复杂度,更适合中型及以上项目。
4. Webhook方案
这是最轻量的方案,甚至无需改造现有机器人:
Discord原生支持Webhook功能,你可在目标频道创建Webhook URL,之后:
- 场景1(Discord指令触发):机器人调用网站
addItem接口 → 网站处理成功后,直接向Webhook URL POST格式化好的消息(要@用户需用<@用户DiscordID>格式) - 场景2(网站用户触发):网站处理成功后,同样向Webhook URL POST消息
优点:无需修改机器人代码,无需额外维护服务,可快速上线;Webhook由Discord官方支持,稳定性有保障。
缺点:消息发送逻辑集中在网站,后期修改通知格式或切换频道,只能调整网站配置;若Webhook调用失败,网站需自行处理重试逻辑。
5. WebSocket方案
不推荐,你的需求是物品添加后的通知,实时性要求不高,WebSocket需要维持长连接,还要处理断连重连,反而增加不必要的复杂度,除非有其他实时交互需求,否则没必要采用。
选型总结
- 小项目、快速上线:选Webhook方案,简单直接
- 中等项目、追求逻辑清晰易维护:选机器人开放
send_discord_message接口的方案 - 大型项目、有扩展需求(如新增通知渠道):选消息队列方案
内容的提问来源于stack exchange,提问作者parsecer

