İçeriğe geç
academia.sh

Ders 13 / 20

Bildirim ve E-posta Servisleri

Gönderimin bir hizmete devredilmesinin kısıtı: geri dönen ileti ile şikâyetin birer olay olarak geri gelmesi, bu geri bildirim akışının işlenme oranı taranarak otuz günün sonundaki itibar puanı, kısılan gün sayısı ve teslim edilen ileti sayısının ölçülmesi ve işlemenin maliyetiyle işlememenin bedelinin karşılaştırılması.

İçindekiler

Geçit dışarıdan gelen isteği içeri alıyordu. Ölçüm ağının dışarıya gönderdiği bir akış daha var: doğrulama başarısız olduğunda saha ekibine giden iş bildirimi, fatura kesildiğinde aboneye giden ileti, sayaç arızasında şube sorumlusuna giden uyarı. Bu gönderimler de bir hizmete devredilir.

Teslim edilebilirliğin kendisi daha önce ölçüldü ve o ölçüm burada tekrarlanmaz. Bu dersin sorusu şudur: gönderimi bir hizmete devretmek hangi kısıtı geri getirir? Yanıt, buraya kadar görülen bütün kısıtlardan farklı bir yerden gelir — gönderimin başarısı gönderenin elinde değildir.

Devredilen Karar ve Elde Kalmayan Şey

Devredilenler tanıdık: gönderim sunucusunu işletmek, adres kayıtlarını tutmak, yeniden deneme kuyruğunu yönetmek, alan adı doğrulama kayıtlarını yenilemek. Devredilmeyen, ama zaten hiç kimsenin elinde olmayan bir şey var: alan tarafın kararı. Bir ileti kabul edilir, geri çevrilir, sessizce bir klasöre atılır ya da şikâyet olarak işaretlenir; bu kararı veren, gönderen değildir.

Hizmet bu kararı ölçer ve gönderene bir itibar olarak yansıtır. Karşılığında gelen kısıt buradan doğar: gönderim kotası itibara bağlıdır. İtibar düşünce kota düşer, kota düşünce gönderilebilecek ileti sayısı düşer. Buraya kadarki derslerde kısıt bir ayardı — görünürlük süresi, azami teslim, zaman aşımı. Burada kısıt kazanılan bir sayıdır ve doğrudan ayarlanamaz; ancak davranışla yükseltilir.

Kısıtın bir de başlangıç hali vardır. Yeni bir gönderim akışının geçmişi yoktur, dolayısıyla itibarı da yoktur; hizmet bu durumda hacmi baştan açmaz, geçmiş biriktikçe açar. Bunun pratik sonucu, gönderim kapasitesinin anlık olarak ölçeklenememesidir. Buraya kadarki bütün hizmetlerde ölçek talep edildiği anda geliyordu — kuyruk derinliği artınca örnek eklendi, istek sayısı artınca geçit taşıdı. Gönderimde böyle olmaz: bir günde 8.000 iletiden 80.000’e çıkmak teknik bir sınır değil, kazanılmamış bir izindir. Ölçüm ağının yeni bir bölgeyi devreye alması planlanıyorsa, gönderim hacminin o tarihten haftalar önce kademeli olarak yükseltilmesi gerekir.

Hizmetin bu kararı ilettiği yol da tanıdıktır. Geri dönen ileti ve şikâyet, gönderene birer olay olarak geri gelir; tıpkı bu konunun ilk dersindeki olaylar gibi bir veri yoluna ya da konuya yazılırlar. Buradan doğrudan bir sonuç çıkar: o olayları alacak bir kural yoksa, hiçbir hata üretmeden düşerler. İlk derste ölçülen 433 sessiz düşme burada bir liste hijyeni sorununa dönüşür.

