---
title: 'Eşzamansız İstek–Yanıt'
source: 'https://academia.sh/tr/kurslar/uygulama-katmani/eszamansiz-istek-yanit'
course: 'Uygulama Katmanı ve Servis Etkileşimi'
language: tr
updated: '2026-08-17T18:10:54+00:00'
license: 'CC BY-SA 4.0'
---

# Eşzamansız İstek–Yanıt

Uzun süren bir işlemde yanıtın nasıl döndürüleceği: 3,60 saniyelik dönem raporunun 200 milisaniyelik eşiğe sığmaması, isteğin bir iş kimliğiyle hemen karşılanması, durum ve sonuç adreslerinin ayrılması, yoklama aralığının yoklama sayısı ile sonucu görme süresi arasındaki ödünleşiminin ölçülmesi ve üstel geri çekilmeli yoklamanın on beş yoklamayı dörde indirmesi.

Bu kursun bütün derslerinde iş, isteği yapan taraftan koparılmış olarak yürüdü: durum olayı
kuyruğa yazıldı, iş akışı arkada koştu, gün sonu partisi bir lider tarafından başlatıldı. Bir
soru hep dışarıda kaldı — isteyen tarafın sonucu nasıl öğrendiği. Bir satıcı otuz günlük
ücretlendirme raporunu istediğinde iş kuyruğa alınır ve saniyeler sonra biter; ama satıcının
istemcisi bir yanıt beklemektedir.

**Eşzamansız istek–yanıt** (asynchronous request–reply), isteği hemen bir iş kimliğiyle
karşılayan ve sonucu ayrı bir adresten sunan yerleşimdir. Bu ders o yerleşimin bedelini ölçer:
istemci sonucu görene kadar kaç kez sorar, ne kadar geç görür ve bu sorular uçtaki tepe istek
hızına ne ekler.

## Eşzamanlı Yol Neden Yetmiyor

Servis Tasarımı konusunun son dersi uçtan uca eşiği bir bütçe olarak ele almıştı: takip
okumasının sıkı eşiği 200 milisaniyedir ve zincirdeki her adım bu bütçenin bir payını alır.
Dönem raporunun süresi de bu kursun ikinci dersinde K01'den türetilmişti: satıcı başına 3000
kayıt, tarama hızı 833,33 kayıt/s, yani **3,60 saniye**.

İki sayı yan yana konduğunda karar aritmetiktir: rapor işi eşiğin 18 katıdır. Bütçeyi
bölüştürmek de işe yaramaz, çünkü bölüştürme her adımı **daraltır**; adımın kendisi bütçenin
tamamından büyükse bölünecek bir şey yoktur. Zaman aşımı ile deneme sayısının çarpımı burada
üçüncü bir seçenek üretmez. Üçüncü seçenek çağıranın beklememesidir.

## Üç Adres

Yerleşim, tek bir çağrının yaptığı işi üç adrese böler ve her adres tek bir soruya yanıt verir.
**İstek adresi** raporu ister ve hemen döner; yanıt sonucu değil, işin kabul edildiğini ve bir
iş kimliğini taşır. **Durum adresi** o kimliğin işinin bitip bitmediğini söyler. **Sonuç
adresi** biten işin çıktısını verir.

Bölmenin üç sonucu vardır. Birincisi, istek adresi artık kısa bir yazma olduğu için 200
milisaniyelik eşiğe girer; durum adresi de tek kayıt okumasıdır ve aynı eşiğe girer. İkincisi,
iş kimliği yazıldıktan sonra istemci bağlantıyı kapatabilir ve sonucu daha sonra alabilir;
istemcinin çökmesi işi düşürmez. Üçüncüsü, aynı isteğin ikinci kez gönderilmesi ikinci bir iş
başlatmamalıdır — istek adresi etkisiz olmalı ve aynı tekillik anahtarı aynı iş kimliğini
döndürmelidir. Bu üç sonuç yerleşimin kendisidir; ölçülecek olan, istemcinin durum adresini
kaç kez sorduğudur.

