---
title: 'Hat Çalıştırıcıları'
source: 'https://academia.sh/tr/kurslar/ci-cd/hat-calistiricilari'
course: 'Sürekli Tümleştirme ve Teslimat'
language: tr
updated: '2026-08-17T18:09:03+00:00'
license: 'CC BY-SA 4.0'
---

# Hat Çalıştırıcıları

Aynı hat iki çalıştırıcı türünde koşturulur: kuyrukta bekleme, koşum başına maliyet kalemi, önbelleğin koşumlar arasında kalıp kalmaması ve bakım kalemi sayılır, günde kaç koşumdan sonra hangi türün ucuzladığı hesaplanır ve ölçünün göz ardı ettiği kalemler adıyla yazılır.

Önceki ders hattın süresini 4 092 saniyeden 2 273 saniyeye indirdi ve sınırın 203 saniyede
durduğunu gösterdi. O ölçümün altında iki sessiz varsayım vardı: önbellek koşumlar arasında
yerinde duruyordu ve çalıştırıcılar her an hazırdı. İkisi de bedava değildir, ikisi de aynı karara
bağlıdır — hattın **nerede** koştuğu.

Seçenek iki türdür. **Yönetilen çalıştırıcı** koşum başına ayrılan, işi bitince dağılan bir
makinedir; her koşum temiz bir diskte başlar. **Kendi barındırılan çalıştırıcı** sürekli duran,
sahibi olan bir makinedir; diski koşumlar arasında kalır. Aradaki fark bir tercih değil, dört
ayrı sütundur: kuyrukta bekleme, koşum başına ödenen kalem, önbelleğin kalıcılığı ve bakım yükü.

**HT31.** İki tür `node` ile kurulan bir modeldir; tür olarak anılır, ürün ya da sağlayıcı adı
geçmez. **HT32.** Koşum süreleri önceki dersten alınır: yönetilen tür her koşumda soğuk başladığı
için 203 saniye, kendi barındırılan tür önbelleğini koruduğu için 163 saniye. **HT33.** Geliş
anları kendi yazılan üreteçle üretilir, tohum **4831**; kurgu iş günü üç yığılmadan oluşur, çünkü
kurgu ölçüm ağının ekibi işlemelerini sabah, öğleden sonra ve gün kapanışında yolluyor. **HT34.**
Bedeller **birim** cinsindendir, para birimi yazılmaz. **HT35.** Ölçüm tek günü kapsar; makine
arızası, yedek kapasite ve başarısız biten koşumun yeniden koşturulması modele girmez. **HT36.**
Kapı hesabı önceki dersin sekiz kusurluk kümesini ve on iki koşumluk dizisini sürdürür.

## İki Tür, Aynı Hat

Modelde bir tür dört sayıyla tanımlanır: kaç eşzamanlı yuvası olduğu, bir koşumun kaç saniye
sürdüğü, koşumun nasıl ücretlendirildiği ve kaç bakım kalemi taşıdığı.

```js
// olcum-agi/calistirici.mjs — iki calistirici turu ve bir gunun kuyrugu (model)
export const TOHUM = 4831;
export const uretec = (t) => () => ((t = (t * 48271) % 2147483647) / 2147483647);

// sure: 05'te olculen uc yuvali kosum suresi (saniye). yonetilen her kosumda soguk baslar (203 s),
// kendi barindirilan onbellegi koruyup sicak kosar (163 s). isabet: 05'in olctugu oran.
export const TUR = {
  yonetilen: { yuva: 8, sure: 203, isabet: 0, dakikaBedeli: 0.42, sabitGunluk: 0, kalem: 1, bakim: [] },
  barindirilan: {
    yuva: 2, sure: 163, isabet: 0.479, dakikaBedeli: 0, sabitGunluk: 2 * 11 + (6 * 28) / 30, kalem: 2,
    bakim: ["isletim sistemi yamasi", "disk dolmasi", "calistirici surumu", "ag ve sertifika", "kapasite/donanim"],
  },
};

// Kurgu is gunu: kosumlar uc yigilmaya (10:00, 14:00, 17:00) ucgen dagilimla dusuyor.
export const gelisler = (n, rnd) => Array.from({ length: n }, () => {
  const m = [10, 14, 17][Math.floor(rnd() * 3)] * 3600;
  return Math.round(m + (rnd() + rnd() - 1) * 1200); // ±20 dakika
}).sort((a, b) => a - b);

// Yuva cizelgesi: her gelis en erken bosalan yuvaya girer; bekleme = bosalma ani - gelis ani.
export const gun = (n, tur, rnd) => {
  const bos = Array(tur.yuva).fill(0), bekleme = [];
  for (const g of gelisler(n, rnd)) {
    const i = bos.indexOf(Math.min(...bos));
    const b = Math.max(0, bos[i] - g);
    bekleme.push(b); bos[i] = g + b + tur.sure;
  }
  return {
    ortBekleme: bekleme.reduce((a, b) => a + b, 0) / n,
    enUzun: Math.max(...bekleme),
    bekleyen: bekleme.filter((b) => b > 0).length,
    maliyet: tur.sabitGunluk + (n * tur.sure * tur.dakikaBedeli) / 60,
  };
};
```

