Acil cerrahi ve gastroenteroloji kliniklerinde çok nadir görülen ancak karşılaşıldığında hekimleri dehşete düşüren bir acil durum vardır: "Akut Masif Gastrik Dilatasyon ve Mide Perforasyonu". İnsan midesi elastik bir organdır; ortalama 1.5 ila 2 litre hacme kadar genişleyebilir. Şimdi aşırı yeme bozukluğu olan bir hastanın veya şuursuz birinin, tek bir oturuşta 15 kilogram katı gıdayı ve litrelerce sıvıyı çiğnemeden midesine tıkıştırdığını hayal edin!

Mide o devasa hacim karşısında devasa bir balona döner. Diyaframa yukarıdan öyle bir mekanik bası yapar ki hasta nefes alamaz; ana toplardamarlar ezildiği için kalbe kan dönemez. Ve en sonunda mide duvarı o basınca dayanamayarak yırtılır (perforasyon); mide asidi ve sindirilmemiş kilolarca besin karın boşluğuna (periton) akar. Hasta dakikalar içinde masif septik şoktan hayatını kaybeder. Mideyi öldüren şey besinin kalitesi değil; fizyolojik kapasiteyi hiçe sayan oburca bir hacim çılgınlığıdır.

Web barındırma ve e-ticaret altyapılarında da destek ekiplerini hem güldüren hem de çıldırtan en absürt krizlerden biri tam olarak bu gastrik patlama felaketidir: Yıllık maliyeti bir akşam yemeği parasını geçmeyen paylaşımlı hosting paketine WooCommerce kurup, tek seferde 1 milyon ürünlük (SKU) devasa bir XML envanterini boca etmeye kalkışmak.

"Tedarikçim XML Verdi, Zengin Oluyorum!"

Senaryo her defasında benzer bir heves ve derin bir altyapı cehaletiyle başlar. Geleneksel ticaretle uğraşan bir esnaf veya yeni bir e-ticaret girişimcisi, Çin'den veya Tahtakale'deki büyük bir toptancıdan bayilik (dropshipping) almıştır.

Toptancı firmaya bir link verir: https://toptanci.com/xml/tum_urunler.xml.

Dosya boyutuna kimse bakmaz: Tam 650 Megabayt!

İçinde vida, cıvata, cep telefonu kılıfı, oto aksesuarı dahil tam 1.000.000 (Bir Milyon) adet ürün, her bir ürünün 5 farklı fotoğrafı, detaylı teknik açıklamaları, kategori ağaçları ve varyantları vardır!

Girişimcimiz hemen yıllık 200 TL'ye en ucuzundan standart bir paylaşımlı cPanel hosting paketi satın alır. Üzerine tek tıkla bir WordPress ve WooCommerce kurar.

Ardından bir eklenti yükler: "WP All Import" veya "Otomatik XML İçe Aktarıcı".

Dosya linki yapıştırılır, ayarlar yapılır ve o ölümcül buton tıklanır: "İçe Aktarımı Başlat (Run Import)".

Ve arkanıza yaslanıp kahvenizi yudumlarsınız: "1 milyon ürünüm yüklenecek, yarın sabah Trendyol'a rakip olacağım!"

Sunucunun Midesinde Patlama: Out of Memory Cinneti

İşlem başlar. Eklenti o 650 MB'lık devasa XML dosyasını sunucunun geçici hafızasına (RAM) indirmeye çalışır.

Fakat kullanıcının barındığı paylaşımlı sunucuda CloudLinux LVE kalkanı devrededir. Kullanıcıya ayrılan fiziksel RAM tavanı: 1 GB (1024 MB).

PHP'nin memory_limit değeri ise varsayılan olarak 256 MB'tır!

PHP motoru o devasa XML ağacını parçalamaya (parse etmeye) başlar. SimpleXML veya DOMDocument kütüphanesi, 650 MB'lık ham metni belleğe açtığında her bir düğüm için nesneler türetir. 650 MB'lık XML, bellekte tam 3.5 Gigabaytlık bir hafıza canavarına dönüşür!

Daha 40. saniyede, ilk 5.000 ürün okunurken hafıza tavanına toslar. Ekranda o kaçınılmaz hata patlar:

Fatal error: Allowed memory size of 268435456 bytes exhausted 
(tried to allocate 84218820 bytes) in /home/esnaf/public_html/wp-content/plugins/
wp-all-import/classes/parse.php on line 412

