# 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](https://noluyo.net/gelistirici/dogrulama.md) gerekir; resmi [JavaScript](https://noluyo.net/gelistirici/kutuphane-js.md) ve [Python](https://noluyo.net/gelistirici/kutuphane-python.md) 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:

```js
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](https://noluyo.net/gelistirici/ozel-mesajlar.md) 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 | Önerilen | Zorunlu | Üst sınır |
|---|---|---|---|
| 100 | 1 | 1 | 16 |
| 101 | 2 | 2 | 16 |
| 2600 | 3 | 2 | 16 |
| 10000 | 10 | 4 | 20 |

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](https://noluyo.net/gelistirici/gateway.md) sayfasındaki `gateway.mjs` ile:

```js
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

> **İpucu:** Yapay zekaya çok bağlantılı (sharded) bir bot yazdırırken şu kuralları hatırlat:
>
> - Shard sayısı sabit yazılmaz; her açılışta `GET /gateway/bot` yanıtındaki `shards` alanından okunur.
> - `IDENTIFY` çerçeveleri arasında en az 5 saniye beklenir (`4008` almamak için) ve kopmalarda yeni oturum açmak yerine önce `op 6` (`RESUME`) denenir.

## Sırada ne var

- [Gateway](https://noluyo.net/gelistirici/gateway.md): WebSocket çerçeveleri, heartbeat ve `RESUME` akışı
- [Doğrulama](https://noluyo.net/gelistirici/dogrulama.md): 100 sunucu sınırını kaldırmak için başvuru koşulları
- [JavaScript kütüphanesi](https://noluyo.net/gelistirici/kutuphane-js.md) ve [Python kütüphanesi](https://noluyo.net/gelistirici/kutuphane-python.md): otomatik shard yönetimi