```js
// eszamansiz/yoklama.mjs — uzun suren rapor isteginde yoklama sayisi ve gorulme suresi.
// Sureler K01'den turetilmis hesaplardir; kosum aritmetiktir, ortama bagli bir olcum degildir.
export const IS_SURESI = 3.6;      // K01: 3000 kayit / 833,33 kayit/s (Gorev Kuyruklari dersi)
export const ESIK = 0.2;           // K01: takip okumasinin siki esigi 200 ms

// Istemci istegi birakir, sonra durum adresini yoklar. Ustel geri cekilmede aralik tavana kadar
// ikiye katlanir; algoritma M14/K06'da kurulu, burada yalnizca yoklama sayisina uygulaniyor.
export function yokla({ aralik, ustel = false, tavan = 2, sure = IS_SURESI }) {
  let t = 0, p = aralik, yoklama = 0, bosa = 0;
  for (;;) {
    t += p; yoklama += 1;
    if (t >= sure) break;
    bosa += 1;
    if (ustel) p = Math.min(p * 2, tavan);
  }
  return { yoklama, bosa, gorme: t, fazla: t - sure,
    istek: 1 + yoklama, bosaOran: bosa / yoklama };
}
```

```js
// eszamansiz/olc.mjs — yoklama araligi taranir, sonra K01'in hacmine ve esigine baglanir
import { yokla, IS_SURESI, ESIK } from "./yoklama.mjs";

const S = [...[0.25, 0.5, 1, 2].map((a) => [`sabit ${a} s`, yokla({ aralik: a })]),
  ["ustel 0.25 s (tavan 2 s)", yokla({ aralik: 0.25, ustel: true })]];

console.log(`is suresi ${IS_SURESI.toFixed(2)} s (K01 hesabi), uctan uca esik ${ESIK * 1000} ms (K01)`);
console.log(`eszamanli tutulsaydi: 1 istek, baglanti ${IS_SURESI.toFixed(2)} s acik, ` +
  `esigin ${(IS_SURESI / ESIK).toFixed(0)} kati`);
console.log();
console.log(`${"strateji".padEnd(26)}${"yoklama".padStart(9)}${"bosa".padStart(7)}` +
  `${"bosa orani".padStart(12)}${"gorme s".padStart(10)}${"fazla s".padStart(10)}${"istek".padStart(7)}`);
for (const [ad, r] of S)
  console.log(`${ad.padEnd(26)}${String(r.yoklama).padStart(9)}${String(r.bosa).padStart(7)}` +
    `${r.bosaOran.toFixed(3).padStart(12)}${r.gorme.toFixed(2).padStart(10)}` +
    `${r.fazla.toFixed(2).padStart(10)}${String(r.istek).padStart(7)}`);

// K01: gunluk fatura satiri 4000 = satici sayisi (hesap); tepe carpani V8 = 3 (varsayim);
// uctaki tepe 513,89 istek/s (hesap).
const SATICI = 4000, V8 = 3, UC_TEPE = 513.89, GUN = 86_400;
console.log(`\n${"KK5".padStart(5)}${"rapor/gun".padStart(11)}${"strateji".padStart(27)}` +
  `${"istek/gun".padStart(11)}${"tepe istek/s".padStart(14)}${"uctaki payi".padStart(13)}`);
for (const KK5 of [0.25, 0.5]) {          // KK5: satici basina gunluk donem raporu istegi
  const rapor = SATICI * KK5;
  for (const [ad, r] of [S[0], S[4]]) {
    const tepe = (rapor * r.istek / GUN) * V8;
    console.log(`${KK5.toFixed(2).padStart(5)}${rapor.toFixed(0).padStart(11)}${ad.padStart(27)}` +
      `${(rapor * r.istek).toFixed(0).padStart(11)}${tepe.toFixed(4).padStart(14)}` +
      `${`%${(100 * tepe / UC_TEPE).toFixed(3)}`.padStart(13)}`);
  }
}
const esz = (rapor) => ((rapor / GUN) * V8 * IS_SURESI);
console.log(`\neszamanli tutulsaydi tepede acik baglanti: KK5 = 0,25 -> ` +
  `${esz(SATICI * 0.25).toFixed(3)}, KK5 = 0,50 -> ${esz(SATICI * 0.5).toFixed(3)}`);
```

