You need to enable JavaScript to run this app. Discord服务器获取数千条消息Reaction的最高效实现方法是什么?
优惠活动
大模型
产品
解决方案
定价
更多

Discord服务器获取数千条消息Reaction的最高效实现方法是什么?

你的判断仅在消息已存在于客户端缓存的前提下成立,不过长期来看你列出的三种方案里,事件驱动的on_raw_reaction_add方案才是最适合你场景的最优解。

三种方案的优劣势分析

  • await channel.fetch_message(x.id):这是直接调用Discord HTTP API拉取消息,速度最慢,且有严格的速率限制,仅适合单次拉取非活跃历史消息的场景,完全不适合Reaction作为核心输入的高频交互场景,量级上来后很容易触发限流导致功能失效。
  • discord.utils.get(client.cached_messages, id = x.id):确实是本地内存查询,无API开销,单步查询速度最快,但缺陷非常明显:Discord客户端的消息缓存不是永久存储的,默认仅会缓存启动后新接收的消息、以及近期的数千条活跃消息,一旦你要监测的消息长时间不活跃被清出缓存,这个方法会直接返回None,查询失效。同时你现在搭配的10秒轮询遍历方案,当后续需要监测的消息量级上涨到数百上千条时,轮询开销会持续升高,还可能漏掉短时间内新增又删除的Reaction操作。
  • @client.event async def on_raw_reaction_add(payload):事件驱动方案,完全不需要主动轮询,只要有用户触发Reaction操作,Discord会主动推送事件到你的客户端,且该事件不依赖本地消息缓存,即便消息不在缓存里,你也能从payload中拿到消息ID、用户ID、表情ID、频道ID等全部核心信息,没有速率限制,开销极低,扩展性极强,完全适配你MMORPG把Reaction作为核心输入的场景。

适配你的业务的落地建议

你可以按如下逻辑实现,兼顾性能和稳定性:

  1. 本地维护一个monitored_msg_ids集合,存入所有需要监测Reaction的消息ID,集合的成员查询时间复杂度为O(1),性能几乎无损耗
  2. 用on_raw_reaction_add和配套的on_raw_reaction_remove作为事件触发入口,事件触发后先判断payload.message_id in monitored_msg_ids,符合条件再执行后续业务逻辑
  3. 如果业务逻辑需要完整的消息对象,优先用discord.utils.get查询本地缓存,缓存命中失败再调用fetch_message补拉消息,避免不必要的API请求
  4. 新增/移除需要监测的消息时,仅需要操作monitored_msg_ids集合即可,不需要调整轮询逻辑,扩展性极强

针对你疑问的补充回复

discord.utils.get确实是单步查询速度最快的选项,但依赖缓存有效性,且搭配轮询的方案长期扩展性很差,你当前只有不到100条监测消息时还能正常运行,等后续量级上涨、消息生命周期变长后,事件驱动方案的优势会非常明显。

内容的提问来源于stack exchange,提问作者Plus Ultra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.19 02:54:07