Ölçüm kurgu bölgesel ölçüm ağının saha bildirimleri üzerindedir; adresler ornek.gecersiz biçiminde kurgu adlardır.

  • OS31. Liste 12.000 alıcıdır; başlangıçta 480’i geçersizdir (kapanmış hesap, hatalı alan adı).
  • OS32. Günlük taban kota 8.000 iletidir; gerçekleşen kota itibarla orantılıdır ve itibar 60’ın altına inince ayrıca yarıya düşer.
  • OS33. İtibar 100’den başlar; günlük geri dönme oranı 0,02’yi aşarsa 6 puan, şikâyet oranı 0,001’i aşarsa 3 puan iner, ikisi de eşiğin altındaysa 2 puan çıkar.
  • OS34. Şikâyet eden alıcı listeden çıkarılmazsa listede kalır ve sonraki gönderimlerde yeniden şikâyet eder.
  • OS35. Geri bildirim işleme oranı, o gün gelen geri dönen ve şikâyet olaylarının kaçının listeye yansıdığıdır.
  • OS36. Model tek bir gönderim akışı kurar; içerik, konu satırı ve gönderim saati etkileri ölçülmez. Modelde rastgelelik yoktur.

İşleme Oranı ile Teslim Arasındaki Bağ

// itibar.mjs — bildirim servisi modeli: geri bildirim islenmezse teslim ne oluyor
// Model: gercek bir gonderim degil, geri bildirim isleme orani ile teslimin baglanmasi.
const GUN = 30, LISTE = 12000, TABAN = 8000;
const GECERSIZ0 = 480;                         // kapanmis ya da hatali adres (kurgu liste)

function kosum(p) {                            // p: geri bildirim isleme orani
  let gecersiz = GECERSIZ0, sikayetci = 0, itibar = 100;
  let teslim = 0, donenTop = 0, sikTop = 0, kisilanGun = 0;
  for (let g = 0; g < GUN; g++) {
    const kisik = itibar < 60;                 // itibar esigin altina inince gonderim kisilir
    const kota = Math.round(TABAN * (itibar / 100) * (kisik ? 0.5 : 1));
    if (kisik) kisilanGun++;
    const gonderim = Math.min(kota, LISTE);
    const donen = Math.round(gonderim * (gecersiz / LISTE));
    const sik = Math.round(gonderim * (0.0006 + sikayetci / LISTE));
    teslim += gonderim - donen; donenTop += donen; sikTop += sik;
    const dOran = donen / gonderim, sOran = sik / gonderim;
    if (dOran > 0.02) itibar -= 6;
    if (sOran > 0.001) itibar -= 3;
    if (dOran < 0.01 && sOran < 0.0005) itibar += 2;
    itibar = Math.max(0, Math.min(100, itibar));
    gecersiz = Math.max(0, gecersiz - Math.round(donen * p));      // islenen geri bildirim
    sikayetci = Math.max(0, sikayetci + Math.round(gonderim * 0.0006) - Math.round(sik * p));
  }
  return { itibar, teslim, donenTop, sikTop, kisilanGun };
}

console.log("isleme orani".padEnd(14) + "30. gun itibar".padStart(16) + "teslim".padStart(9) +
  "geri donen".padStart(12) + "sikayet".padStart(9) + "kisilan gun".padStart(13));
for (const p of [0, 0.25, 0.5, 0.9, 1]) {
  const s = kosum(p);
  console.log(p.toFixed(2).padEnd(14) + String(s.itibar).padStart(16) +
    String(s.teslim).padStart(9) + String(s.donenTop).padStart(12) +
    String(s.sikTop).padStart(9) + String(s.kisilanGun).padStart(13));
}
console.log(`gun: ${GUN}, liste: ${LISTE}, gunluk taban kota: ${TABAN}, ` +
  `baslangictaki gecersiz adres: ${GECERSIZ0}`);
node itibar.mjs
isleme orani    30. gun itibar   teslim  geri donen  sikayet  kisilan gun
0.00                         0    40743        1697       65           25
0.25                         7    62990        1450       84           24
0.50                        88   211687         953      207            0
0.90                        94   225548         532      150            0
1.00                        94   225600         480      150            0
gun: 30, liste: 12000, gunluk taban kota: 8000, baslangictaki gecersiz adres: 480

İlk satır geri bildirimin hiç işlenmediği durumdur. Otuzuncu günün sonunda itibar sıfırdır, otuz günün 25’inde gönderim kısılmıştır ve toplam teslim 40.743’te kalmıştır. Hiçbir şey bozulmadı: gönderim isteği her gün kabul edildi, hizmet hata döndürmedi, geri bildirim olayları düzgün biçimde yayınlandı. Yalnız kimse onları okumadı.