```
is suresi 3.60 s (K01 hesabi), uctan uca esik 200 ms (K01)
eszamanli tutulsaydi: 1 istek, baglanti 3.60 s acik, esigin 18 kati

strateji                    yoklama   bosa  bosa orani   gorme s   fazla s  istek
sabit 0.25 s                     15     14       0.933      3.75      0.15     16
sabit 0.5 s                       8      7       0.875      4.00      0.40      9
sabit 1 s                         4      3       0.750      4.00      0.40      5
sabit 2 s                         2      1       0.500      4.00      0.40      3
ustel 0.25 s (tavan 2 s)          4      3       0.750      3.75      0.15      5

  KK5  rapor/gun                   strateji  istek/gun  tepe istek/s  uctaki payi
 0.25       1000               sabit 0.25 s      16000        0.5556       %0.108
 0.25       1000   ustel 0.25 s (tavan 2 s)       5000        0.1736       %0.034
 0.50       2000               sabit 0.25 s      32000        1.1111       %0.216
 0.50       2000   ustel 0.25 s (tavan 2 s)      10000        0.3472       %0.068

eszamanli tutulsaydi tepede acik baglanti: KK5 = 0,25 -> 0.125, KK5 = 0,50 -> 0.250
```

## Sayıların Okunması

Sabit aralıklı dört satır bir ödünleşimi gösteriyor. Aralık dört kat büyüdüğünde (0,25 → 1
saniye) yoklama sayısı 15'ten 4'e iniyor; karşılığında sonucu görme süresi 3,75'ten 4,00
saniyeye çıkıyor. Fazla bekleme 0,15 saniyeden 0,40 saniyeye, yani 2,67 katına çıkıyor.
Ödünleşim asimetriktir: dört kat daha az soru, yalnız 0,25 saniye daha geç sonuç.

Boşa yoklama oranı asıl israfı adlandırıyor. Çeyrek saniyelik aralıkta 15 yoklamanın 14'ü
"hâlâ yürüyor" yanıtı alıyor: oran 0,933. İki saniyelik aralıkta oran 0,500'e iniyor. Sabit
aralık, işin ne kadar süreceğini bilmediği için işin başında da sonunda da aynı sıklıkla sorar;
oysa bir işin biteceğine dair bilgi zamanla artar.

Son satır bunu kullanıyor. Üstel geri çekilmeli yoklama çeyrek saniyeyle başlar, aralığı iki
saniyelik tavana kadar iki katına çıkarır ve **4 yoklamayla 3,75 saniyede** sonucu görür — yani
sabit iki saniyelik aralığın yoklama sayısına yakın, sabit çeyrek saniyelik aralığın görme
süresiyle aynı. Fazla bekleme 0,15 saniyede kalıyor. Sabit aralıklı satırların hiçbiri bu iki
sayıyı birlikte veremiyor. Geri çekilme algoritması Dayanıklılık ve Güvenilirlik kursunda
kurulmuştu; burada yeniden denemeye değil, yoklamaya uygulanıyor ve aynı biçimde davranıyor.

## Hesaba Dönüş

Yoklama isteklerinin uçtaki tepe hıza ne eklediğini görmek için rapor hacmi gerekir. K01
günde 4000 fatura satırı hesaplamıştı ve her satır bir satıcının bir günü olduğuna göre satıcı
sayısı 4000'dir. Rapor isteği sıklığı K01'de yok.

**KK5 — satıcı başına günlük dönem raporu isteği 0,25.** Gerekçesi satıcıların dönem raporunu
her gün değil, haftada bir–iki kez istemesidir. K01'in tablosuna eklenmez; duyarlılığı 0,50
ile hesaplanır. Tepe çarpanı K01'in V8 varsayımıdır (3).

Sonuç iki yönlü okunmalı. Çeyrek saniyelik sabit yoklamada günde 16.000 istek çıkıyor ve tepede
0,5556 istek/s ediyor — K01'in uçtaki 513,89 istek/s'sinin yüzde 0,108'i. Üstel geri çekilmede
5000 istek, 0,1736 istek/s ve yüzde 0,034. KK5 iki katına çıkarsa oranlar yüzde 0,216 ve 0,068
olur. Yani **yoklamanın uçtaki maliyeti her durumda binde birkaçtır.**

