---
title: 'Göç Stratejileri'
source: 'https://academia.sh/tr/kurslar/platform-muhendisligi/goc-stratejileri'
course: 'Platform Mühendisliği'
language: tr
updated: '2026-08-17T18:09:10+00:00'
license: 'CC BY-SA 4.0'
---

# Göç Stratejileri

Platform geçişinin dalgalara bölünmesi: beş kurgu ekip tek dalgada taşındığında program 65 günden 15 güne inerken taşınan sayısının 4'ten 2'ye düşmesi, geride kalanın üç nedeninin (uyumsuz gereksinim, kritik dönem, sahipsiz servis) sırayla devreye girmesi, çift işletim yükünün 105,3'ten 0'a inmesine karşılık tepe destek yükünün yalnız tek ekiplik dalgada 6 birimlik bütçenin altında kalması ve hiç taşınmayan tek ekip yüzünden eski düzenin süresiz açık kalarak 1.095 günde 41.610 kurgu birim tutması.

Önceki ders faturayı beş ekibe böldü ve bölünemeyen kalemi saydı. O tablonun sessiz varsayımı
şuydu: beş ekip de zaten platformun üstünde. Gerçekte hiçbiri orada doğmadı — hepsi bir yerden
taşındı ya da hâlâ taşınmadı. Bu dersin ölçtüğü şey o taşımanın kendisidir.

Aşamalı geçiş kalıbının kendisi — eski düzenin çevresine sarılıp parça parça yerini alan
**boğucu incir** — M16/K06 ve M20/K03'te ölçüldü; burada tekrarlanmaz. Buradaki soru kalıbın
değil, **takvimin** sorusudur: beş ekip kaçarlı gruplar hâlinde taşınırsa ne olur.

## Programı Dalgalara Bölmek

Örnek yine kurgu **bölgesel ölçüm ağı**dır ve beş ekip kurgudur. Yükler, engeller ve bedeller
kurgudur; **para birimi de kurgudur** ve `br` diye anılır.

**PT31:** her ekibin bir **taşıma yükü** vardır, destek-birimi cinsinden. **PT32:** program
`ceil(5 / dalga)` dalga olarak planlanır; her dalga 5 gün hazırlık ve 8 gün kesim-doğrulama
sürer. Dalgasını kaçıran ekip bir sonrakine kalır, son dalgayı da kaçırırsa **geride kalır**.
**PT33:** platform ekibinin günlük destek bütçesi 6 birimdir; bir dalganın yükü sekiz günlük
bütçeyi aşarsa aşan kısım dalgayı uzatır. **PT34:** üç engel vardır — **kritik dönem** (0–30.
günler arasında taşınamaz), **uyumsuz gereksinim** (hiç taşınamaz; uyumsuzluk doğrulama
sırasında ortaya çıkar ve yükün %40'ı boşa gider), **sahipsiz servis** (yük 1,6 katına çıkar ve
ekip yalnız dalgada boşluk varsa taşınır). **PT35:** taşınmış her ekip son kesime kadar günlük
0,9 birim **çift işletim yükü** üretir. **PT36:** eski düzenin sabit günlük işletim bedeli ve
eksik yeteneği platforma eklemenin tek seferlik bedeli yazılıdır.

Plan ve takvim süreç içi bir **modeldir**; gerçek bir geçiş yoktur ve rastgelelik yoktur.