Kendi barındırılan türün sabit günlük bedeli iki kalemden toplanır: iki makinenin günlük bedeli ve
ayda altı saatlik bakım emeğinin güne düşen payı. Yönetilen türde sabit bedel sıfırdır ve tek
kalem koşum süresidir. Bu, iki türün asıl farkıdır — biri **koşum** başına, öteki **zaman** başına
ödetir.

Yuva sayısı da aynı eksene oturur. Kendi barındırılan türde yuva satın alınan bir makinedir ve
sayısı iki ile sınırlıdır; yönetilen türde sekiz yuva modelin bildirdiği bir üst sınırdır, makine
değil. Bu sınırın kendisi bir kalem olarak sayılır — sekiz eşzamanlı koşum bedava değildir, o
sayının nereden geldiği modelde bildirilmiştir ve gerçek bir kurulumda pazarlık konusudur.

## Bir Günün Kuyruğu

Aynı hat, aynı geliş anları, iki tür. Altı ayrı yoğunlukta koşturulur: günde 10 koşumdan 80 koşuma.

```js
// olcum-agi/esik.mjs — ayni hat iki calistirici turunde: bekleme, maliyet, esik
import { TUR, TOHUM, uretec, gun } from "./calistirici.mjs";

const dk = (s) => (s / 60).toFixed(1);
console.log(`tohum ${TOHUM}; yuva: yonetilen ${TUR.yonetilen.yuva}, barindirilan ${TUR.barindirilan.yuva}`);
console.log("\n              yonetilen (soguk, 203 s)        kendi barindirilan (sicak, 163 s)");
console.log("kosum/gun  bekleme  enuzun  bekleyen  bedel   bekleme  enuzun  bekleyen  bedel");
for (const n of [10, 20, 30, 40, 60, 80]) {
  const y = gun(n, TUR.yonetilen, uretec(TOHUM)), b = gun(n, TUR.barindirilan, uretec(TOHUM));
  console.log(String(n).padStart(7) + [dk(y.ortBekleme) + " dk", dk(y.enUzun) + " dk", `${y.bekleyen}/${n}`,
    y.maliyet.toFixed(1), dk(b.ortBekleme) + " dk", dk(b.enUzun) + " dk", `${b.bekleyen}/${n}`, b.maliyet.toFixed(1)]
    .map((h, i) => h.padStart(i === 4 ? 12 : 9)).join(""));
}

let esik = 0;
while (gun(++esik, TUR.yonetilen, uretec(TOHUM)).maliyet <= gun(esik, TUR.barindirilan, uretec(TOHUM)).maliyet);
const y = gun(esik, TUR.yonetilen, uretec(TOHUM)), b = gun(esik, TUR.barindirilan, uretec(TOHUM));
console.log(`\nesik: gunde ${esik} kosumda yonetilen ${y.maliyet.toFixed(1)} birime cikar, ` +
  `kendi barindirilan ${b.maliyet.toFixed(1)} birimde sabit kalir.`);
console.log(`kosum basina maliyet kalemi: yonetilen ${TUR.yonetilen.kalem} (calistirici-dakikasi), ` +
  `barindirilan ${TUR.barindirilan.kalem} (makine + bakim emegi)`);
console.log(`bakim kalemi: yonetilen ${TUR.yonetilen.bakim.length}, barindirilan ` +
  `${TUR.barindirilan.bakim.length} — ${TUR.barindirilan.bakim.join(", ")}`);

// Kapi hesabi: 05'te onbellek iki kusuru kacirmisti (K4, K6). Temiz baslayan calistirici
// her kapiyi her kosumda kosturur, o iki kusur kacmaz.
const dizi = 12, fark = TUR.yonetilen.sure - TUR.barindirilan.sure;
console.log(`\nonbellek isabeti: yonetilen %${TUR.yonetilen.isabet * 100}, barindirilan %${(TUR.barindirilan.isabet * 100).toFixed(1)}`);
console.log(`kapi hesabi (${dizi} kosumluk dizi): yonetilen 8/8 kusur, barindirilan 6/8 (K4, K6 bayat isabet)`);
console.log(`iki kusurun bedeli: kosum basina ${fark} s, dizide ${dizi * fark} s ` +
  `(${dk(dizi * fark)} dk); gunde 30 kosumda ${dk(30 * fark)} dk ve ` +
  `${(gun(30, TUR.yonetilen, uretec(TOHUM)).maliyet - gun(30, TUR.barindirilan, uretec(TOHUM)).maliyet).toFixed(1)} birim fark`);

// Yonetilen tur + uzak onbellek deposu: isabet geri gelir, aktarim suresi ve depo bedeli eklenir.
const AKTARIM = 24, DEPO = 3;
const uzak = { ...TUR.yonetilen, sure: TUR.barindirilan.sure + AKTARIM, sabitGunluk: DEPO };
console.log(`\nyonetilen tur + uzak onbellek deposu: kosum ${uzak.sure} s, gunde 30 kosumda ` +
  `${gun(30, uzak, uretec(TOHUM)).maliyet.toFixed(1)} birim — ama bayat isabet geri geldigi icin kusur 6/8`);
```