Son satır aynı listenin, aynı içeriğin ve aynı otuz günün öteki ucudur. Geri bildirim tam işlendiğinde itibar 94’te kalır, hiçbir gün kısılmaz ve teslim 225.600’e çıkar. Aradaki fark 184.857 iletidir — beş buçuk kat. İki koşum arasında değişen tek şey, geri dönen olayların listeye yansıtılmasıdır.

Geri dönen sütunu bu mekanizmayı açıklıyor. Tam işlemede toplam geri dönen 480’dir, yani listedeki geçersiz adres sayısına eşittir: her geçersiz adres bir kez geri döner, işlenir, listeden çıkar ve bir daha denenmez. İşleme yokken aynı 480 adres otuz gün boyunca yeniden denenir ve 1.697 geri dönme üretir. Geri dönme oranı böylece hiç düşmez, eşiğin üstünde kalır ve itibarı her gün aşağı çeker.

Kısılan gün sütunu bu düşüşün nasıl hızlandığını gösteriyor. İtibar 60’ın altına indiği anda kota ayrıca yarıya iner; ilk satırda otuz günün 25’i bu durumdadır. Kısılma yalnız teslimi azaltmaz, geri bildirim akışını da inceltir — daha az gönderim, daha az geri dönme, dolayısıyla temizlenecek adresin bulunması da yavaşlar. Kısıt kendi düzelmesini geciktirir.

Şikâyet sütunu ilk bakışta ters görünüyor: işleme oranı yükseldikçe şikâyet sayısı 65’ten 150’ye çıkıyor. Bunun nedeni paydadır — işlenmeyen koşumda kota çöktüğü için zaten çok az ileti gönderilmiştir. Şikâyet oranı işlemeyle düşer, sayısı ise gönderim arttığı için yükselir. Mutlak sayıya bakan bir gösterge burada tam ters yönde yorumlanır.

Eşik Nerede

Tabloda asıl bulgu ikinci ile üçüncü satır arasındadır. İşleme oranı 0,25’te itibar 7, teslim 62.990; 0,50’de itibar 88, teslim 211.687. Doğrusal bir ilişki yoktur — iki katına çıkan işleme oranı teslimi üç buçuk katına çıkarır. Bunun nedeni eşik mantığıdır: geri dönme oranı 0,02’nin altına indiği anda ceza durur ve itibar kendini toplamaya başlar. Bu eşiği geçecek kadar temizlik yapmak yetiyor; ondan sonrası kendiliğinden geliyor.

Bu yüzden “geri bildirimin yarısını işliyoruz” cümlesi bir eksiklik değil, sınırın hangi tarafında durulduğu sorusudur. 0,25 ile 0,50 arasında bir yerde sistem iki kararlı durumdan birine yerleşir: ya oran eşiğin altına iner ve teslim tavana yürür, ya eşiğin üstünde kalır ve kota dibe iner. Ara bir denge yoktur, çünkü kısılan kota geri bildirim hacmini de düşürür ve temizlenecek adres daha yavaş bulunur.

Geri Bildirimi Yanlış İşlemek

İlk ölçüm işlemenin faydasını gösterdi, ama tek bir işleme biçimi varsaydı: geri dönen adres listeden çıkar. Gerçek geri bildirim akışı tek türlü değildir. Bir bölümü kalıcı hatadır — adres yok, alan adı yok, hesap kapanmış. Bir bölümü geçicidir: kutu dolu, alan sunucu meşgul, geçici bir sınıra takılmış. İkisi aynı olay akışından, çoğu zaman benzer biçimde gelir.

// tur-ayrimi.mjs — geri bildirim turu ayirt edilmezse listeden kimler siliniyor
const GUN = 30, LISTE = 12000, KOTA = 8000;
const GECERSIZ0 = 480;          // kalici hata: adres yok, alan adi yok
const GECICI = 0.03;            // gecici hata: kutu dolu, alici sunucu mesgul

