İçindekiler14 başlık
Bir sohbet widget'ı başka birinin sitesinde çalışır. Siteye tek satır kodla eklenir, kendi sunucusuna konuşur ve sitenin hızını bozmamalıdır. İşletmenin panelinde ise aynı konuşmalar okunur, talepler takip edilir. Bu yazı bu iki yüzeyde yaptığımız hız ölçümlerini ve yol boyunca karşılaştığımız birkaç web tuzağını anlatıyor.
Bütün ölçümler tarayıcıda (soğuk önbellek, tekrarlı) ya da sunucu günlüğünden yapıldı. Her maddede önce ölçtük, sonra değiştirdik, sonra aynı yöntemle yeniden ölçtük.
1. Widget: CORS ön isteği
Widget müşterinin sitesinde (örneğin otel.com) çalışıyor, istekleri ise Dolphy'nin sunucusuna gidiyor. Tarayıcı, alan adları arası ve "basit olmayan" her istekten önce bir izin sorusu (OPTIONS, CORS ön isteği) gönderiyor. JSON gövdeli bir POST isteği basit sayılmıyor.
Ölçüm (TLS hariç): ön istek 80-160 ms, ardından asıl oturum isteği 110-175 ms. Yani ziyaretçi bir soruya tıkladığında önce iki gidiş-dönüş ödeniyordu.
İki değişiklik yapıldı:
- İstekler ön istek gerektirmeyen biçime çevrildi. POST gövdesi JSON olarak kalıyor ama
Content-Type: application/jsonbaşlığı gönderilmiyor; tarayıcı bunutext/plainsayıyor ve ön istek sormuyor. Sunucu gövdeyi yine JSON olarak ayrıştırıyor. - Oturum niyet anında açılıyor. Ziyaretçi karşılama kartının üstüne geldiğinde oturum önden alınıyor.
Sonuç: soruya tıklamadan sohbet isteğinin çıkmasına kadar geçen süre canlıda 117-167 ms'den 7-14 ms'ye indi.