```
tohum 4831; yuva: yonetilen 8, barindirilan 2

              yonetilen (soguk, 203 s)        kendi barindirilan (sicak, 163 s)
kosum/gun  bekleme  enuzun  bekleyen  bedel   bekleme  enuzun  bekleyen  bedel
     10   0.0 dk   0.0 dk     0/10     14.2      0.1 dk   0.6 dk     1/10     27.6
     20   0.0 dk   0.0 dk     0/20     28.4      0.1 dk   1.1 dk     2/20     27.6
     30   0.0 dk   0.0 dk     0/30     42.6      1.0 dk   5.3 dk    12/30     27.6
     40   0.0 dk   0.0 dk     0/40     56.8      1.5 dk   8.0 dk    21/40     27.6
     60   0.0 dk   1.0 dk     2/60     85.3      4.3 dk  15.1 dk    44/60     27.6
     80   0.1 dk   1.0 dk     8/80    113.7      6.6 dk  20.9 dk    63/80     27.6

esik: gunde 20 kosumda yonetilen 28.4 birime cikar, kendi barindirilan 27.6 birimde sabit kalir.
kosum basina maliyet kalemi: yonetilen 1 (calistirici-dakikasi), barindirilan 2 (makine + bakim emegi)
bakim kalemi: yonetilen 0, barindirilan 5 — isletim sistemi yamasi, disk dolmasi, calistirici surumu, ag ve sertifika, kapasite/donanim

onbellek isabeti: yonetilen %0, barindirilan %47.9
kapi hesabi (12 kosumluk dizi): yonetilen 8/8 kusur, barindirilan 6/8 (K4, K6 bayat isabet)
iki kusurun bedeli: kosum basina 40 s, dizide 480 s (8.0 dk); gunde 30 kosumda 20.0 dk ve 15.0 birim fark

yonetilen tur + uzak onbellek deposu: kosum 187 s, gunde 30 kosumda 42.3 birim — ama bayat isabet geri geldigi icin kusur 6/8
```

## Eşik ve Kuyruk

Para sütunu tek başına okunursa karar açık görünür: eşik **günde 20 koşumdur**. Altında yönetilen
tür ucuzdur — günde 10 koşumda 14,2 birime karşı 27,6 birim. Üstünde makas hızla açılır: günde 80
koşumda 113,7 birime karşı 27,6 birim, **4,1 kat**. Sabit bedel ödeyen taraf koşum sayısı arttıkça
kazanır, çünkü ödediği şey koşum değil zamandır.

Aynı sayılar koşum başına okunduğunda eğri görünür hâle gelir. Yönetilen türde koşum başına bedel
her yoğunlukta **1,42 birimdir** ve hiç değişmez — 14,2/10 ile 113,7/80 aynı sayıyı verir. Kendi
barındırılan türde koşum başına bedel 10 koşumda 2,76, 20 koşumda 1,38, 80 koşumda **0,35 birime**
iner. Bu, iki türün ekipte ürettiği davranışı da ayırır: sabit bedelde bir koşum daha koşturmak
bedavaya yakındır ve kimse koşum saymaz; koşum başına ödemede her ek koşumun bir fiyatı vardır ve
gereksiz koşumlar hesapta görünür. Aynı ölçü sonraki derslerde tetikleyici tasarımına da girer.