function kosum(ayrimVar) {
  let gecerli = LISTE - GECERSIZ0, gecersiz = GECERSIZ0, yanlis = 0, teslim = 0;
  for (let g = 0; g < GUN; g++) {
    const liste = gecerli + gecersiz;
    const gonderim = Math.min(KOTA, liste);
    const kalici = Math.round(gonderim * (gecersiz / liste));
    const gecici = Math.round((gonderim - kalici) * GECICI);
    teslim += gonderim - kalici - gecici;
    gecersiz = Math.max(0, gecersiz - kalici);          // kalici hata her iki modda silinir
    if (!ayrimVar) { gecerli -= gecici; yanlis += gecici; }   // gecici hata da silinirse
  }
  return { liste: gecerli + gecersiz, yanlis, teslim };
}

console.log("mod".padEnd(22) + "30. gun liste".padStart(15) + "yanlis silinen".padStart(16) +
  "teslim".padStart(9));
for (const [ad, v] of [["tur ayrimi yok", false], ["yalniz kalici silinir", true]]) {
  const s = kosum(v);
  console.log(ad.padEnd(22) + String(s.liste).padStart(15) + String(s.yanlis).padStart(16) +
    String(s.teslim).padStart(9));
}
console.log(`gun: ${GUN}, baslangic listesi: ${LISTE}, gunluk kota: ${KOTA}`);
node tur-ayrimi.mjs
mod                     30. gun liste  yanlis silinen   teslim
tur ayrimi yok                   5025            6495   210020
yalniz kalici silinir           11520               0   232334
gun: 30, baslangic listesi: 12000, gunluk kota: 8000

Tür ayırt edilmediğinde otuz günde 6.495 geçerli alıcı listeden silindi ve liste 12.000’den 5.025’e indi. Silinenlerin hiçbirinde bir sorun yoktu; yalnız o gün kutuları doluydu. İkinci satırda liste 11.520’de kalır — bu, başlangıçtaki 480 geçersiz adresin çıkarılmış halidir.

Buradaki kusur birinci ölçümdekinin tersidir. Orada geri bildirim işlenmiyordu ve itibar düşüyordu; burada işleniyor, hem de fazlasıyla, ve teslim yine düşüyor: 232.334 yerine 210.020. Geri bildirim akışını işlemek tek başına yeterli değildir; olayın türünü okumak gerekir. Fark, olayı alan işlevin iki satırındadır ve iki satırın maliyeti 6.495 alıcıdır. Kalıcı ile geçici arasındaki sınırı yanlış çizmenin bedeli, akışı hiç işlememenin bedeliyle aynı yöne bakar.

İşlemenin Maliyeti, İşlememenin Bedeli

Geri bildirim akışını işlemek bu konudaki en ucuz işlerden biridir. Tam işleme koşumunda otuz günde 480 geri dönen ve 150 şikâyet olayı gelir: toplam 630 olay. Her olay bir işlev çağrısıyla işlense ve önceki dersteki çağrı ücreti kullanılsa, otuz günün maliyeti 630 × 0,010 = 6,3 kurgu birimdir. İşlememenin bedeli 184.857 teslim edilmemiş iletidir.

Oran bu kadar keskin olduğu halde bu akışın işlenmeden kalması olağandır ve nedeni ilk dersteki ölçümde yazılıdır. Geri bildirim olayları bir konuya yazılır; o konunun abonesi yoksa olaylar sessizce düşer. Ne hata sayacı artar ne bir eşik aşılır — abonesi olmayan bir konu, boş bir kuyruğa benzer, sağlıklı görünür. Belirti, otuz gün sonra teslim sayısının düşmesiyle ortaya çıkar ve o zaman da neden olarak gönderim hizmeti değil, “iletiler gitmiyor” gibi bir sonuç görülür.

Bu akışın nasıl kurulacağı da bu konuda ölçülmüş parçalardan çıkar. Geri bildirim olayları bir konuya yazılır, konunun bir aboneliği bir kuyruğa bağlanır, kuyruk bir işlevi uyandırır ve işlev listeye yazar. Kuyruğun görünürlük süresi buradaki iş için kısa tutulabilir, çünkü liste yazması birkaç birim sürer. Aynı geri dönme olayının iki kez teslim edilebileceği ise ikinci dersin sonucudur; adresi listeden çıkarmak zaten etkisiz bir iştir, ama şikâyet sayacı tutuluyorsa o sayacın dördüncü dersteki gibi bir etkisizlik anahtarına dayanması gerekir. Konu kapanırken görülen şey budur: gönderim hizmetinin geri bildirim akışı, bu konudaki beş dersin hepsini aynı anda kullanan tek örnektir.

