İçeriğe geç
Dolphy
Test ve Ölçüm

Sohbet Widget'ı ve Panel Hızı: CORS Ön İsteğinden Googlebot'a Ölçüm Notları

Mustafa Gürbüz7 dk okuma
Router, köşesinde sohbet balonu olan web sitesi açık laptop ve süre çubuklu ekran; üstte “Sohbet widget'ı ve panel hızı” başlığı

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/json başlığı gönderilmiyor; tarayıcı bunu text/plain sayı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.

Widget'ta tıklamadan sohbet isteğine geçen süre ve panel sayfalarının açılış süresi, önce ve sonra
Widget'ta tıklamadan sohbet isteğine geçen süre ve panel sayfalarının açılış süresi, önce ve sonra

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.

01

CORS ö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.

02

Sohbet 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.

03

Googlebot "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.

04

X-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.

Paylaş

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.

Demo paneli gör

İlgili yazılar

Grafikli laptop, ortada hassas terazi ve kontrol listesi; üstte “Chatbot'un uydurduğunu nasıl ölçtük?” başlığı
Test ve Ölçüm7 dk okuma

Chatbot'un Uydurduğunu Nasıl Ölçtük? Hakem Model, Kalibrasyon ve Gürültü

Bilgi tabanından cevap veren bir chatbot'un uydurup uydurmadığını ölçmek için gerçek cevap hattını test sorularıyla koşturan, kurallı kontrollerin yanında farklı aileden bir hakem model kullanan bir değerlendirme aracı kurduk. İlk öğrendiğimiz, hakemin de yanıldığıydı: 'kaldı' dediği 8 vakanın yalnız 2'si gerçek hataydı, 3'ü hakemin kendi yanlışıydı. Hakemi insan etiketli vakalarla kalibre ettik, sonuçları geçti/kaldı/hata diye ayırdık ve küçük setlerde ±1 vakanın gürültü olduğunu ölçtük. Bu düzenle beş işletme sitesinde 73 vakada 1 gerçek uydurma bulundu.

Yazıyı oku
Test tezgâhında belge yığını, sunucu modülü ve bir çubuğu eksik sıralı liste ekranı; üstte “RAG'de recall %99 iken bot neden eksik cevap verir?” başlığı
Test ve Ölçüm7 dk okuma

RAG'de Recall %99 İken Bot Neden Eksik Cevap Verir?

RAG'de doğru sayfanın ilk 8 sonuçta olması, cevabın doğru olacağı anlamına gelmiyor. Ölçümlerimizde recall %93-100 iken bot bazı soruları eksik cevaplıyordu. Dört sebep çıktı: parçalar o kadar küçüktü ki 3.000 tokenlık bir sayfanın yalnız yedide biri modele gidiyordu; ürün kartlarının %55,8'i birbirinin kopyasıydı ve yanlış fiyatlı kopya seçilebiliyordu; sözcüksel arama Türkçe doğal sorularda neredeyse hiç eşleşmiyordu; blog yazıları kanonik hizmet sayfasının önüne geçiyordu. Her biri recall'un göremediği bir katmandaydı.

Yazıyı oku
İki tablet ve ortada telefonda sohbet balonları arasında küçük bir kart; üstte “Sohbette kart ne zaman gösterilmeli?” başlığı
Test ve Ölçüm6 dk okuma

Sohbette Kart Ne Zaman Gösterilmeli? 50 Turluk Bileşen Testi

Sohbet içindeki kartlar, çipler ve formlar yerinde kullanıldığında cevabı hızlandırır; yersiz kullanıldığında itici bir satış hissi verir. Rakiplerin ortak deseni, bileşenin niyete bağlı olması: ürün kartı satın alma niyetinde, netleştirme sorusunda hiçbir bileşen. Bizim testimizde 'Kahvaltı fiyata dahil mi?' gibi bilgi sorularının altına rezervasyon kartı çıkıyordu. Model çağrısı gerektirmeyen niyet tabanlı bir politika ve 50 turluk test matrisiyle bu hataları kapattık; sonunda kartı yalnız misafiri bir sayfaya yönlendirirken gösteren daha sade bir kurala geçtik.

Yazıyı oku