soylenmezsmt adlı üyeden alıntı: mesajı görüntüle
Hocam tamam orasını anladım lakin 10 farklı perfect panel hepsinde aynı anda completed olmasının mantığı ne olabilir?
Hepsi nasıl aynı anda completed oluyor?
Hepsi farklı databasede ise örneğin 1 sipariş için öncelikle inprogress'e alırız,sonra start count gireriz,sonrasında completed yaparız. 10 panelde bu işlemler yapılması gerekse 3 sorgu 1 panelde yapılıyor,ve bunlar aynı anda yapılmıyor 10 saniye aralıklarla filan yapılıyor 10 farklı panel için 30 adet sorgu demek. Ki bu sadece 1 sipariş için. Perfect Panel bir günde 100 Milyon civarı veya fazlası sipariş yapıyor ve her biri için bu kadar sorgu yapacağını düşünürsek çıkan sonuç oldukça mantıksız değil mi?
Tekrar selamlar, çok doğru bir yerden yakaladın. Zaten standart bir yazılımcının "bu kadar yükü nasıl kaldırıyorlar?" diye kafayı yaktığı nokta tam olarak burasıdır.
Senin yaptığın hesapta "Lineer (Doğrusal) İşlem" mantığı var. Yani:
"Önce A'yı güncelle, bitti. Sonra B'yi güncelle, bitti. Sonra C..."
Eğer Perfect Panel (veya benzeri dev yapılar) bu mantıkla çalışsaydı, dediğin gibi sistem 1 saat içinde kilitlenirdi.
Buradaki sihirli kelimeler şunlar: Tek Veritabanı Mimarisi (Single Tenant DB), Indexing ve Cache (Önbellek).
Gel senin "10 farklı panel, 10 farklı sorgu" tezini çürüterek sistemin nasıl tek bir parmak şıklatmasıyla 10 paneli güncellediğini anlatayım.

1. \"Farklı Database\" Yanılgısı


En büyük yanılgı burada. Perfect Panel'deki o 5000 sitenin hepsi (çok çok yüksek ihtimalle) fiziksel olarak aynı veritabanı sunucusunda (veya cluster'ında), aynı tablonun içindedir.
Düşün ki orders diye devasa bir tablo var. Milyarlarca satır var.
Tablo yapısı şuna benzer:
idpanel_idservice_idstatusupstream_order_idroot_order_id100Panel_10 (Ana)5CompletedNULLGUID-123101Panel_920Completed100GUID-123102Panel_855Completed101GUID-123..................110Panel_1 (Sen)99Completed109GUID-123Gördüğün gibi hepsi aynı tabloda.
Şimdi ana sağlayıcı (Panel 10), "Sipariş Tamamlandı" dediğinde sistem arka planda 10 tane ayrı sorgu atmaz.
Şöyle tek bir SQL sorgusu çalıştırır:
SQLUPDATE orders SET status = 'completed' WHERE root_order_id = 'GUID-123';
Bum! Tek bir satır kod. Veritabanı motoru (PostgreSQL veya MySQL), root_order_id üzerinde "Index" olduğu için bu işlemi milisaniyeler içinde yapar. İsterse o zincirde 100 tane panel olsun, veritabanı için bu "tek bir işlemdir".
Yani senin düşündüğün gibi "Önce 9'a git, sonra 8'e git" diye bir döngü yok. Toplu güncelleme (Bulk Update) var.

2. \"Read-Through\" (Okurken Çekme) Tekniği


İkinci bir ihtimal (ve daha modern bir yaklaşım) ise veritabanını bile yormamaktır.
Sen Panel 1'in sahibi olarak "Siparişler" sayfasına girdiğinde, sistem senin veritabanı satırındaki "status" sütununa bakmak yerine, Cache (Redis) katmanına bakar.
Sistem şöyle çalışır:
  1. Ana sağlayıcı siparişi tamamlar.
  2. Redis'e (RAM belleğe) şu bilgi girilir: Key: STATUS_GUID_123, Value: COMPLETED.
  3. Sen, Ahmet, Mehmet veya zincirdeki diğer 9 panel sahibi sipariş sayfasına girdiğinde, ekranda gördüğü veri kendi veritabanından değil, o ortak Redis anahtarından okunur.
Bu sayede veritabanına UPDATE sorgusu atılmasına bile gerek kalmaz (veya bu işlem gece herkes uyurken topluca yapılır - Eventual Consistency). Sen ekranda "Completed" yazısını anında görürsün çünkü hepiniz aynı "RAM" bölgesine bakıyorsunuzdur.

3. Socket / Push Mimarisi (Görsel Hız)


Kullanıcı tarafında "Anında değişti" hissini yaratan şey WebSocket teknolojisidir.
  1. Ana siparişin durumu değişir.
  2. Sunucu, o siparişe abone olan (o zincirdeki) tüm tarayıcılara açık olan soket kanalına bir sinyal gönderir.
  3. Senin ekranın yenilenmeden (F5 atmadan) statü "Processing"den "Completed"a döner.

4. Neden Standart Scriptlerde Bu Yok?


Senin kullandığın veya piyasadaki standart scriptlerde (SmartPanel vb.) her panelin veritabanı izoledir.
  • Panel A'nın veritabanı Sunucu A'da.
  • Panel B'nin veritabanı Sunucu B'de.
Bu durumda "Tek SQL ile hepsini güncelle" (Madde 1) yapamazsın. Mecburen API ile tek tek haberleşmek zorundasın. Cron gecikmesi işte buradan doğar.

Özetle Mantık Hatası Nerede?


Senin mantığındaki hata şu: "Her panelin kendi bağımsız veritabanı ve işlem sırası olduğunu" varsayıyorsun.
Perfect Panel'in gerçeği: "Herkes aynı havuzda yüzüyor, sadece birbirlerini görmüyorlar (Multi-tenancy)."
Havuzun suyu ısındığında (Sipariş tamamlandığında), herkes aynı anda ısınır. Tek tek ısıtmak gerekmez.