```js
// goc/dalga.mjs — goc dalgasi modeli: gercek bir gecis yok. Bes ekip, engelleri ve platform
// ekibinin destek butcesi bir veri yapisidir. Rastgelelik yoktur, plan tumuyle belirlenimlidir.
// Program `ceil(N/w)` dalga olarak planlanir; dalgasini kaciran ekip bir sonrakine kalir,
// son dalgayi da kacirirsa geride kalir. Para birimi kurgudur ve `br` diye anilir.

export const HAZIRLIK = 5;      // her dalganin sabit hazirlik suresi (gun)
export const TABAN = 8;         // her dalganin kesim ve dogrulama suresi (gun)
export const KAPASITE = 6;      // platform ekibinin gunluk destek butcesi (destek-birimi)
export const CIFT = 0.9;        // tasinmis ekip basina gunluk cift isletim yuku
export const BOSA = 0.4;        // basarisiz denemede harcanan yuk orani
export const ADIM = 14;         // ekip kendi tasisa yeniden yazacagi altyapi adimi
export const KALAN_ADIM = 4;    // platform devraldiktan sonra ekibe kalan adim
export const ESKI_SABIT = 38;   // eski duzenin gunluk sabit isletim bedeli (br)
export const YETENEK = 2400;    // eksik yetenegi platforma eklemenin tek seferlik bedeli (br)

// ekip: ad, tasima yuku (destek-birimi), engel, kritik donem penceresi (gun araligi)
export const EKIP = [
  { ad: "sayac-okuma", yuk: 18, engel: null, pencere: null },
  { ad: "dogrulama", yuk: 14, engel: null, pencere: null },
  { ad: "faturalama", yuk: 22, engel: "kritik donem", pencere: [0, 30] },
  { ad: "saha", yuk: 26, engel: "uyumsuz gereksinim", pencere: null },
  { ad: "raporlama", yuk: 16, engel: "sahipsiz servis", pencere: null },
];
export const N = EKIP.length;
export const etkinYuk = (e) => (e.engel === "sahipsiz servis" ? e.yuk * 1.6 : e.yuk);
const cakisir = (p, a, b) => p !== null && !(b < p[0] || a > p[1]);

export function planla(w) {
  const sayi = Math.ceil(N / w), dalgalar = [], tasinan = [], geride = [];
  let t = 0, kalan = EKIP.map((_, i) => i), bosa = 0;
  for (let d = 0; d < sayi && kalan.length; d++) {
    const bas = t + HAZIRLIK, son = bas + TABAN - 1, secilen = [];
    let yuk = 0;
    for (const i of kalan) {
      if (secilen.length >= w) break;
      const e = EKIP[i], ey = etkinYuk(e);
      if (cakisir(e.pencere, bas, son)) continue;     // kritik donem: sonraki dalgaya kalir
      if (e.engel === "sahipsiz servis" && yuk + ey > KAPASITE * TABAN) continue;  // slack yok
      secilen.push(i); yuk += ey;
    }
    if (!secilen.length) { t += HAZIRLIK + TABAN; continue; }
    const gecikme = Math.max(0, Math.ceil((yuk - KAPASITE * TABAN) / KAPASITE));
    const sure = HAZIRLIK + TABAN + gecikme, kesim = t + sure - 1;
    for (const i of secilen) {
      if (EKIP[i].engel === "uyumsuz gereksinim") {   // uyumsuzluk dogrulamada ortaya cikar
        geride.push([i, "uyumsuz gereksinim"]); bosa += EKIP[i].yuk * BOSA;
      } else tasinan.push([i, kesim]);
    }
    dalgalar.push({ bas, son, sure, yuk, secilen });
    kalan = kalan.filter((i) => !secilen.includes(i));
    t += sure;
  }
  for (const i of kalan) geride.push([i, EKIP[i].engel ?? "dalga kalmadi"]);

  const kesimler = tasinan.map((x) => x[1]);
  const ilk = kesimler.length ? Math.min(...kesimler) : 0;
  const bitis = kesimler.length ? Math.max(...kesimler) : 0;
  const gun = new Array(t + 1).fill(0);
  for (const x of dalgalar) for (let g = x.bas; g <= x.son; g++) gun[g] += x.yuk / TABAN;
  for (const [, k] of tasinan) for (let g = k + 1; g <= bitis; g++) gun[g] += CIFT;
  return { w, dalga: dalgalar.length, program: t, tasinan, geride, bosa, birlikte: bitis - ilk,
    tepe: Math.max(...gun), cift: tasinan.reduce((a, [, k]) => a + CIFT * (bitis - k), 0),
    adim: tasinan.length * (ADIM - KALAN_ADIM) };
}
```