Kullanıcı cPanel'e girer, memory_limit değerini 1024M yapar. Tekrar başlatır.

Bu kez PHP sınırı değil, CloudLinux'un fiziksel RAM sınırı patlar! Sunucu işlemcisi o milyonlarca düğümü döngüye sokarken tek çekirdeği %100 kilitler. Disk I/O sınırı aşılır. CloudLinux çekirdeği sunucudaki diğer 200 masum siteyi korumak için giyotini indirir:

508 Resource Limit Is Reached
(Kaynak Limitleri Aşıldı!)

Site kilitlenir, veritabanı kilitlenir, sunucu komaya girer.

"Sunucunuz Benim Ürünlerimi Kaldıramıyor!"

Kullanıcı çılgına döner. Destek masasına büyük harflerle bilet açar:

"Siz nasıl bir firmasınız! Bir XML dosyasını bile içeri aktaramıyor sunucunuz! 'Memory limit' hatası verip duruyor. Benim 1 milyon ürünüm var, hepsi yüklenmek zorunda! Milyonluk ticaretimi engelliyorsunuz, hemen sunucunun sınırlarını kaldırın, hepsini içeri aktarsın!"

Destek mühendisi saçını başını yolar. Kullanıcıya matematiğin ve fizik kanunlarının sınırlarını anlatmak zorundadır:

"Ahmet Bey, 1 milyon ürün demek; WooCommerce veritabanında her ürün için yaklaşık 15 satır meta verisi (wp_postmeta) demektir. Yani veritabanınıza tek bir oturumda 15 MİLYON satır veri yazmaya çalışıyorsunuz! Her ürünün 3 fotoğrafı olsa, sunucuya dışarıdan 3 milyon adet resim indirilecek demektir. Bu işlem tek başına 200 GB disk alanı ve devasa bir bellek gerektirir. Yıllık 200 liralık paylaşımlı bir hosting paketinde 1 milyon ürünü tek tıkla içeri aktaramazsınız!"

Kullanıcının cevabı değişmez: "Bana ne teknik detaydan, sınırsız hosting demediniz mi? Sınırsızsa alsın işte!"

Bir Milyon Ürünü Yönetmenin Gerçek Mühendislik Mimarisi

Bir bakkal dükkânına 100 tırlık malı aynı anda sokamazsınız; bunun için organize bir lojistik antreponuz, vinçleriniz ve dağıtım filonuz olmak zorundadır. 1 milyon SKU'luk bir e-ticaret altyapısını yönetmenin gerçek mimari gereksinimleri şunlardır:

  1. Paylaşımlı Hosting Değil, Özel Sunucu (Dedicated Server): Bu ölçekte bir envanter için en az 64 GB ECC RAM'li, yüksek hızlı NVMe disk dizilerine (RAID 10) sahip bağımsız bir fiziksel sunucu şarttır.
  2. Asenkron Kuyruk Mimarisi (CLI & Queue Workers): 1 milyon ürün asla web tarayıcısı üzerinden, tek bir HTTP oturumuyla yüklenemez! Bu işlem terminal üzerinden, PHP CLI ile ve arka planda RabbitMQ veya Redis BullMQ kuyrukları kullanılarak parçalanmalıdır. Her dakikada 500 ürün işlenir; bellek asla şişirilmez.
  3. XML Streaming (XMLReader): Tüm 650 MB'lık dosyayı belleğe yükleyen ilkel kütüphaneler yerine, dosyayı satır satır akıtan (streaming) XMLReader kütüphanesi kullanılmalıdır. Böylece 1 GB'lık XML bile sadece 20 MB RAM tüketilerek okunur.
  4. Elasticsearch / Meilisearch Arama Katmanı: 1 milyon ürünün bulunduğu bir MySQL veritabanında standart LIKE '%arama%' sorgusu atarsanız veritabanı çöker! Ürün aramaları ve filtrelemeleri için mutlaka harici bir Elasticsearch kümesi kurulmalıdır.

On beş kilo yemeği tek hamlede yutup midesi patlayınca aşçıyı suçlayan hasta ne kadar trajikomikse; 1 milyon ürünü 200 liralık paylaşımlı pakete tıkıp sunucuyu kilitleyen esnaf da o kadar büyük bir yanılgı içindedir. Ticaret hayallerle başlar; ancak o hayalleri ayakta tutan şey hayallerin büyüklüğüne yakışan doğru ve profesyonel mühendislik altyapısıdır.