Kuyruğa bırakılan bir işin kullanıcıya ulaşması bir bakıma teslimat gibidir: paket kabul edildi, ama kaç günde geldiği asıl mesele. Kuyruk mimarisinde gecikme, tek bir sorun değil dört ayrı sorun toplamıdır; her biri farklı bir metrikle ölçülür ve farklı bir çare ister. Karıştırmak, yanlış yere yatırım yapmanın bir numaralı sebebidir.

Sorunun çetrefilli yanı, dört kaynağın dışarıdan aynı görünmesidir: kullanıcı yalnızca "geç geldi" der. Hangi kaynağın şiştiğini bilmeyen ekip, önce işçileri çoğaltır; bekleme sorunu değilse çözüm getirmez, sonra kodu eleştirir; süre sorunu değilse o da işe yaramaz. Tanı, tedaviden önce gelir.

Gecikmenin Dört Kaynağı

Birincil gecikme, işin kuyruğa girdiği andan alıcıya atanana kadar geçen süredir: işin gerçekten yürütülme süresi. İkinci kaynak beklemedir: işçi meşgulse veya hiç yoksa iş sıradadır ve kuyruk derinleşir. Üçüncüsü ağ ve aracı yüküdür: mesajı seri hâle getirme, bağlantı kurma, onaylama masraflarıdır. Dördüncüsü yeniden denemelerdir: başarısız iş, tekrar deneme aralığıyla birlikte tekrar sıranın sonuna döner ve toplam gecikmeyi katlar.

const bekleyen = await kuyruk.getWaitingCount();
const isciSayisi = 4;
const saniyedeIs = isciSayisi * 2; // ölçülmüş değer

if (bekleyen > saniyedeIs * 30) {
  // 30 saniyelik birikim bile cevap vermiyor demektir: ölçek artır
  await olcegiArtir(isciSayisi + 4);
}

Neyi Ölçüyorsanız, Onu Düzeltirsiniz

Doğru tanı, doğru çareyi getirir. Kuyruk derinliği büyüyorsa sorun kapasitedir: işçi sayısını artırmak veya işleri paralelleştirmek gerekir. Derinlik sabit ama uçtan uca süre uzuyorsa iş içinde zaman kaybediliyordur: veritabanı sorguları, dış servis çağrıları ve yeniden denemeleri ayrı ayrı zamanlayın. Sıralı hâle getirme masraflıysa mesaj boyutunu küçültüp bağlantı havuzu kullanın.

const baslangic = performance.now();
await isiIsle(mesaj);
const sure = performance.now() - baslangic;
olc("is_suresi_ms", sure, { kuyruk: "bildirim" });

Ölçüm olmadan yapılan her iyileştirme, gecikmenin en pahalı kaynağına değil en görünür olana harcanır. Uçtan uca izleme, dört kaynağı da tek grafikte gösterir: hangi çubuk uzadıysa suç o noktadadır.

Bir de gecikmenin dağılımına bakmak gerekir: ortalama değer, çoğu zaman yalan söyler. İşlerin doksanı yarım saniyede biterken son onu otuz saniyede bittiğinde, ortalama üç saniyeyi gösterir ve kimse fark etmez. Yüzdelik dilimleri ölçün; özellikle doksan dokuzuncu dilim, en yorgun kullanıcının yaşadığını anlatır.

Son bir ayrım da iş türüne yapılandırılmış önceliktir: kuyruk tek sıra değil, öncelik katmanlarıyla kurulabilir. Ödeme bildirimi yüksek öncelikte ayrı bir sıraya, günlük rapor düşük öncelikte arkaya alınır. Böylece yavaş işler, hızlı işlerin önünü kapatmaz; gecikme de işin önemiyle doğru orantılıdır.

Kuyruk Derinliği Bir Alarm Değil, Belirtidir

Kuyruğun uzaması her zaman kötü haber değildir: gece yarısı binlerce e-posta gönderme işi, sabah taze sırayla buluşur. Sorun, kullanıcıyı bekleten bir yol üzerinde birikmesidir. Bu yüzden eşikleri iş türüne göre belirleyin: e-posta için on dakikalık bekleme normal, ödeme bildirimi için on saniye felakettir. Alarmı da buna göre kurun: "kuyrukta bin iş var" cümlesi, işin türünü söylemeden korkutur; "ödeme bildirimleri on beş saniyedir bekliyor" ise ayağa kalkmayı hak eden cümledir.

Gecikme tek bir düşman değil, dört ayrı düşmanın toplamıdır. Onları tek bir "yavaş" kelimesinde eritmeyin: iş süresini, kuyruk bekleme süresini, aracı yükünü ve tekrar denemelerini ayrı metrikler olarak ölçün. Hangisi uzadığını bildiğiniz an, çaresini bilmek zaten biliyorsunuz demektir. Kuyruk mimarisinin vaadi de zaten budur: yavaşlığı gizlemek değil, görünür kılıp parçalarına ayırmak.