Kuyruk sütunu kararı geri çevirir. İki yuvalı kendi barındırılan tür günde 30 koşumda tıkanmaya
başlar: **30 koşumdan 12'si bekler**, ortalama bekleme 1 dakika, en uzun bekleme 5,3 dakika.
Günde 80 koşumda **63 koşum bekler**, ortalama 6,6 dakika ve en uzun bekleme 20,9 dakikadır. Sekiz
yuvalı yönetilen tür aynı gelişlerde 80 koşumun yalnız 8'ini bekletir ve en uzun bekleme 1
dakikadır. Beklemenin toplamı çarpıcıdır: 80 koşumda 6,6 × 80 = **528 dakika**, yani bir iş
gününden fazla bekleme, yönetilen türde 8 dakikaya karşı.

Kuyruğun günlük ortalamadan doğmadığı ayrıca sayılır. Günde 30 koşumda toplam iş 30 × 163 = 4 890
saniyedir; iki yuva dokuz saatlik bir günde 64 800 saniyelik kapasite sunar, yani doluluk yüzde
8'dir. Buna karşın 12 koşum bekler. Sebep gelişlerin şeklidir: koşumlar üç yığılmada, her biri
yirmi dakikalık bir aralıkta geliyor ve yığılmanın ortasında iki yuva birden dolu. Kapasite
kararı **günlük toplama** göre verilirse kuyruk hiç görünmez; kararın bakması gereken şey en
yoğun yirmi dakikadır.

Bu bekleme kapı hesabına doğrudan girer. Önceki dersin ölçtüğü "kapının eklediği süre" yalnız hat
süresiydi; kuyruk onun önüne eklenir. Günde 80 koşumda kendi barındırılan türde bir değişikliğin
geri bildirimi ortalama 163 + 396 saniyeyi bulur — koşum süresinin **iki buçuk katı bekleme**.
Hattı 40 saniye kısaltmak için ödenen çaba, kuyrukta kaybedilenin yanında görünmez hâle gelir.

Kuyruk para ile kapatılabilir ve hesabı basittir. İki makine yerine dört makine tutulursa sabit
bedel 4 × 11 + 5,6 = **49,6 birime** çıkar, yani günde 80 koşumdaki 113,7 birimin hâlâ yarısından
azdır. Eşik böylece tek sayı olmaktan çıkar: karar, koşum sayısı ile kabul edilebilir bekleme
süresinin kesişiminde durur.

## Temiz Başlamanın Kapı Değeri

Önbellek sütunu iki türü ayıran asıl yerdir. Kendi barındırılan çalıştırıcı önceki dersin ölçtüğü
**yüzde 47,9** isabeti korur; yönetilen çalıştırıcı her koşumda temiz başlar ve isabeti
**sıfırdır**. Koşum başına 40 saniyelik fark buradan gelir.

Kapı hesabı bu farkın öteki yüzünü gösterir. Önceki derste iki kusur (K4, K6) kaçmıştı, çünkü
bildirilmemiş bir girdi değiştiğinde ilgili kapı önbellekten gelip hiç koşmamıştı. Önbelleği
olmayan bir çalıştırıcıda böyle bir şey olamaz: her kapı her koşumda koşar ve on iki koşumluk
dizide **sekiz kusurun sekizi** yakalanır. İki kusurun bedeli koşum başına 40 saniye, dizide 480
saniye, günde 30 koşumda 20 dakika ve 15 birimdir.

Ara yol denenebilir: yönetilen tür, önbelleği uzak bir depodan geri yükleyerek koşabilir. Ölçüm bu
seçeneği de sayar — koşum 187 saniyeye iner, günde 30 koşumda 42,3 birim eder. Kazanç ilan
edildiği kadar değildir: 203 saniyeden 187 saniyeye inen sürenin karşılığında aktarım süresi ve
depo bedeli ödenir, günlük bedel 42,6'dan 42,3'e düşer. Daha önemlisi, **bayat isabet geri
gelir** — kusur sayımı 8/8'den 6/8'e döner. Yönetilen türün iki kusurluk üstünlüğü, hızından değil
tam olarak **önbelleksizliğinden** doğuyordu.