Eşzamanlı alternatifin maliyeti de büyük değil: tepede aynı anda açık kalan bağlantı 0,125
(KK5 = 0,50'de 0,250). İki sayı birlikte okunduğunda kalıbın gerekçesi netleşir: eşzamansız
istek–yanıt bir **kaynak** kararı değil, bir **bütçe** kararıdır. Kaynak açısından iki yol da
ucuzdur; ayrım, 3,60 saniyelik bir işin 200 milisaniyelik eşiğin altına hiçbir zaman
inememesidir. Eşiği olan bir sistemde eşiğe sığmayan işin tek çıkışı, isteği yanıtla
tamamlamamaktır.

## Özet

- 3,60 saniyelik dönem raporu K01'in 200 milisaniyelik uçtan uca eşiğinin 18 katıdır; bütçeyi
  bölüştürmek adımı daraltır, büyütmez.
- Yerleşim üç adres kurar — istek, durum, sonuç; istek adresi kısa bir yazmadır ve eşiğe girer,
  aynı tekillik anahtarıyla gelen ikinci istek yeni iş başlatmaz.
- Sabit aralıkta yoklama sayısı ile görme süresi asimetrik takas edilir: aralık 0,25'ten 1
  saniyeye çıkınca yoklama 15'ten 4'e, fazla bekleme 0,15'ten 0,40 saniyeye gidiyor.
- Boşa yoklama oranı sabit çeyrek saniyede 0,933, iki saniyede 0,500; sabit aralık işin bitme
  olasılığının zamanla arttığını kullanmaz.
- Üstel geri çekilmeli yoklama iki sayıyı birlikte veriyor: 4 yoklama ve 3,75 saniyede görme,
  fazla bekleme 0,15 saniye.
- K01'e dönüş: KK5 = 0,25 ile yoklama tepede 0,5556 istek/s (uçtaki hızın yüzde 0,108'i), üstel
  geri çekilmede 0,1736 istek/s (yüzde 0,034); eşzamanlı tutulsaydı tepede 0,125 açık bağlantı.
  Kalıp bir kaynak kararı değil, bir bütçe kararıdır.

## Kurs Kapanışı

Kurs, isteğin uygulamaya ulaştıktan sonrasını iki konuda tasarladı ve her derste aynı üç soruyu
sordu: bu karar nedir, giriş kurslarının hesabındaki hangi sayıyı oynatıyor, karşılığında hangi
sayı büyüyor. Derslerin bıraktığı ölçüler aşağıdaki tabloda toplanıyor.

