Discord 分片:大型机器人如何拆分它们的服务器
分片是大型 Discord 机器人将其服务器分布到多个称为分片(shard)的网关连接上的方式,这样没有任何单个连接需要承载太多流量。 一旦机器人加入 2,500 个服务器,Discord 就会要求分片,并且每个服务器始终只属于恰好一个分片。
什么是分片
机器人与 Discord 的实时连接(即网关)只能处理有限的流量。超过某个点后,一个连接就无法跟上成千上万个服务器的事件。Discord 的解决办法是让机器人打开多个连接,并告诉每个连接它拥有哪些服务器。每个连接就是一个分片。
服务器如何分配
服务器所属的分片来自它的 ID,计算方法是:把 guild ID(先去掉雪花 ID 中的时间戳部分)除以分片数量,然后保留余数。因此,除非分片数量发生变化,某个服务器始终会落在同一个分片上。私信始终发送到分片 0。
机器人连接时会发送一对数字:它的分片编号和分片总数。之后 Discord 只会发送与之匹配的服务器的事件。
何时成为必需
- 少于 2,500 个服务器:一个连接就足够了。
- 达到 2,500 个服务器:Discord 拒绝单个连接,机器人必须分片。
- 大型机器人通常会在达到上限之前就增加分片,以分散负载和内存占用。
分片可以在同一进程中运行,也可以运行在不同的机器上。后一种方式允许一个分片重启而不影响其他分片。
这对你意味着什么
基本上没有影响。成员不会看到任何区别。实际的影响体现在宕机时:如果某个分片离线,只有该分片上的服务器会失去机器人,其他服务器则继续正常工作。如果只有你的服务器中机器人离线,而其他服务器正常,这往往暗示是分片问题,而不是你改动了什么。
分片还与速率限制相互作用。同时启动大量分片是受限制的,因此大型机器人会分批重启它们。
分片与 Noxyr
你无需为 Noxyr 配置任何东西。状态与延迟页面显示机器人是否在响应,而机器人离线指南列出了首先要检查的内容。如果你更希望运行自己的应用及其自身的连接,自定义机器人会以你的名义运行 Noxyr 的功能,托管节点与在线时长一文解释了如何保持这些机器人持续运行。
常见问题
机器人在多少个服务器时必须分片?
Discord 要求在 2,500 个服务器时分片。许多大型机器人会更早分片,以分散负载。
一个服务器可以同时属于两个分片吗?
不可以。一个服务器始终恰好属于一个分片,由其 ID 和分片数量决定。
分片会对我的成员有任何影响吗?
不会。这是内部细节。它只在宕机时才有影响,此时一个分片可能失效,而不影响其他分片。