N'oluyo · Geliştirici Dokümanları · Son güncelleme: · https://noluyo.net/gelistirici

Shard'lar

Bot çok büyüdüğünde tek bir bağlantı tüm sunucularının olaylarını taşıyamaz. Shard, botun sunucularını birkaç bağlantıya bölmektir: her bağlantı yalnızca kendi payına düşen sunucuların olaylarını alır.

Shard'lar

Bot çok büyüdüğünde tek bir bağlantı tüm sunucularının olaylarını taşıyamaz. Shard, botun sunucularını birkaç bağlantıya bölmektir: her bağlantı yalnızca kendi payına düşen sunucuların olaylarını alır.

Küçük bir bot için bu sayfaya gerek yok. GET /gateway/bot yanıtında shards değeri 1 ise shard alanını hiç göndermeden tek bağlantı açarsın. 100 sunucuyu aşmak için Doğrulama gerekir; resmi JavaScript ve Python kütüphaneleri shard sayısını ve 5,1 saniyelik başlatma aralığını senin yerine yönetir.

Bir sunucu hangi shard'a düşer

Sunucunun ID'si ve toplam shard sayısı bunu belirler:

shard_id = (guild_id >> 22) % count

ID'ler 64 bitlik olduğu için JavaScript'te BigInt kullan:

const shardOf = (guildId, count) => Number((BigInt(guildId) >> 22n) % BigInt(count));

Bunu kendin hesaplamak zorunda değilsin: READY her oturuma kendi sunucularını listeler. Ama op 8 isteğini doğru oturumdan göndermek için işine yarar, çünkü başka shard'daki bir sunucu için yalnızca boş bir parça gelir.

Sunucusu olmayan olaylar, yani DM'ler ve botun kendi profilini anlatan USER_UPDATE, shard 0'a gider. Kişilerin botunla açtığı DM'ler de, oradaki mesajlar ve etkileşimler de shard 0'a gelir.

Kaç shard açmalı

Sayıyı identify'daki shard alanıyla söylersin: [id, count]. id, 0'dan başlar ve count'tan küçük olmalıdır. Biçim yanlışsa bağlantı 4012 ile kapanır.

Üç sınır vardır ve üçü de botun bulunduğu sunucu sayısına bağlıdır:

  • Önerilen: GET /gateway/bot yanıtındaki shards. 100 sunucuya kadar 1, sonrasında her 1000 sunucu için 1 ve en az 2.
  • Zorunlu: Açabileceğin en küçük sayı. 100 sunucuya kadar 1, sonrasında her 2500 sunucu için 1 ve en az 2. Altında kalırsan bağlantı 4015 ile kapanır.
  • Üst sınır: Önerilenin iki katı ve en az 16. Üstüne çıkarsan bağlantı 4012 ile kapanır.
SunucuÖnerilenZorunluÜst sınır
1001116
1012216
26003216
1000010420

Zorunlu sayı önerilenin altında durur, böylece bir sunucu daha eklendi diye bot kapı dışı kalmaz. Sen önerileni kullan ve program her başladığında yeniden sor.

Shard'ları başlatmak

Her shard ayrı bir bağlantı ve ayrı bir oturumdur, bu yüzden oturum başlatma sınırları geçerlidir:

  • 5 saniyede 1 başlatma. session_start_limit.max_concurrency bu sayıyı söyler ve bugün 1'dir. Daha sık denersen bağlantı 4008 ile kapanır, bu yüzden shard'ları sırayla ve aralıklı başlat.
  • Günde 1000 başlatma. Kalanı session_start_limit.remaining, sıfırlanmasına kalan milisaniyeyi reset_after söyler. Hak biterse bağlantı 4016 ile kapanır.

Resume başlatma sayılmaz. Bu yüzden yeniden başlatma döngüsüne giren bir bot, günlük hakkını hızla tüketir; önce resume dene.

Gateway sayfasındaki gateway.mjs ile:

import { connect } from "./gateway.mjs";

const res = await fetch("https://noluyo.net/api/v1/gateway/bot", {
  headers: { Authorization: `Bot ${process.env.BOT_TOKEN}` },
});
const { shards } = await res.json();

for (let id = 0; id < shards; id++) {
  await connect({ intents: 1, shard: [id, shards], onEvent: (t) => console.log(id, t) });
  await new Promise((done) => setTimeout(done, 5500));
}

Oturumlar birbirini nasıl etkiler

Bu kuralları bilmezsen botun kendi kendini düşürebilir:

  • Aynı [id, count] ile ikinci kez identify edersen eski oturum 4011 ile kapanır. Botun iki kopyası çalışıyorsa birbirini böyle düşürür; bu kasıtlıdır, iki kopya aynı mesaja iki kez yanıt vermesin diye.
  • Toplamda en çok 2 * count oturum açık kalabilir. count, yeni identify'daki sayıdır. Fazlası, kopmuş olanlardan ve en eskilerden başlanarak 4011 ile kapanır.

Bu ikinci kural şunu da söyler: Daha küçük bir count göndermek diğer shard'ların oturumlarını bitirir. Örneğin 4 shard'la çalışan bir bot [0, 1] ile identify ederse toplam sınır 2 olur ve en eski üç oturum kapanır. Sayıyı küçültürken önce eski oturumları kendin kapat.

Sayıyı büyütürken eski oturumlar kendiliğinden kapanmaz. İkisi birlikte çalıştığı sürece aynı sunucunun olayları iki oturumdan da gelir, yani bir mesaja iki kez yanıt verebilirsin. Geçişi bitirince eski oturumları ws.close(1000) ile kapat.

Botun durumu

Botun durumu shard'lar arasında ortaktır. op 3 hangi oturumdan gönderilirse gönderilsin botun tüm sunucularında görünür. Bir shard'ın oturumu kapanırsa bot, o shard'ın sunucularında çevrimdışı görünür.

Bu sayfayı yapay zekaya verirsen

Sırada ne var