```js
// goc/olc.mjs — dalga buyuklugu taramasi, geride kalanin nedeni ve hic tasinmayanin bedeli.
import { EKIP, N, KAPASITE, ESKI_SABIT, YETENEK, ADIM, KALAN_ADIM, planla } from "./dalga.mjs";

const yaz = (g, ...s) => console.log(s.map((v, i) =>
  (g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i]))).join(""));
const t0 = process.hrtime.bigint();

const W = [1, 2, 3, 5], AYAR = W.map(planla);
console.log(`${N} ekip, platform destek butcesi ${KAPASITE} birim/gun`);

console.log("\n1. dalga buyuklugu taramasi");
const A = [-7, 8, 10, 10, 9, 15, 10, 10];
yaz(A, "dalga", "sayisi", "program", "tasinan", "geride", "kesim araligi", "tepe yuk",
  "cift yuk");
for (const r of AYAR)
  yaz(A, r.w, r.dalga, `${r.program} gun`, `${r.tasinan.length}/${N}`, r.geride.length,
    `${r.birlikte} gun`, r.tepe.toFixed(2), r.cift.toFixed(1));
console.log(`  destek butcesini asan ayar: ` +
  AYAR.filter((r) => r.tepe > KAPASITE).map((r) => `dalga=${r.w}`).join(", "));
console.log("  kesim araligi: ilk kesimden son kesime — iki duzenin birlikte isletildigi");
console.log("  surenin dalga buyuklugune bagli bolumu; eski duzen hicbir ayarda kapanmaz");

console.log("\n2. geride kalan kim, nedeni ne");
const B = [-16, -20, ...W.map(() => 9)];
yaz(B, "ekip", "neden", ...W.map((w) => `dalga=${w}`));
for (let i = 0; i < N; i++) {
  const satir = AYAR.map((r) => r.geride.find((x) => x[0] === i));
  if (!satir.some(Boolean)) continue;
  yaz(B, EKIP[i].ad, satir.find(Boolean)[1], ...satir.map((g) => (g ? "geride" : "tasindi")));
}
yaz(B, "kurtarilan adim", `${ADIM} yerine ${KALAN_ADIM}`, ...AYAR.map((r) => r.adim));
console.log(`  uyumsuzluk dogrulamada ortaya cikar: bosa giden destek ` +
  `${AYAR[0].bosa.toFixed(1)} birim (her ayarda ayni)`);

console.log("\n3. hic tasinmayanin uzun vadeli bedeli (kurgu para birimi)");
const kalanEkip = AYAR[0].geride.length, oncePay = ESKI_SABIT / N;
const sonraPay = ESKI_SABIT / kalanEkip, basabas = Math.ceil(YETENEK / ESKI_SABIT);
const C = [-24, 12, 12, 13];
yaz(C, "kalem", "gunluk br", "365 gun", "1095 gun");
yaz(C, "eski duzenin isletimi", ESKI_SABIT, ESKI_SABIT * 365, ESKI_SABIT * 1095);
yaz(C, "eksik yetenegi eklemek", "-", YETENEK, YETENEK);
yaz(C, "fark", "-", ESKI_SABIT * 365 - YETENEK, ESKI_SABIT * 1095 - YETENEK);
console.log(`  basa bas ${basabas}. gun; eski duzen ${kalanEkip} ekip icin acik kalir`);
console.log(`  ekip basina eski duzen bedeli ${oncePay.toFixed(1)} -> ${sonraPay.toFixed(1)} ` +
  `br/gun (${(sonraPay / oncePay).toFixed(1)} kat)`);

const ms = Number(process.hrtime.bigint() - t0) / 1e6;   // ham olcum basilmaz, bant denetlenir
console.log(`\nuc tablo ve dalga taramasi 2000 ms bandinda: ${ms < 2000 ? "evet" : "hayir"}`);
```

```
5 ekip, platform destek butcesi 6 birim/gun

1. dalga buyuklugu taramasi
dalga    sayisi   program   tasinan   geride  kesim araligi  tepe yuk  cift yuk
1             5    65 gun       4/5        1         52 gun      5.95     105.3
2             3    39 gun       4/5        1         26 gun      7.75      46.8
3             2    28 gun       3/5        2         13 gun      7.25      23.4
5             1    15 gun       2/5        3          0 gun      7.25       0.0
  destek butcesini asan ayar: dalga=2, dalga=3, dalga=5
  kesim araligi: ilk kesimden son kesime — iki duzenin birlikte isletildigi
  surenin dalga buyuklugune bagli bolumu; eski duzen hicbir ayarda kapanmaz

2. geride kalan kim, nedeni ne
ekip            neden                 dalga=1  dalga=2  dalga=3  dalga=5
faturalama      kritik donem          tasindi  tasindi   geride   geride
saha            uyumsuz gereksinim     geride   geride   geride   geride
raporlama       sahipsiz servis       tasindi  tasindi  tasindi   geride
kurtarilan adim 14 yerine 4                40       40       30       20
  uyumsuzluk dogrulamada ortaya cikar: bosa giden destek 10.4 birim (her ayarda ayni)

3. hic tasinmayanin uzun vadeli bedeli (kurgu para birimi)
kalem                      gunluk br     365 gun     1095 gun
eski duzenin isletimi             38       13870        41610
eksik yetenegi eklemek             -        2400         2400
fark                               -       11470        39210
  basa bas 64. gun; eski duzen 1 ekip icin acik kalir
  ekip basina eski duzen bedeli 7.6 -> 38.0 br/gun (5.0 kat)

uc tablo ve dalga taramasi 2000 ms bandinda: evet
```