Bu üç sütun bir araya gelince karar kuralı tek cümleye inmez, ama sıraya girer. Koşum sayısı
eşiğin altındaysa yönetilen tür hem ucuz hem de kapı hesabında üstündür; seçim tartışmasızdır.
Eşiğin belirgin üstündeyse para kendi barındırılan türü gösterir, ama iki kalem geri ödenmelidir:
kuyruğu kapatacak ek yuva ve bayat isabetin kaçırdığı kusur. İkincisi para ile kapatılmaz;
kapatılma yolu önceki dersin gösterdiği yerdedir — kapıların girdilerini eksiksiz bildirmek. On iki
koşumluk dizide bunun bedeli 54 saniyeydi; aynı iki kusuru çalıştırıcı türünü değiştirerek
yakalamanın bedeli 480 saniye. **Aynı kusur, dokuz kat pahalı çözüm.**

Ölçünün göz ardı ettikleri adıyla yazılır. Yönetilen tarafta: eşzamanlılık üst sınırının aşıldığı
anlar, veri aktarım ücreti, sağlayıcı kesintisinde hattın tümüyle durması, hattın gizli
değerlerinin dışarıda çözülmesi ve çalıştırıcı sürümü değiştiğinde hat tanımının uyarlanması. Kendi
barındırılan tarafta: ilk kurulum emeği, yedek makine, arıza günü, güvenlik yamasının gecikmesi,
boşta duran kapasitenin elektrik ve alan bedeli, kapasite planlama hatası. İki tarafta da sayılmayan
iki kalem vardır: kuyrukta bekleyen kişinin bağlam kaybı ve başarısız biten koşumun yeniden
koşturulması. Beş bakım kalemi listelenmiştir ama emek olarak yalnız ayda altı saat üzerinden
fiyatlanmıştır; bakımın atlandığı bir ay bu sütunda hiç görünmez.

## Özet

- Eşik günde **20 koşumdur**: altında yönetilen tür ucuz (10 koşumda 14,2'ye karşı 27,6 birim),
  üstünde kendi barındırılan tür ucuzdur (80 koşumda 27,6'ya karşı 113,7 birim, 4,1 kat).
- Eşik tek başına karar vermez. İki yuvalı kendi barındırılan tür günde 30 koşumda 12 koşumu
  bekletir; 80 koşumda 63 koşum bekler, ortalama 6,6 ve en uzun 20,9 dakika. Aynı gelişlerde sekiz
  yuvalı yönetilen tür 8 koşumu 1 dakikaya kadar bekletir.
- Kuyruk kapının eklediği sürenin önüne yazılır: günde 80 koşumda bekleme, 163 saniyelik koşumun
  iki katıdır. Dört makineye çıkmak sabit bedeli 49,6 birime taşır ve kuyruğu parayla kapatır.
- Maliyet kalemleri farklı eksendedir: yönetilen türde bir kalem (çalıştırıcı-dakikası, koşum
  başına), kendi barındırılan türde iki kalem (makine ve bakım emeği, zaman başına) ile beş bakım
  kalemi.
- Temiz başlayan çalıştırıcı önbellek isabetini sıfırlar (yüzde 47,9'a karşı 0) ve on iki koşumluk
  dizide 8/8 kusur yakalar; kendi barındırılan tür 6/8'de kalır. İki kusurun bedeli koşum başına
  40 saniye, günde 30 koşumda 20 dakika ve 15 birimdir.
- Uzak önbellek deposu ara yolu süreyi 187 saniyeye indirir ama bayat isabeti geri getirir ve kusur
  sayımı 6/8'e döner; yönetilen türün üstünlüğü hızından değil önbelleksizliğinden gelir.

## Sonraki Adım

Bu ölçümde hat hep aynı hattı — sekiz aşama, aynı bağımlılıklar, aynı kapılar — koştu. Bir soru
sorulmadı: bu tanım nerede duruyor ve onu kim değiştiriyor? Yuva sayısını ikiden dörde çıkarmak,
bir kapıyı kaldırmak ya da tümleşim sınamasını bölmek hattın **tanımına** dokunmaktır. Tanım bir
arayüzde tıklanarak duruyorsa değişikliğin kimden geldiği, ne zaman ve neden yapıldığı hiçbir yerde
yazılı değildir; hat bozulduğunda geri dönülecek bir önceki hâl de yoktur. Tanım depoda bir dosya
olarak duruyorsa bunların hepsi vardır — ama beş servis için beş dosya, beş kez tekrarlanan aynı
satırlar demektir. Sonraki ders şemayı kendi tanımlar ve iki biçimi sayar: değişikliğin
izlenebilirliği, gözden geçirmeden geçen hat değişikliği oranı, hattın kendisi kırıldığında geri
alma adımı ve tanımın çoğaltılmasının satır bedeli.