Aynı turda küçük kalemler de temizlendi:
- Widget kodunun sıkıştırılmış boyutu 47,3 KB'tan 37,6 KB'a indi. İçinde 86 CSS yorumu vardı; stiller artık derlemede sıkıştırılıyor. Kapalı kart ve açık panel ekran görüntüleri değişiklikten önce ve sonra piksel piksel aynı.
- Asistan portreleri 69 KB'lık dosyalardan görsel optimizasyon hattına geçti: AVIF olarak 6 KB.
- 230 KB'lık sesli görüşme kütüphanesi her aramada sunucuya kadar yeniden doğrulanıyordu; artık önbellekli ve yalnız ziyaretçi sesli düğmeye yaklaşınca iniyor.
Dürüst bir not: kartın görünme süresi bu ölçümde iyileşmedi (396-510 ms'den 447-558 ms'ye). Farkın sebebi ağdı: yükleyici dosya o ölçümde 116 ms yerine 207-285 ms'de geldi. Yükleyici geldikten sonra kartın görünmesi önceki gibi 230-275 ms sürdü. Kapak görselini erken ısıtmanın kazancı hızlı ağda görünmüyor; kazanç yavaş mobil ağda.
2. Panel: veritabanına internetten gidiliyordu
İşletme panelinin sayfalarını giriş yapılmış bir tarayıcıda, beşer tekrarla ölçtük. Dört sebep çıktı:
- Oturum çerezli veritabanı istemcisi genel adrese gidiyordu. Sunucu ile veritabanı aynı makinedeydi ama istek dışarı çıkıp CDN ve ters vekil üzerinden geri geliyordu: çağrı başına 45 ms. İç adresten aynı çağrı 5 ms.
- Oturum doğrulaması her istekte ağa gidiyordu. Kullanılan imza türünde yerel doğrulama yerine sunucuya soran bir yola düşülüyordu.
- Tam sayfa yüklemesinde aynı oturum dört kez soruluyordu. İstek içi önbellek yoktu.
- Gelen kutusu yedi adımı sırayla bekliyordu. Birbirinden bağımsız sorgular paralel değildi.
Bir risk de vardı: veritabanı istemcisi oturum çerezinin adını adresten türetiyor. İç adrese geçince çerez adı değişecek ve herkes oturumdan düşecekti. Bu riski gerçek kütüphaneyle, erişilemeyen bir iç adresle kurarak doğruladık: çerez adı açıkça verilince oturum bulundu, verilmeyince bulunamadı.
| Sayfa | Önce | Sonra |
|---|---|---|
| Genel bakış | 752 ms | 518 ms |
| Gelen kutusu | 626 ms | 449 ms |
| Açık konuşma | 813 ms | 495 ms |
| Talepler | 585 ms | 406 ms |
| Bilgi tabanı | 530 ms | 424 ms |
Aynı turda her sayfanın HTML'ine yalnız hukuki sayfalarda kullanılan çeviri metinlerinin gömüldüğünü de gördük: çeviri dosyasının yaklaşık %40'ı, 20 KB. Bu metinler artık yalnız ilgili sayfaya gidiyor.
3. Yazılı cevabın hızı: sürenin çoğu düşünme
Yazılı sohbette misafirin ilk kelimeyi görmesi 135 turda medyan 3.710 ms'ydi (p90 5.319 ms). Adımlara bölünce cevap modeline kadar geçen süre 1.364 ms, cevap modelinin ilk metni üretmesi ise 2.291 ms çıktı.
Kullanım kayıtları sebebi gösterdi: cevap modelinin çıktısı medyan 422 token'dı ama ekranda görünen cevap medyan 18 kelimeydi, yaklaşık 60 token. Aradaki yaklaşık 360 token modelin akıl yürütmesiydi. Sesli kanalda düşünme kapalıydı; yazılı kanalda sağlayıcının varsayılanı çalışıyordu. Düşünmeyi azaltmanın kaliteye etkisini ayrı ölçtük ve açmadık (model seçimi yazısı). Bilgi tabanı araması ise ısıtmayla medyan 427 ms'den 83 ms'ye indi.
4. Google sayfayı neden eksik görüyordu?
Bir iddia geldi: "Google sitede bir şey bulamıyor, sayfalar istemci tarafında çiziliyor." Googlebot kullanıcı ajanıyla, JavaScript kapalı olarak ölçtük. İddia yanlıştı: ana sayfanın sunucu HTML'i 9.191 karakter görünür metin, bir H1, dokuz H2 ve 34 bağlantı içeriyordu.
Gerçek sorun başka yerdeydi. Googlebot sayfayı kaydırmıyor; görünüm alanını sayfanın boyuna uzatıyor. Giriş bölümümüzün yüksekliği ekran yüksekliğine bağlıydı ve görünümle birlikte büyüyordu: ana sayfada 784 pikselden 15.903 piksele. Aşağıdaki bölümler, ekrana girince görünür olacak şekilde saydam başlıyordu ve Googlebot'un görünümünde ekrana hiç girmiyordu. Ana sayfanın yaklaşık 5.100 karakterlik metninin 2.580'i saydam kalıyordu.
Giriş bölümüne bir üst sınır kondu (en fazla 1.400 piksel). Gerçek ekranlardaki yükseklik değişmedi; Googlebot görünümünde saydam metin sıfıra indi. Metin önce de HTML'deydi ve dizine girebiliyordu; etkisi arama motorunun ekran görüntüsünde ve gizli metin ağırlığındaydı.
5. Arama motoru ayarlarında üç sessiz hata
- Alt sayfalar ana sayfayı asıl adres gösteriyordu. Next.js'te üst düzeydeki meta veri alt sayfalara miras kalıyor. Kendi asıl adresini vermeyen üç sayfa ana sayfanın asıl adresini taşıyordu. "Dizine alma" işareti tek başına yetmiyor: sayfa hem "beni alma" hem "asıl adres ana sayfa" diyordu.
- İngilizce sayfalarda Türkçe düğmeler. Tek bir şablonda sabit yazılmış iki etiket 20 İngilizce sayfada Türkçe basılıyordu.
- Yanlış alarm: her sayfada 40 KB'lık bir uyumluluk kütüphanesi "boşuna" iniyor gibi görünüyordu. Etiketine bakınca yalnız eski tarayıcılar için yüklendiği, modern tarayıcının hiç indirmediği görüldü. Etiket kontrol edilmeden rapora girseydi yanlış olurdu.
6. Hız sınırı istemci başlığından okunuyordu
Widget uçları kötüye kullanıma karşı IP başına hız sınırıyla korunuyor. IP adresi X-Forwarded-For başlığının ilk girdisinden okunuyordu. Bu girdiyi istemci yazar; standart ters vekil ayarı gerçek adresi listenin sonuna ekler, baştakini silmez. Her istekte uydurma bir ilk girdi gönderen biri sayacı sıfırlayabiliyordu. Site anahtarı zaten gizli değil (müşterinin sayfasında duruyor); asıl fren hız sınırıydı. IP artık vekilin yazdığı başlıktan ya da listenin son girdisinden okunuyor.
7. Ziyaretçi sayacı neyi saymıyordu?
Panelde ziyaretçi kaynağını gösteren bir sayaç var. Doğruluğunu sunucu günlükleriyle karşılaştırdık:
- Kaynak sınıflandırması doğruydu. Reklam tıklama kimliği taşıyan dört ziyaretin dördü reklam olarak sayıldı.
- Instagram trafiği sayılmıyordu ve bu doğruydu. Sekiz günde Instagram ve Facebook uygulama içi tarayıcısından gelen 671 sayfa isteğinin yalnız birinde sayfanın JavaScript'i çalıştı. İz, Meta'nın reklam açılış sayfasını önceden indirmesine uyuyordu. Sayaç yalnız gerçekten açılan ziyareti sayıyordu.
- Ekibin kendi ziyaretleri sayılıyordu. On ziyaretin üçü işletme sahibinin kendi adresindendi.
- "Son 7 gün" 8 günü sayıyordu. Kayan 7×24 saatlik pencere ilk günü tümüyle okuyordu. Pencere artık takvim günüyle hesaplanıyor.
Başkası için çıkarımlar
- Gömülü widget'ta ön isteği ölçün. Alan adları arası JSON istekleri her tıklamaya bir gidiş-dönüş ekler.
- Niyet anında hazırlanın. Fare kartın üstüne geldiğinde oturumu açmak, tıklamayı neredeyse anlık yapar.
- Aynı makinedeki servise internetten gitmeyin. İç adrese geçerken çerez adı gibi adrese bağlı ayarları kontrol edin.
- Googlebot'un görünümünü taklit edin. Görünüme bağlı yükseklik ve "ekrana girince görün" animasyonu, metni saydam bırakabilir.
- Hız sınırını istemcinin yazamayacağı bir değere bağlayın.
- Sayacı günlükle doğrulayın. Sayılmayan trafik bazen doğru davranıştır.
Ölçümün sınırları
Widget ölçümleri hafif bir test sayfasında, masaüstü tarayıcıda yapıldı; müşteri sitesinin kendi yükü ve mobil ağ farklı sonuç verir. Panel süreleri tek bir işletme hesabıyla ölçüldü. Ziyaretçi doğrulaması tek bir günün ve tek bir işletmenin verisiyle yapıldı.
Sık sorulan sorular
Bu bölümdeki sorular, aynı konuda en sık arananlardan derlendi.
01CORS ön isteği (preflight) nasıl önlenir?
Tarayıcı yalnız "basit" isteklerde ön istek sormaz: GET, HEAD ya da POST ve standart dışı başlık olmadan, gövde türü text/plain, application/x-www-form-urlencoded veya multipart/form-data. JSON gövdeyi Content-Type başlığı vermeden göndermek ön isteği kaldırır; sunucunun gövdeyi yine JSON olarak ayrıştırması gerekir.
02Sohbet widget'ı sitemi yavaşlatır mı?
İyi kurulmuş bir widget sayfanın ilk çizimini beklememeli: küçük bir yükleyici önce iner, asıl kod ve görseller sonra gelir. Bizim ölçümümüzde karşılama kartı hafif bir sayfada 0,4-0,6 saniyede görünüyor ve widget kodu sıkıştırılmış hâliyle yaklaşık 38 KB.
03Googlebot "ekrana girince görünür" animasyonları görür mü?
Görmeyebilir. Googlebot sayfayı kaydırmaz, görünüm alanını sayfanın boyuna uzatır. Yüksekliği ekran boyuna bağlı bir bölüm bu durumda devleşip aşağıdaki içeriği görünümün dışına itebilir ve saydam başlayan metin öyle kalır.
04X-Forwarded-For başlığına güvenmek güvenli mi?
İlk girdisine güvenmek değil; o girdiyi istemci yazabilir. Ters vekil gerçek adresi listenin sonuna ekler. Hız sınırı gibi güvenlik kararlarında vekilin yazdığı ayrı bir başlığı ya da listenin son girdisini kullanın.
Mustafa Gürbüz
Dolphy Yöneticisi
Dolphy'nin yöneticisi. Sesli asistan, yazılı sohbet ve bilgi tabanı hattındaki testleri yürütüyor. Yazılardaki sayılar Dolphy'nin kendi test ortamında alınan ölçümlerden geliyor; her yazı ölçümün kapsamını ve sınırını da söylüyor.
İçerik 28 Eylül 2026 tarihinde kontrol edildi
Aynı soruları müşterilere tekrar tekrar yazmayın
Dolphy web sitesi, WhatsApp ve Instagram'da işletmenizin kendi bilgisiyle yanıt verir, talepleri panele düşürür.