Sayılar **ölçüm** sınıfındadır; girdileri yukarıdaki varsayımlardır.

## Dalga Büyüdükçe Takvim Kısalıyor, Kapsam Daralıyor

Birinci tablo dört ayarı yan yana koyar ve iki sütun ters yönde ilerler. Program süresi tek
ekiplik dalgada **65 gün**, beş ekiplik tek dalgada **15 gündür** — dört kattan fazla. Aynı
yönde kesim aralığı 52 günden 0 güne, çift işletim yükü 105,3 birimden 0'a iner. Büyük dalga
takvimi kısaltır ve bunda gizli bir şey yoktur.

Ters yönde ilerleyen sütun taşınan ekip sayısıdır: **4/5'ten 2/5'e** düşer. Beş ekiplik dalga
programı dört kattan fazla kısaltırken kapsamı yarıya indirir. On beş günde biten bir geçiş,
geçişin kendisinin yarısını hiç yapmamış olmakla ölçülür.

Üçüncü bir sütun ikisinden de bağımsız davranır. Tepe destek yükü tek ekiplik dalgada **5,95
birim**, diğer üç ayarda 7,25 ile 7,75 arasındadır; platform ekibinin günlük bütçesi 6 birimdir.
Yalnız `dalga=1` bütçenin içinde kalır. Büyük dalga aynı işi daha kısa bir pencereye sıkıştırır
ve sıkıştırılan iş bir yerde taşar: `dalga=3` ve `dalga=5` ayarlarında ilk dalganın yükü sekiz
günlük bütçeyi aşar ve dalgayı iki gün uzatır.

Bu tablonun okunmayan bir yeri var: kesim aralığı **sıfır** olan ayar iki düzenin birlikte
işletilmediği anlamına gelmez. Sıfır, taşınan iki ekibin aynı gün kesime girdiği anlamına gelir.
Eski düzen dört ayarın hiçbirinde kapanmaz ve nedeni ikinci tablodadır.

## Geride Kalanın Adı Var

İkinci tablo geride kalanı isimle ve nedenle yazar. Üç neden üç ayrı ayarda devreye girer.

**Uyumsuz gereksinim** her ayarda geride bırakır. Saha ekibinin uç düğümleri çevrimdışı
çalışırken de veri toplar; platform sürekli bağlantı varsayar. Dalga büyüklüğü bu engeli hiç
etkilemez, çünkü engel takvimde değil yetenektedir. Uyumsuzluk kesim doğrulaması sırasında
ortaya çıktığı için ekibin yükünün %40'ı, **10,4 birim** destek, her ayarda boşa gider.

**Kritik dönem** `dalga=3` ve `dalga=5`'te devreye girer. Faturalama ekibi 0–30. günler
arasında taşınamaz; iki ya da bir dalgalık programda o pencerenin dışına düşen bir dalga
kalmaz. Beş dalgalık programda üçüncü dalga 31. günde başlar ve ekip taşınır. **Takvim
esnekliği bir kapasitedir ve yalnız dalga sayısı çoğaldıkça vardır.**

**Sahipsiz servis** yalnız `dalga=5`'te devreye girer. Raporlama ekibinin iki servisinin sahibi
yoktur; işi platform ekibi yapar ve yük 1,6 katına, 25,6 birime çıkar. Tek dalgalık programda
diğer üç ekip sekiz günlük bütçeyi zaten doldurduğu için bu yüke yer kalmaz.

Son satır platformun ne kazandırdığını sayar: taşınan ekip kendi göç adımlarının **14'ünden
10'unu** platforma bırakır, 4 adım kendinde kalır. Kazanç doğrudan taşınan sayısına bağlıdır —
`dalga=1`'de 40 adım, `dalga=5`'te 20. Saha ekibi hiçbir ayarda tek adım kazanmaz.