Kısıtın etrafından dolaşmanın yolları vardır ve hepsinin kendi bedeli sayılabilir. Listeyi elle temizlemek geri bildirimi işlemenin yerini tutar ama gecikmelidir: haftada bir yapılan temizlik, tabloda 0,25 ile 0,50 arasındaki bölgeye denk düşer. Gönderimi ikiye ayırmak — işlemsel bildirimler bir akıştan, toplu duyurular başka bir akıştan — birinin itibarını ötekinden korur; bedeli iki ayrı yapılandırma yüzeyi ve iki ayrı geri bildirim akışıdır. Kotayı yükseltmek için başvurmak ise kısıtı hiç kaldırmaz: kota itibarın sonucudur, girdisi değil. Bu, konu boyunca sayılan kısıtların en katısıdır — görünürlük süresi değiştirilebilir, zaman aşımı yükseltilebilir, adım sınırı yeniden çizilebilir; itibar yalnız kazanılır.

Özet

  • Gönderim hizmete devredildiğinde geriye alınamayan şey alan tarafın kararıdır; hizmet bu kararı itibar olarak yansıtır ve kota itibara bağlanır. Kısıt bu kez ayarlanan değil, kazanılan bir sayıdır.
  • Geri dönen ileti ve şikâyet gönderene birer olay olarak döner; bu olayları alacak bir kural ya da abonelik yoksa hiçbir hata üretmeden düşerler.
  • Geri bildirim hiç işlenmediğinde otuz günün 25’inde gönderim kısıldı, itibar sıfıra indi ve teslim 40.743’te kaldı; tam işlendiğinde itibar 94, kısılan gün 0, teslim 225.600 oldu — aradaki fark 184.857 iletidir.
  • Tam işlemede toplam geri dönen 480’dir, yani listedeki geçersiz adres sayısına eşittir; işleme yokken aynı 480 adres 1.697 geri dönme üretir. İlişki doğrusal da değildir: işleme oranı 0,25’ten 0,50’ye çıkınca teslim 62.990’dan 211.687’ye çıkar, çünkü geri dönme oranı eşiğin altına indiği anda ceza durur.
  • Olayın türünü okumamak ters yönde aynı zararı verir: kalıcı ile geçici hata ayırt edilmediğinde otuz günde 6.495 geçerli alıcı silindi ve teslim 232.334’ten 210.020’ye indi.
  • 630 geri bildirim olayını işlemenin maliyeti 6,3 kurgu birimdir; işlememenin bedeli 184.857 teslim edilmemiş iletidir.

Sonraki Adım

Bu konu boyunca işlevler birbirine bağlandı. Olaylar kurallarla yönlendirildi, kuyruklar ve konular araya tampon koydu, çok adımlı akışlar bir durum makinesine verildi, saatle başlayan işler etkisiz kılındı, dışarıdan gelen istekler bir geçitten geçirildi ve dışarıya giden iletiler bir geri bildirim akışına bağlandı. Her birinde aynı hesap tekrarlandı: bir karar devredildi, karşılığında sayılabilir bir kısıt geldi.

Bütün bu düzeneğin ortak bir özelliği var ve şimdiye kadar hiç sorulmadı: hepsi tek bir bölgede koşuyor. Kural motoru, kuyruk, orkestratör, zamanlayıcı, geçit ve gönderim hizmeti aynı yerde duruyor; şube ekranındaki bir sorgu da, saha uygulamasındaki bir istek de o tek yere gidiyor. Kullanıcıya yakın olan tek şey önbellekti — ve önbellek yalnız daha önce hesaplanmış bir yanıtı saklayabilir. Sonraki konu bu sınırı ele alıyor: hesaplamanın kendisi kullanıcıya yaklaştığında ne kazanılır, karşılığında hangi çalışma zamanı kısıtları kabul edilir.

İlerlemeni kaydetmek ve not almak için Giriş yap

Notlarım

Not almak için giriş yapmalısın.

Aramak için yazmaya başlayın.

↑↓ Esc gezin · aç · kapat