| Ders | Kararı | Oynadığı sayı | Karşılığında büyüyen |
|---|---|---|---|
| Durumsuz Servisler | durumun servis dışına taşınması | gereken kopya 4 → 3; kopya başına 200,93 → 171,30 istek/s | durum deposuna 1027,78 işlem/s, K01'in depo yükünün 7,40 katı |
| Servis Keşfi | adresin çalışma zamanında bulunması | arıza başına düşen istek 102.778 → 510,46 | liste penceresi 2980 ms; defterin kendi yükü 3,00 atış/s |
| İletişim Biçimleri | iç çağrının biçimi | iç bayt 352 / 181 / 206; iç istek 833,34 istek/s | çağıranın bildiği ad 6 → 8; iç sınır 1,60 Mbit/s'in 0,38–0,73 katı |
| Servisler Arası Sözleşme | şemanın evrilme sırası | kırılan tüketici 4/5 → 0 | kayıt 228 → 406 bayt; iç sınır 0,760 → 1,353 Mbit/s |
| Zaman Aşımı ve Deneme Bütçesi | bütçenin zincire bölüşümü | en kötü süre bütçenin 6,1 katından 200 ms'ye | iç istek 1666,68 → 1895,85 istek/s; yaygın yavaşlamada 3333,36 |
| Mesaj Kuyrukları | yükün zamana yayılması | işleme kapasitesi 97,22 → 48,61 olay/s | birikme tepesi 525.000, en uzun bekleme 3,00 saat |
| Görev Kuyrukları ve Arka Plan İşleri | uzun işin istek yolundan çıkarılması | 100 ms üstü bekleyen takip isteği yüzde 29,02 → 0 | rapor süresi 3,60 → 4,14 s; 4 yuva ve 4,00 işçi |
| Rekabet Eden Tüketiciler | işin kaç tüketiciye bölüneceği | 48,61 olay/s için tüketici başına en az 9,45 olay/s; N = 8'de katkı 0,128 | sıra bozulması 102 → 2279 gönderi |
| Kuyruk Tabanlı Yük Dengeleme | öngörülmeyen sıçramanın tamponlanması | varış 972 olay/s'ye çıkarken birikme 525.000'de, bekleme 3,00 saatte sabit | kuyruk sınırı 525.391; hacim artışında 350.049 düşen olay |
| Öncelikli Kuyruk | işlerin hizmet düzeyine ayrılması | en üst sınıfın beklemesi 6,5 dakikadan 0,0'a iniyor | en alt sınıfta 300.000 iş kuyrukta kalıyor; pay ayırmada B'nin birikmesi 440.000 → 740.000 |
| Sıralı Konvoy | sıra kısıtının şeride sokulması | yanlış son durum 1 → 0; kısıtlı tepe yazma 55,55 olay/s | tüketici gereksinimi ×1,357, kaba anahtarla ×1,786 |
| Koreografi ve Orkestrasyon | iş akışının kurulma modeli | telafi sorumluluğu 3 → 1 birim; telafisiz adım 80 → 0/gün | ileti 1,3889 → 2,2222 ileti/s, oran 1,600 |
| Zamanlayıcı–Aracı–Denetçi | yarım kalan işin bulunması | yarım kalan iş 160 → 0/gün, fatura satırlarının yüzde 4'ü | 320 yeniden sürme ve 80 boşa yürütme/gün |
| Lider Seçimi | tekil sorumluluğun tek düğüme verilmesi | çift ve üretilmeyen fatura satırı 2000 + 2000 → 0/yıl | iki turluk gecikme; iki liderli tur 2'de kalıyor |
| Eşzamansız İstek–Yanıt | çağıranın beklememesi | 3,60 s'lik iş 200 ms eşiğin dışından çıkıyor | yoklama tepede 0,1736 istek/s, uçtaki hızın yüzde 0,034'ü |

Tablonun kuralı adıyla anılmalı. Bu kursta ölçü **iki tanedir ve seçim çağıranın bekleyip
beklememesine göre yapılır.** Çağıran bekliyorsa ölçü **zincir gecikmesidir**: adım sayısı,
zaman aşımı ile deneme sayısının çarpımı, uçtan uca en kötü süre ve bütçe aşıldığında düşen
istek. Çağıran beklemiyorsa ölçü **birikme ve boşalmadır**: bekleyen iş tepesi, boşalma süresi,
tüketici sayısının katkısı ve tamponun sınırında düşen iş. İki ölçü birbirinin yerine geçmez;
bir kuyruk kararı gecikme bütçesiyle, bir zincir kararı birikme tepesiyle savunulamaz. Kursun
kendi varsayımları — durum deposunun yükü, kayıt defterinin yaşam süresi, geçit payı, tepe
penceresi, uzun iş talebi, taşıyıcı kesintisi, ek akışın süresi, tüketici grubunun kapasitesi,
sıra kısıtı oranı, iş akışı hata oranı, asılı kalma oranı, devralma sıklığı ve rapor isteği
sıklığı — K01'in tablosuna karışmadı; her biri kendi adı, gerekçesi ve duyarlılığıyla yazıldı.

Kursun bıraktığı soru bir katman daha içeridedir. Servisler durumsuzlaştı, adreslerini buldu,
sözleşmelerini kırmadan evirdi ve bütçelerini böldü; iş kuyruğa alındı, öncelik verildi, sırası
korundu, akışı koordine edildi ve yarım kalanı bulundu. Ama bütün bu tasarım **tek bir veri
deposu** varsayımı üzerinde duruyor. Durum, servisin dışına çıkarıldığında bir yere kondu ve o
yerin nasıl ölçekleneceği hiç sorulmadı: deponun çoğaltılması, verinin parçalanması, bağlamların
kendi depolarına federe edilmesi ve önbelleğin hangi katmanda duracağı bu kursta tasarlanmadı.
K01'in hesabındaki `depoya ulasan istek/s` ve `saklanan veri GB` satırları bu kurs boyunca hiç
oynamadı. Sonraki kurs **Veri Katmanı Ölçekleme** o satırları ele alır.