Soyutlamanın sızdığı yer kesim aralığıdır. O gün sayısı boyunca taşınmış ekipler yeni düzende,
taşınmamışlar eskisinde çalışır ve aradaki her bağlantıyı kuran taraf **iki düzenin de** ayarını
bilmek zorundadır. Platformun kapattığını iddia ettiği katman tam da geçiş sırasında yeniden
açılır ve `dalga=1` ayarında bu 52 gün sürer. En çok ekibi taşıyan ayar, soyutlamanın en uzun
süre sızdığı ayardır.

## Hiç Taşınmayanın Faturası

Üçüncü tablo tek bir kalemi sorar: hiç taşınmayan ne kadar tutuyor. Eski düzenin sabit işletim
bedeli günlük 38 birimdir ve tek bir ekip orada kaldığı sürece ödenir — 365 günde **13.870**,
1.095 günde **41.610** birim. Eksik yeteneği platforma eklemek tek seferlik 2.400 birimdir ve
başa baş noktası **64. gündür**. Üç yıllık farkın 39.210 birim olması bu kararın bir bütçe
kalemi değil, bir eşik olduğunu gösterir.

İkinci sayı daha keskindir. Eski düzen beş ekip tarafından paylaşılırken ekip başına günlük 7,6
birim düşüyordu; dört ekip taşındıktan sonra aynı 38 birimi tek başına saha ekibi taşır —
**5 kat**. Geçiş, geride kalan için maliyeti azaltmaz, beşe katlar. Platformun kazandırmadığı
durum burada tek bir çarpanla görünür: saha ekibi 0 adım kazanmış, 10,4 birim destek harcatmış
ve işletim payını beş katına çıkarmıştır.

Buradan iki yol çıkar ve ikisi de tablodadır: yeteneği platforma eklemek (2.400 birim, 64 günde
kendini öder) ya da iki düzeni süresiz işletmek. Üçüncü bir yol — "geçiş tamamlandı" demek —
sayıların hiçbirine karşılık gelmez.

## Özet

- Dalga büyüklüğü 1'den 5'e çıkarken program 65 günden 15 güne, kesim aralığı 52 günden 0'a,
  çift işletim yükü 105,3 birimden 0'a iner; buna karşılık taşınan ekip sayısı 4/5'ten 2/5'e
  düşer ve geride kalan 1'den 3'e çıkar.
- Tepe destek yükü yalnız tek ekiplik dalgada (5,95) günlük 6 birimlik bütçenin altında kalır;
  diğer üç ayarda 7,25–7,75 arasındadır ve `dalga=3` ile `dalga=5`'te ilk dalga iki gün uzar.
- Geride kalmanın üç nedeni ayrı ayarlarda devreye girer: uyumsuz gereksinim her ayarda (saha,
  10,4 birim boşa giden destek), kritik dönem `dalga≥3`'te (faturalama), sahipsiz servis yalnız
  `dalga=5`'te (raporlama).
- Platformun kazancı taşınan sayısıyla orantılıdır — 14 adımın 10'u devredilir, `dalga=1`'de 40
  adım, `dalga=5`'te 20; hiç taşınmayan ekip tek adım kazanmaz.
- Hiç taşınmayan tek ekip yüzünden eski düzen süresiz açık kalır: günlük 38 birim, 1.095 günde
  41.610 birim. Eksik yeteneği eklemek 2.400 birimdir ve 64. günde kendini öder; geride kalanın
  işletim payı 7,6'dan 38,0 birime, beş katına çıkar.

## Sonraki Adım

Altı ders platformun ne yaptığını saydı: ortam sağladı, iskelet üretti, katalog tuttu, kural
gömdü, maliyeti böldü ve ekipleri dalgalar hâlinde taşıdı. Her derste bir de karşı sayı vardı —
sızan durum, dışına çıkan ekip, kendini ödemeyen eşik. Sıradaki ders bu iki sütunu tek bir
soruya bağlar: platformu benimseyen ekiplerle benimsemeyenler arasındaki fark ölçülebilir mi, ve
platformun kendi ölçütleri hangi noktada benimseme sayısını değil, benimsemenin işe yaradığını
göstermeye başlar.
