{"id":32890,"date":"2025-10-27T03:01:29","date_gmt":"2025-10-27T00:01:29","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/websocketsa-her-zaman-gerek-yok-ssenin-basit-gucu\/"},"modified":"2025-10-27T03:01:29","modified_gmt":"2025-10-27T00:01:29","slug":"websocketsa-her-zaman-gerek-yok-ssenin-basit-gucu","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/websocketsa-her-zaman-gerek-yok-ssenin-basit-gucu\/","title":{"rendered":"WebSockets&#8217;a Her Zaman Gerek Yok: SSE&#8217;nin Basit G\u00fcc\u00fc"},"content":{"rendered":"<p><body><\/p>\n<style>\n        body { font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; line-height: 1.6; color: #333; margin: 0 auto; max-width: 900px; padding: 20px; background-color: #f8f9fa; }\n        h2, h3 { color: #0056b3; margin-top: 1.5em; margin-bottom: 0.8em; }\n        h2 { font-size: 1.8em; border-bottom: 2px solid #e9ecef; padding-bottom: 10px; }\n        h3 { font-size: 1.4em; color: #007bff; }\n        p { margin-bottom: 1em; text-align: justify; }\n        a { color: #007bff; text-decoration: none; }\n        a:hover { text-decoration: underline; }\n        ul, ol { margin-left: 20px; margin-bottom: 1em; }\n        li { margin-bottom: 0.5em; }\n        code { background-color: #e9ecef; padding: 2px 4px; border-radius: 3px; font-family: 'Consolas', 'Monaco', monospace; font-size: 0.9em; }\n        pre { background-color: #e9ecef; padding: 15px; border-radius: 5px; overflow-x: auto; font-family: 'Consolas', 'Monaco', monospace; font-size: 0.9em; margin-bottom: 1.5em; }\n        pre code { display: block; background-color: transparent; padding: 0; }\n        .expert-tip { background-color: #e6f7ff; border-left: 5px solid #007bff; padding: 15px; margin-top: 25px; margin-bottom: 25px; border-radius: 5px; }\n        table { width: 100%; border-collapse: collapse; margin-bottom: 1.5em; }\n        th, td { border: 1px solid #dee2e6; padding: 10px; text-align: left; }\n        th { background-color: #f1f1f1; font-weight: bold; }<\/p>\n<p>        \/* Mobil uyumluluk i\u00e7in *\/\n        @media (max-width: 768px) {\n            body { padding: 15px; }\n            h2 { font-size: 1.5em; }\n            h3 { font-size: 1.2em; }\n            table, thead, tbody, th, td, tr { display: block; }\n            thead tr { position: absolute; top: -9999px; left: -9999px; }\n            tr { border: 1px solid #dee2e6; margin-bottom: 10px; }\n            td { border: none; border-bottom: 1px solid #dee2e6; position: relative; padding-left: 50%; text-align: right; }\n            td:before { position: absolute; top: 6px; left: 6px; width: 45%; padding-right: 10px; white-space: nowrap; text-align: left; font-weight: bold; }\n            td:nth-of-type(1):before { content: \"\u00d6zellik\"; }\n            td:nth-of-type(2):before { content: \"Server-Sent Events\"; }\n            td:nth-of-type(3):before { content: \"WebSockets\"; }\n        }\n    <\/style>\n<p>G\u00fcn\u00fcm\u00fczde web uygulamalar\u0131n\u0131n neredeyse tamam\u0131 ger\u00e7ek zamanl\u0131 veri ak\u0131\u015f\u0131na ihtiya\u00e7 duyuyor. Canl\u0131 sohbetler, bildirimler, spor skorlar\u0131 veya borsa verileri gibi s\u00fcrekli g\u00fcncellenen bilgiler, kullan\u0131c\u0131 deneyiminin vazge\u00e7ilmez bir par\u00e7as\u0131 haline geldi. Pek \u00e7ok geli\u015ftirici, bu t\u00fcr ihtiya\u00e7lar i\u00e7in akla ilk gelen \u00e7\u00f6z\u00fcm olarak genellikle WebSockets&#8217;\u0131 d\u00fc\u015f\u00fcn\u00fcr. Ancak, her senaryoda WebSockets&#8217;\u0131n getirdi\u011fi karma\u015f\u0131kl\u0131\u011fa ve \u00e7ift y\u00f6nl\u00fc ileti\u015fim y\u00fck\u00fcne ger\u00e7ekten ihtiyac\u0131n\u0131z var m\u0131? \u0130\u015fte tam da bu noktada, daha basit ve \u00e7o\u011fu zaman yeterli bir alternatif olan Server-Sent Events (SSE) devreye giriyor. Bu makalede, SSE&#8217;nin ne oldu\u011funu, nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131, hangi durumlarda WebSockets&#8217;a tercih edilebilece\u011fini ve basit bir \u015fekilde nas\u0131l uyguland\u0131\u011f\u0131n\u0131 ke\u015ffedece\u011fiz. Gelin, ger\u00e7ek zamanl\u0131 web&#8217;in gizli kahraman\u0131n\u0131 yak\u0131ndan tan\u0131yal\u0131m.<\/p>\n<p>Modern web uygulamalar\u0131nda kullan\u0131c\u0131 beklentileri s\u00fcrekli art\u0131yor; kullan\u0131c\u0131lar an\u0131nda geri bildirim ve g\u00fcncel veri ak\u0131\u015f\u0131 talep ediyorlar. Bu beklentileri kar\u015f\u0131lamak i\u00e7in geli\u015ftiriciler, sunucu ile istemci aras\u0131nda s\u00fcrekli ve h\u0131zl\u0131 bir ileti\u015fim kanal\u0131 kurma zorunlulu\u011fu ile kar\u015f\u0131 kar\u015f\u0131ya kal\u0131yorlar. Geleneksel HTTP istekleri (request\/response modeli), her veri g\u00fcncellemesi i\u00e7in yeni bir ba\u011flant\u0131 a\u00e7may\u0131 gerektirdi\u011fi i\u00e7in bu t\u00fcr ger\u00e7ek zamanl\u0131 senaryolar i\u00e7in verimsiz kal\u0131yor. \u00d6rne\u011fin, bir kullan\u0131c\u0131n\u0131n borsa verilerini canl\u0131 olarak takip etmek istedi\u011fini d\u00fc\u015f\u00fcn\u00fcn; her saniye manuel olarak sayfay\u0131 yenilemek veya sunucuya binlerce k\u0131sa \u00f6m\u00fcrl\u00fc istek g\u00f6ndermek hem kullan\u0131c\u0131 deneyimini k\u00f6t\u00fcle\u015ftirir hem de sunucu kaynaklar\u0131n\u0131 gereksiz yere t\u00fcketir. Bu nedenle, daha etkin ve s\u00fcrekli ileti\u015fim y\u00f6ntemleri geli\u015ftirilmi\u015ftir.<\/p>\n<p>Bu ba\u011flamda \u00f6ne \u00e7\u0131kan iki ana teknoloji WebSockets ve Server-Sent Events (SSE) olarak kar\u015f\u0131m\u0131za \u00e7\u0131kar. WebSockets, sunucu ve istemci aras\u0131nda kal\u0131c\u0131, \u00e7ift y\u00f6nl\u00fc bir ileti\u015fim kanal\u0131 a\u00e7ar. Bu sayede her iki taraf da istedi\u011fi zaman veri g\u00f6nderebilir ve alabilir. Sohbet uygulamalar\u0131, \u00e7ok oyunculu oyunlar veya ger\u00e7ek zamanl\u0131 i\u015fbirli\u011fi ara\u00e7lar\u0131 gibi hem sunucunun istemciye hem de istemcinin sunucuya anl\u0131k veri g\u00f6ndermesi gereken senaryolar i\u00e7in WebSockets ideal bir \u00e7\u00f6z\u00fcmd\u00fcr. Ancak, WebSocket ba\u011flant\u0131s\u0131n\u0131n kurulmas\u0131 ve y\u00f6netilmesi, HTTP&#8217;ye g\u00f6re daha farkl\u0131 bir protokol kulland\u0131\u011f\u0131 i\u00e7in ek bir karma\u015f\u0131kl\u0131k getirir. G\u00fcvenlik duvar\u0131 ve proxy yap\u0131land\u0131rmalar\u0131, y\u00fck dengeleme (load balancing) stratejileri gibi konularda \u00f6zel yakla\u015f\u0131mlar gerektirebilir. Ayr\u0131ca, her ba\u011flant\u0131 HTTP&#8217;den farkl\u0131 bir TCP ba\u011flant\u0131s\u0131 \u00fczerinde \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan, sunucu taraf\u0131nda daha fazla kaynak t\u00fcketimine yol a\u00e7abilir.<\/p>\n<p>Di\u011fer yandan Server-Sent Events (SSE), ad\u0131ndan da anla\u015f\u0131laca\u011f\u0131 gibi, sunucudan istemciye tek y\u00f6nl\u00fc veri ak\u0131\u015f\u0131 sa\u011flamak \u00fczere tasarlanm\u0131\u015ft\u0131r. Temelde HTTP\/1.1 \u00fczerinde kurulan kal\u0131c\u0131 bir ba\u011flant\u0131 kullanarak \u00e7al\u0131\u015f\u0131r. Sunucu, ba\u011flant\u0131y\u0131 a\u00e7\u0131k tutar ve istemciye yeni olaylar meydana geldik\u00e7e veri g\u00f6nderir. \u0130stemcinin sunucuya veri g\u00f6ndermesine gerek olmayan, ancak s\u00fcrekli olarak sunucudan g\u00fcncellemeler almas\u0131 gereken durumlar i\u00e7in SSE ola\u011fan\u00fcst\u00fc bir basitlik ve verimlilik sunar. \u00d6rne\u011fin, bir canl\u0131 skor tablosu, hisse senedi fiyatlar\u0131, bildirim ak\u0131\u015flar\u0131 veya bir kullan\u0131c\u0131 panelindeki anl\u0131k istatistikler gibi senaryolarda SSE, WebSockets&#8217;\u0131n gerektirdi\u011fi karma\u015f\u0131kl\u0131ktan ka\u00e7\u0131narak harika bir i\u015f \u00e7\u0131kar\u0131r. WebSockets ile kar\u015f\u0131la\u015ft\u0131r\u0131ld\u0131\u011f\u0131nda, SSE&#8217;nin HTTP protokol\u00fc \u00fczerine in\u015fa edilmi\u015f olmas\u0131, mevcut web altyap\u0131s\u0131 (proxy&#8217;ler, g\u00fcvenlik duvarlar\u0131, y\u00fck dengeleyiciler) ile \u00e7ok daha uyumlu \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flar. Bu sayede kurulumu ve y\u00f6netimi \u00e7ok daha kolay hale gelir. Dolay\u0131s\u0131yla, hangi teknolojiyi se\u00e7ece\u011fimiz, projenin ihtiya\u00e7 duydu\u011fu ileti\u015fim y\u00f6n\u00fcne ve karma\u015f\u0131kl\u0131k seviyesine g\u00f6re belirlenmelidir. \u00c7o\u011fu durumda, \u00f6zellikle sadece sunucudan istemciye veri ak\u0131\u015f\u0131n\u0131n yeterli oldu\u011fu durumlarda, SSE \u00e7ok daha pratik bir \u00e7\u00f6z\u00fcm olarak \u00f6ne \u00e7\u0131kmaktad\u0131r.<\/p>\n<h2>Server-Sent Events (SSE) Temelleri: Nas\u0131l \u00c7al\u0131\u015f\u0131r ve Neden Basit?<\/h2>\n<p>Server-Sent Events (SSE) teknolojisinin temelinde, standart HTTP protokol\u00fcn\u00fcn ustaca kullan\u0131m\u0131 yatar. \u00c7o\u011fu zaman g\u00f6zden ka\u00e7an bu basit ancak g\u00fc\u00e7l\u00fc yakla\u015f\u0131m, WebSockets&#8217;\u0131n karma\u015f\u0131kl\u0131\u011f\u0131na ihtiya\u00e7 duymadan ger\u00e7ek zamanl\u0131 veri ak\u0131\u015f\u0131 sa\u011flaman\u0131n kap\u0131lar\u0131n\u0131 aralar. Peki, SSE tam olarak nas\u0131l \u00e7al\u0131\u015f\u0131r ve bu basitlik nereden gelir?<\/p>\n<p>SSE, temelde bir HTTP iste\u011fiyle ba\u015flar. \u0130stemci (taray\u0131c\u0131), sunucuya normal bir GET iste\u011fi g\u00f6nderir. Ancak bu iste\u011fin yan\u0131t\u0131, sunucunun ba\u011flant\u0131y\u0131 hemen kapatmamas\u0131, aksine a\u00e7\u0131k tutmas\u0131yla farkl\u0131la\u015f\u0131r. Sunucu, yan\u0131t ba\u015fl\u0131klar\u0131nda <code>Content-Type: text\/event-stream<\/code> de\u011ferini g\u00f6ndererek taray\u0131c\u0131ya, bu ba\u011flant\u0131n\u0131n bir olay ak\u0131\u015f\u0131 (event stream) oldu\u011funu bildirir. Bu \u00f6zel i\u00e7erik tipi sayesinde taray\u0131c\u0131, bu ba\u011flant\u0131y\u0131 standart bir HTTP yan\u0131t\u0131 gibi de\u011fil, s\u00fcrekli bir veri ak\u0131\u015f\u0131 olarak yorumlar. Ba\u011flant\u0131 kurulduktan sonra, sunucu yeni veriler haz\u0131r oldu\u011funda bunlar\u0131 basit bir metin format\u0131nda istemciye g\u00f6nderir. \u0130stemci taraf\u0131nda ise taray\u0131c\u0131da yerle\u015fik olarak bulunan <code>EventSource<\/code> API&#8217;si, bu ak\u0131\u015f\u0131 dinleyerek gelen verileri kolayca i\u015fler.<\/p>\n<p>SSE&#8217;nin veri format\u0131 olduk\u00e7a basittir ve her olay, bir dizi &#8220;alan: de\u011fer&#8221; \u00e7iftinden olu\u015fur ve \u00e7ift yeni sat\u0131r karakteri (<code>\\n\\n<\/code>) ile sonlan\u0131r. Bu alanlar \u015funlar\u0131 i\u00e7erir:<\/p>\n<ul>\n<li><code>data:<\/code>: G\u00f6nderilecek ger\u00e7ek veri. Birden fazla <code>data<\/code> sat\u0131r\u0131 birle\u015ftirilir.<\/li>\n<li><code>event:<\/code>: Olay\u0131n ad\u0131n\u0131 belirtir. \u0130stemci, bu ada g\u00f6re belirli olay dinleyicilerini tetikleyebilir.<\/li>\n<li><code>id:<\/code>: Olay\u0131n benzersiz kimli\u011fi. Ba\u011flant\u0131 kesildi\u011finde, istemci bu son ID&#8217;yi sunucuya g\u00f6ndererek kesintiye u\u011frad\u0131\u011f\u0131 yerden devam edebilir.<\/li>\n<li><code>retry:<\/code>: \u0130stemcinin ba\u011flant\u0131 kesildi\u011finde ne kadar s\u00fcre sonra yeniden ba\u011flanmay\u0131 deneyece\u011fini milisaniye cinsinden belirtir.<\/li>\n<\/ul>\n<p>Bu format, mevcut HTTP ara\u00e7lar\u0131 ve k\u00fct\u00fcphaneleriyle kolayca uyum sa\u011flar. JSON gibi daha karma\u015f\u0131k veri yap\u0131lar\u0131 g\u00f6ndermek istiyorsan\u0131z, bunlar\u0131 basit\u00e7e <code>data:<\/code> alan\u0131n\u0131n i\u00e7ine bir dize olarak g\u00f6mebilirsiniz. Bu, SSE&#8217;yi mevcut web teknolojileriyle entegre etmeyi olduk\u00e7a kolayla\u015ft\u0131r\u0131r.<\/p>\n<p>SSE&#8217;nin basitli\u011finin temel nedenleri \u015funlard\u0131r:<\/p>\n<ol>\n<li><strong>HTTP \u00dczerine \u0130n\u015fa Edilmesi:<\/strong> SSE, HTTP protokol\u00fc ve HTTP\/1.1 persistent connection (kal\u0131c\u0131 ba\u011flant\u0131) \u00f6zelliklerini kullan\u0131r. Bu, mevcut web altyap\u0131s\u0131n\u0131n (proxy sunucular, g\u00fcvenlik duvarlar\u0131, y\u00fck dengeleyiciler) SSE ba\u011flant\u0131lar\u0131n\u0131 do\u011fal olarak desteklemesi anlam\u0131na gelir. WebSocket&#8217;ler gibi \u00f6zel bir protokol y\u00fckseltmesi gerektirmez.<\/li>\n<li><strong>Tek Y\u00f6nl\u00fc \u0130leti\u015fim:<\/strong> Sadece sunucudan istemciye veri ak\u0131\u015f\u0131na odakland\u0131\u011f\u0131 i\u00e7in ileti\u015fim modeli basittir. \u0130stemcinin sunucuya s\u00fcrekli olarak veri g\u00f6nderme ihtiyac\u0131 olmad\u0131\u011f\u0131 durumlarda, \u00e7ift y\u00f6nl\u00fc bir protokol\u00fcn getirdi\u011fi karma\u015f\u0131kl\u0131ktan ka\u00e7\u0131n\u0131l\u0131r.<\/li>\n<li><strong>Otomatik Yeniden Ba\u011flant\u0131:<\/strong> <code>EventSource<\/code> API&#8217;si, ba\u011flant\u0131n\u0131n kesilmesi durumunda otomatik olarak yeniden ba\u011flanma \u00f6zelli\u011fini yerle\u015fik olarak sunar. Bu, geli\u015ftiricilerin hata y\u00f6netimi ve ba\u011flant\u0131 s\u00fcreklili\u011fi konusunda daha az kod yazmas\u0131n\u0131 sa\u011flar. <code>retry:<\/code> alan\u0131 sayesinde bu yeniden ba\u011flanma aral\u0131\u011f\u0131 sunucu taraf\u0131ndan kontrol edilebilir.<\/li>\n<li><strong>Basit Veri Format\u0131:<\/strong> Metin tabanl\u0131, kolayca ayr\u0131\u015ft\u0131r\u0131labilir veri format\u0131, hem sunucu hem de istemci taraf\u0131nda uygulamay\u0131 kolayla\u015ft\u0131r\u0131r.<\/li>\n<\/ol>\n<p>Sonu\u00e7 olarak, Server-Sent Events, WebSockets&#8217;\u0131n gereksiz olabilece\u011fi bir\u00e7ok ger\u00e7ek zamanl\u0131 senaryo i\u00e7in zarif ve verimli bir \u00e7\u00f6z\u00fcmd\u00fcr. Mevcut web standartlar\u0131na s\u0131k\u0131 s\u0131k\u0131ya ba\u011fl\u0131 kalmas\u0131, geli\u015ftiriciler i\u00e7in \u00f6\u011frenme e\u011frisini \u00f6nemli \u00f6l\u00e7\u00fcde azalt\u0131rken, h\u0131zl\u0131 ve g\u00fcvenilir tek y\u00f6nl\u00fc veri ak\u0131\u015f\u0131n\u0131 m\u00fcmk\u00fcn k\u0131lar. Bu y\u00fczden, \u00e7o\u011fu zaman WebSockets&#8217;a y\u00f6nelmeden \u00f6nce SSE&#8217;nin potansiyelini de\u011ferlendirmek ak\u0131ll\u0131ca bir se\u00e7im olacakt\u0131r.<\/p>\n<h2>SSE ile Canl\u0131 Veri Ak\u0131\u015f\u0131 Nas\u0131l Olu\u015fturulur? Ad\u0131m Ad\u0131m Uygulama<\/h2>\n<p>Server-Sent Events (SSE) ile canl\u0131 veri ak\u0131\u015f\u0131 olu\u015fturmak, d\u00fc\u015f\u00fcnd\u00fc\u011f\u00fcn\u00fczden \u00e7ok daha kolayd\u0131r. Temelde iki ana bile\u015fene ihtiyac\u0131m\u0131z var: sunucu taraf\u0131nda olay ak\u0131\u015f\u0131n\u0131 yay\u0131nlayan bir uygulama ve istemci taraf\u0131nda bu ak\u0131\u015f\u0131 dinleyip verileri i\u015fleyen bir web sayfas\u0131. \u0130\u015fte bu s\u00fcreci ad\u0131m ad\u0131m nas\u0131l ger\u00e7ekle\u015ftirece\u011finizi g\u00f6steren basit \u00f6rnekler:<\/p>\n<h3>Sunucu Taraf\u0131nda SSE Uygulamas\u0131<\/h3>\n<p>Sunucu taraf\u0131, istemcinin ba\u011flanaca\u011f\u0131 bir HTTP endpoint&#8217;i sa\u011flamal\u0131 ve bu ba\u011flant\u0131 \u00fczerinden s\u00fcrekli veri ak\u0131\u015f\u0131 g\u00f6ndermelidir. \u00c7o\u011fu modern sunucu teknolojisi (Node.js, Python Flask\/Django, PHP, Go, Java vb.) bu t\u00fcr bir ak\u0131\u015f\u0131 destekler. Burada pop\u00fcler bir Node.js ve Express.js \u00f6rne\u011fi ile ilerleyelim. Bu \u00f6rnekte, sunucu her saniye istemciye g\u00fcncel saat ve bir saya\u00e7 de\u011feri g\u00f6nderecektir.<\/p>\n<pre><code class=\"language-javascript\">\nconst express = require('express');\nconst app = express();\nconst PORT = 3000;\n\n\/\/ \u0130stemci taraf\u0131ndaki HTML dosyas\u0131n\u0131 sunmak i\u00e7in\napp.use(express.static('public')); \n\napp.get('\/events', (req, res) => {\n    \/\/ SSE ba\u011flant\u0131s\u0131 i\u00e7in gerekli ba\u015fl\u0131klar\u0131 ayarla\n    res.setHeader('Content-Type', 'text\/event-stream');\n    res.setHeader('Cache-Control', 'no-cache');\n    res.setHeader('Connection', 'keep-alive');\n    res.setHeader('Access-Control-Allow-Origin', '*'); \/\/ CORS i\u00e7in, farkl\u0131 bir porttan ba\u011flan\u0131yorsak \u00f6nemli\n\n    let counter = 0;\n    const intervalId = setInterval(() => {\n        const data = <code>data: ${new Date().toLocaleTimeString()} - Saya\u00e7: ${counter++}\\n\\n<\/code>;\n        res.write(data); \/\/ \u0130stemciye veri g\u00f6nder\n    }, 1000); \/\/ Her saniye veri g\u00f6nder\n\n    \/\/ \u0130stemci ba\u011flant\u0131s\u0131 kapat\u0131ld\u0131\u011f\u0131nda interval'i temizle\n    req.on('close', () => {\n        clearInterval(intervalId);\n        res.end(); \/\/ Yan\u0131t\u0131 sonland\u0131r\n        console.log('\u0130stemci ba\u011flant\u0131s\u0131 kapand\u0131.');\n    });\n});\n\napp.listen(PORT, () => {\n    console.log(<code>SSE sunucusu http:\/\/localhost:${PORT} adresinde \u00e7al\u0131\u015f\u0131yor.<\/code>);\n});\n    <\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki Node.js kodunda, sunucu bir <code>\/events<\/code> endpoint'ine gelen istekleri dinler. Bu iste\u011fe yan\u0131t olarak, taray\u0131c\u0131ya bu ba\u011flant\u0131n\u0131n bir olay ak\u0131\u015f\u0131 oldu\u011funu bildiren \u00f6zel HTTP ba\u015fl\u0131klar\u0131 (<code>Content-Type: text\/event-stream<\/code> gibi) g\u00f6nderilir. Daha sonra, <code>setInterval<\/code> kullanarak her saniye bir saya\u00e7 ve anl\u0131k zaman bilgisi i\u00e7eren bir dize olu\u015fturulur ve <code>res.write()<\/code> metoduyla istemciye g\u00f6nderilir. Her veri blo\u011funun sonunda iki yeni sat\u0131r karakteri (<code>\\n\\n<\/code>) bulundu\u011funa dikkat edin; bu, taray\u0131c\u0131ya bir olay\u0131n sona erdi\u011fini ve yeni bir olay\u0131n ba\u015flayabilece\u011fini i\u015faret eder. <code>req.on('close')<\/code> olay\u0131, istemci ba\u011flant\u0131s\u0131 kapand\u0131\u011f\u0131nda sunucunun kaynaklar\u0131 serbest b\u0131rakmas\u0131n\u0131 sa\u011flar, bu da bellek s\u0131z\u0131nt\u0131lar\u0131n\u0131 \u00f6nlemek i\u00e7in kritik bir ad\u0131md\u0131r.<\/p>\n<h3>\u0130stemci Taraf\u0131nda SSE Kullan\u0131m\u0131<\/h3>\n<p>\u0130stemci taraf\u0131nda, HTML sayfan\u0131zda JavaScript kullanarak sunucudan gelen olay ak\u0131\u015f\u0131n\u0131 dinleyece\u011fiz. Bu i\u015flem i\u00e7in taray\u0131c\u0131lar\u0131n yerle\u015fik <code>EventSource<\/code> API'si kullan\u0131l\u0131r. <code>public<\/code> klas\u00f6r\u00fcnde yer alacak \u00f6rnek bir <code>index.html<\/code> dosyas\u0131 olu\u015ftural\u0131m:<\/p>\n<pre><code class=\"language-html\">\n<!DOCTYPE html>\n<html lang=\"tr\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>SSE \u0130stemcisi<\/title>\n    <style>\n        body { font-family: sans-serif; margin: 20px; background-color: #f4f4f4; color: #333; }\n        #event-log { border: 1px solid #ccc; padding: 10px; min-height: 150px; background-color: #fff; overflow-y: scroll; border-radius: 5px; }\n        .message-item { padding: 5px 0; border-bottom: 1px dotted #eee; }\n        .message-item:last-child { border-bottom: none; }\n        \/* Mobil uyumluluk i\u00e7in *\/\n        @media (max-width: 600px) {\n            body { margin: 10px; }\n            h2 { font-size: 1.2em; }\n            #event-log { min-height: 100px; }\n        }\n    <\/style>\n<\/head>\n<body>\n    <h2>Server-Sent Events \u0130stemci \u00d6rne\u011fi<\/h2>\n    <p>Sunucudan gelen ger\u00e7ek zamanl\u0131 verileri a\u015fa\u011f\u0131da g\u00f6r\u00fcnt\u00fcleyin:<\/p>\n    <div id=\"event-log\">\n        <p class=\"message-item\">Ba\u011flant\u0131 bekleniyor...<\/p>\n    <\/div>\n\n    <script>\n        const eventLog = document.getElementById('event-log');\n        \/\/ EventSource nesnesini olu\u015ftur, sunucunun SSE endpoint'ine i\u015faret et\n        const source = new EventSource('http:\/\/localhost:3000\/events');\n\n        \/\/ Ba\u011flant\u0131 ba\u015far\u0131l\u0131 oldu\u011funda\n        source.onopen = function() {\n            eventLog.innerHTML += '<p class=\"message-item\" style=\"color: green;\">Ba\u011flant\u0131 a\u00e7\u0131ld\u0131.<\/p>';\n        };\n\n        \/\/ Yeni bir mesaj (veri) geldi\u011finde\n        source.onmessage = function(event) {\n            \/\/ event.data \u00f6zelli\u011fi gelen veriyi i\u00e7erir\n            eventLog.innerHTML += <code><p class=\"message-item\">${event.data}<\/p><\/code>;\n            eventLog.scrollTop = eventLog.scrollHeight; \/\/ En yeni mesaj\u0131 g\u00f6rmek i\u00e7in a\u015fa\u011f\u0131 kayd\u0131r\n        };\n\n        \/\/ Hata olu\u015ftu\u011funda veya ba\u011flant\u0131 kesildi\u011finde\n        source.onerror = function(err) {\n            eventLog.innerHTML += <code><p class=\"message-item\" style=\"color: red;\">Hata olu\u015ftu veya ba\u011flant\u0131 kesildi: ${err.message || &#039;Bilinmeyen Hata&#039;}<\/p><\/code>;\n            if (source.readyState === EventSource.CLOSED) {\n                eventLog.innerHTML += '<p class=\"message-item\" style=\"color: red;\">Ba\u011flant\u0131 kapand\u0131, otomatik yeniden ba\u011flanma denemesi yap\u0131lacak...<\/p>';\n            }\n        };\n\n        \/\/ \u00d6zel bir olay t\u00fcr\u00fc dinlemek i\u00e7in (e\u011fer sunucu 'event:' alan\u0131n\u0131 kullan\u0131yorsa)\n        \/\/ source.addEventListener('myCustomEvent', function(event) {\n        \/\/     console.log('\u00d6zel olay al\u0131nd\u0131:', event.data);\n        \/\/ });\n    <\/script>\n<\/body>\n<\/html>\n    <\/pre>\n<p><\/code><\/p>\n<p>\u0130stemci taraf\u0131nda, <code>new EventSource('http:\/\/localhost:3000\/events')<\/code> sat\u0131r\u0131 ile sunucunun SSE endpoint'ine bir ba\u011flant\u0131 kurulur. <code>EventSource<\/code> objesi, bu ak\u0131\u015f\u0131 dinlemek i\u00e7in \u00fc\u00e7 temel olay i\u015fleyici (event handler) sunar:<\/p>\n<ul>\n<li><code>onopen<\/code>: Ba\u011flant\u0131 ba\u015far\u0131yla kuruldu\u011funda tetiklenir.<\/li>\n<li><code>onmessage<\/code>: Sunucudan yeni bir <code>data:<\/code> alan\u0131 i\u00e7eren olay geldi\u011finde tetiklenir. Gelen veri <code>event.data<\/code> \u00f6zelli\u011finde bulunur.<\/li>\n<li><code>onerror<\/code>: Bir hata olu\u015ftu\u011funda veya ba\u011flant\u0131 kesildi\u011finde tetiklenir. <code>EventSource<\/code>, ba\u011flant\u0131 kesildi\u011finde otomatik olarak yeniden ba\u011flanmaya \u00e7al\u0131\u015f\u0131r, bu da hata y\u00f6netimini olduk\u00e7a kolayla\u015ft\u0131r\u0131r.<\/li>\n<\/ul>\n<div class=\"expert-tip\">\n        Uzman \u0130pucu: SSE, HTTP protokol\u00fc \u00fczerinden \u00e7al\u0131\u015ft\u0131\u011f\u0131 i\u00e7in CORS (Cross-Origin Resource Sharing) kurallar\u0131na tabidir. E\u011fer sunucunuz ve istemciniz farkl\u0131 domain veya portlarda \u00e7al\u0131\u015f\u0131yorsa, sunucu taraf\u0131nda <code>Access-Control-Allow-Origin<\/code> ba\u015fl\u0131\u011f\u0131n\u0131 uygun \u015fekilde ayarlaman\u0131z gerekir. Yukar\u0131daki Node.js \u00f6rne\u011finde bu, <code>res.setHeader('Access-Control-Allow-Origin', '*')<\/code> ile yap\u0131lm\u0131\u015ft\u0131r.\n    <\/div>\n<p>Bu basit kurulumla, sunucunuzdan istemcinize ger\u00e7ek zamanl\u0131 veri ak\u0131\u015f\u0131n\u0131 kolayca sa\u011flayabilirsiniz. Bu y\u00f6ntemin temel avantaj\u0131, mevcut HTTP altyap\u0131s\u0131n\u0131 kullanmas\u0131 ve taray\u0131c\u0131da yerle\u015fik destek sunmas\u0131d\u0131r, bu da \u00fc\u00e7\u00fcnc\u00fc taraf k\u00fct\u00fcphanelere veya karma\u015f\u0131k protokol implementasyonlar\u0131na olan ihtiyac\u0131 ortadan kald\u0131r\u0131r. Bu nedenle, sadece tek y\u00f6nl\u00fc veri ak\u0131\u015f\u0131na ihtiyac\u0131n\u0131z oldu\u011funda SSE, WebSockets'tan \u00e7ok daha sade ve verimli bir se\u00e7enek sunar.<\/p>\n<h2>Ger\u00e7ek D\u00fcnya Senaryolar\u0131nda SSE: Vaka Analizleri ve Kullan\u0131m Alanlar\u0131<\/h2>\n<p>Server-Sent Events (SSE), belirli ger\u00e7ek zamanl\u0131 ileti\u015fim ihtiya\u00e7lar\u0131 i\u00e7in WebSockets'tan daha uygun, daha basit ve daha verimli bir \u00e7\u00f6z\u00fcm sunar. \u00d6zellikle tek y\u00f6nl\u00fc, sunucudan istemciye veri ak\u0131\u015f\u0131n\u0131n bask\u0131n oldu\u011fu durumlarda SSE, parlar. Gelin, ger\u00e7ek d\u00fcnyadan baz\u0131 kullan\u0131m senaryolar\u0131n\u0131 ve vaka analizlerini inceleyerek SSE'nin g\u00fcc\u00fcn\u00fc daha iyi anlayal\u0131m.<\/p>\n<h3>Canl\u0131 Haber Ak\u0131\u015flar\u0131 ve Anl\u0131k Bildirimler<\/h3>\n<p>Bir\u00e7ok web sitesi, kullan\u0131c\u0131lar\u0131na anl\u0131k haber g\u00fcncellemeleri, canl\u0131 spor skorlar\u0131, borsa verileri veya sosyal medya ak\u0131\u015flar\u0131 sunar. Bu t\u00fcr uygulamalarda, sunucudan s\u00fcrekli olarak yeni bilgilerin al\u0131nmas\u0131 gerekirken, kullan\u0131c\u0131n\u0131n sunucuya s\u00fcrekli olarak veri g\u00f6nderme ihtiyac\u0131 genellikle yoktur. \u00d6rne\u011fin, bir canl\u0131 skor tablosu uygulamas\u0131n\u0131 ele alal\u0131m. Ma\u00e7 s\u0131ras\u0131nda goller at\u0131ld\u0131k\u00e7a, skor de\u011fi\u015ftik\u00e7e veya oyunla ilgili \u00f6nemli olaylar meydana geldik\u00e7e, sunucunun t\u00fcm ba\u011fl\u0131 istemcilere an\u0131nda bu bilgiyi g\u00f6ndermesi gerekir. Kullan\u0131c\u0131lar\u0131n bu durumda sadece \"dinleyici\" rol\u00fcnde olmas\u0131, SSE'yi ideal bir se\u00e7im haline getirir. SSE'nin otomatik yeniden ba\u011flanma \u00f6zelli\u011fi sayesinde, kullan\u0131c\u0131 ba\u011flant\u0131s\u0131 k\u0131sa s\u00fcreli\u011fine kesilse bile, taray\u0131c\u0131 otomatik olarak tekrar ba\u011flan\u0131r ve genellikle <code>Last-Event-ID<\/code> ba\u015fl\u0131\u011f\u0131 sayesinde kald\u0131\u011f\u0131 yerden veri ak\u0131\u015f\u0131n\u0131 s\u00fcrd\u00fcr\u00fcr. Bu, \u00f6zellikle mobil a\u011flarda veya karars\u0131z internet ba\u011flant\u0131lar\u0131nda kullan\u0131c\u0131 deneyimini \u00f6nemli \u00f6l\u00e7\u00fcde iyile\u015ftirir.<\/p>\n<p>Benzer \u015fekilde, bir finansal piyasa uygulamas\u0131 d\u00fc\u015f\u00fcnelim. Hisse senedi fiyatlar\u0131, d\u00f6viz kurlar\u0131 veya emtia fiyatlar\u0131 saniye saniye de\u011fi\u015febilir. Bu verileri milyonlarca kullan\u0131c\u0131ya e\u015f zamanl\u0131 ve d\u00fc\u015f\u00fck gecikmeyle ula\u015ft\u0131rmak kritik \u00f6neme sahiptir. SSE, her bir istemciye ayr\u0131 bir HTTP ba\u011flant\u0131s\u0131 \u00fczerinden bu g\u00fcncellemeleri g\u00f6ndererek bu ihtiyac\u0131 kar\u015f\u0131lar. WebSockets'\u0131n daha a\u011f\u0131r protokol ba\u015fl\u0131klar\u0131 ve el s\u0131k\u0131\u015fma s\u00fcre\u00e7lerine k\u0131yasla, SSE'nin daha hafif yap\u0131s\u0131, b\u00fcy\u00fck \u00f6l\u00e7ekli yay\u0131n senaryolar\u0131nda daha az bant geni\u015fli\u011fi ve sunucu kayna\u011f\u0131 t\u00fcketimi anlam\u0131na gelebilir. Bu da maliyet verimlili\u011fi a\u00e7\u0131s\u0131ndan \u00f6nemli bir avantaj sunar. Dolay\u0131s\u0131yla, kullan\u0131c\u0131lar\u0131n sadece g\u00fcncel bilgileri takip etti\u011fi ve etkile\u015fimin b\u00fcy\u00fck \u00f6l\u00e7\u00fcde tek y\u00f6nl\u00fc oldu\u011fu canl\u0131 veri ak\u0131\u015f\u0131 uygulamalar\u0131nda SSE, m\u00fckemmel bir performans sergiler.<\/p>\n<h3>Uzun S\u00fcreli \u0130\u015flemlerin Durum Takibi ve \u0130lerleme G\u00f6stergeleri<\/h3>\n<p>Web uygulamalar\u0131nda bazen sunucu taraf\u0131nda uzun s\u00fcren i\u015flemler (\u00f6rne\u011fin, b\u00fcy\u00fck bir dosya y\u00fckleme, karma\u015f\u0131k bir raporun olu\u015fturulmas\u0131, video d\u00f6n\u00fc\u015ft\u00fcrme veya veri taban\u0131 yedeklemesi) olabilir. Bu t\u00fcr durumlarda, kullan\u0131c\u0131n\u0131n i\u015flemin ilerlemesini anl\u0131k olarak takip etmesini sa\u011flamak, kullan\u0131c\u0131 deneyimini art\u0131r\u0131r ve belirsizli\u011fi ortadan kald\u0131r\u0131r. Geleneksel olarak, bu durum polling (belirli aral\u0131klarla sunucuya durum sorma) ile yap\u0131l\u0131rd\u0131, bu da gereksiz sunucu istekleri ve gecikmelere yol a\u00e7\u0131yordu.<\/p>\n<p>SSE, bu t\u00fcr senaryolar i\u00e7in \u00e7ok daha zarif bir \u00e7\u00f6z\u00fcm sunar. Uzun s\u00fcreli i\u015flemi ba\u015flatan istemci, SSE ba\u011flant\u0131s\u0131 kurar ve sunucu, i\u015flemin farkl\u0131 a\u015famalar\u0131n\u0131 veya ilerleme y\u00fczdesini (\u00f6rne\u011fin, %10, %25, %50 tamamland\u0131) SSE ak\u0131\u015f\u0131 \u00fczerinden istemciye g\u00f6nderir. \u0130stemci, bu g\u00fcncellemeleri alarak kullan\u0131c\u0131 aray\u00fcz\u00fcndeki bir ilerleme \u00e7ubu\u011funu veya durum mesaj\u0131n\u0131 ger\u00e7ek zamanl\u0131 olarak g\u00fcncelleyebilir. \u00d6rne\u011fin, bir bulut depolama hizmetinde b\u00fcy\u00fck bir dosya y\u00fcklenirken, sunucu y\u00fckleme i\u015fleminin her %5'inde bir SSE olay\u0131 yay\u0131nlayabilir. Kullan\u0131c\u0131, bu sayede dosyas\u0131n\u0131n ne kadar\u0131n\u0131n y\u00fcklendi\u011fini anl\u0131k olarak g\u00f6r\u00fcr. Benzer \u015fekilde, bir video i\u015fleme hizmetinde, video d\u00f6n\u00fc\u015ft\u00fcrme s\u00fcrecinin a\u015famalar\u0131 (y\u00fckleniyor, i\u015fleniyor, kodlan\u0131yor, tamamland\u0131) SSE arac\u0131l\u0131\u011f\u0131yla bildirilebilir.<\/p>\n<p>Bu yakla\u015f\u0131m, polling'in aksine sunucuya gereksiz istek g\u00f6ndermeyi engeller, \u00e7\u00fcnk\u00fc sunucu sadece ger\u00e7ekten bir durum de\u011fi\u015fikli\u011fi oldu\u011funda veri g\u00f6nderir. Bu da sunucu y\u00fck\u00fcn\u00fc azalt\u0131r ve istemciye daha h\u0131zl\u0131 ve do\u011fru g\u00fcncellemeler sa\u011flar. Ayr\u0131ca, SSE'nin olay tabanl\u0131 yap\u0131s\u0131, farkl\u0131 i\u015flem a\u015famalar\u0131n\u0131 farkl\u0131 olay t\u00fcrleri (\u00f6rne\u011fin, <code>event: progress<\/code>, <code>event: completed<\/code>, <code>event: error<\/code>) olarak tan\u0131mlamaya olanak tan\u0131r, bu da istemci taraf\u0131ndaki mant\u0131\u011f\u0131n daha d\u00fczenli olmas\u0131n\u0131 sa\u011flar. Bu t\u00fcr senaryolarda SSE'nin basitli\u011fi ve verimlili\u011fi, geli\u015ftiriciler i\u00e7in \u00f6nemli avantajlar sunar, \u00e7\u00fcnk\u00fc karma\u015f\u0131k bir \u00e7ift y\u00f6nl\u00fc ileti\u015fim protokol\u00fc uygulamaya gerek kalmadan etkili bir \u00e7\u00f6z\u00fcm elde edilmi\u015f olur.<\/p>\n<h2>WebSockets m\u0131, SSE mi? Do\u011fru Se\u00e7imi Yapmak<\/h2>\n<p>Ger\u00e7ek zamanl\u0131 web uygulamas\u0131 geli\u015ftirirken kar\u015f\u0131la\u015f\u0131lan en kritik kararlardan biri, ileti\u015fim teknolojisini se\u00e7mektir: WebSockets m\u0131 yoksa Server-Sent Events (SSE) m\u0131? Her iki teknoloji de sunucu ile istemci aras\u0131nda kal\u0131c\u0131 bir ba\u011flant\u0131 kurarak ger\u00e7ek zamanl\u0131 veri ak\u0131\u015f\u0131 sa\u011flar, ancak farkl\u0131 kullan\u0131m senaryolar\u0131na ve temel prensiplere sahiptirler. Do\u011fru se\u00e7imi yapmak, uygulaman\u0131z\u0131n performans\u0131n\u0131, \u00f6l\u00e7eklenebilirli\u011fini ve geli\u015ftirme s\u00fcrecinin karma\u015f\u0131kl\u0131\u011f\u0131n\u0131 do\u011frudan etkiler. \u0130\u015fte bu iki teknolojinin temel farklar\u0131n\u0131 ve ne zaman hangisini tercih etmeniz gerekti\u011fini g\u00f6steren bir kar\u015f\u0131la\u015ft\u0131rma ve karar a\u011fac\u0131.<\/p>\n<h3>Server-Sent Events ve WebSockets Kar\u015f\u0131la\u015ft\u0131rmas\u0131<\/h3>\n<p>Bu iki teknolojiyi anlamak i\u00e7in temel \u00f6zelliklerine odaklanal\u0131m:<\/p>\n<table>\n<thead>\n<tr>\n<th>\u00d6zellik<\/th>\n<th>Server-Sent Events (SSE)<\/th>\n<th>WebSockets<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>\u0130leti\u015fim Y\u00f6n\u00fc<\/td>\n<td>Tek y\u00f6nl\u00fc (Sunucudan istemciye)<\/td>\n<td>\u00c7ift y\u00f6nl\u00fc (Sunucu ve istemci aras\u0131nda)<\/td>\n<\/tr>\n<tr>\n<td>Protokol<\/td>\n<td>HTTP\/1.1 \u00fczerinde \u00e7al\u0131\u015f\u0131r<\/td>\n<td>Tam \u00e7ift y\u00f6nl\u00fc \u00f6zel WebSocket protokol\u00fc (WS\/WSS)<\/td>\n<\/tr>\n<tr>\n<td>Karma\u015f\u0131kl\u0131k<\/td>\n<td>Basit. Mevcut HTTP altyap\u0131s\u0131yla uyumlu.<\/td>\n<td>Daha karma\u015f\u0131k. \u00d6zel protokol i\u015fleme gerektirir.<\/td>\n<\/tr>\n<tr>\n<td>Header Y\u00fck\u00fc<\/td>\n<td>Her olay i\u00e7in minimal HTTP ba\u015fl\u0131klar\u0131<\/td>\n<td>Her mesaj i\u00e7in minimal \u00e7er\u00e7eve ba\u015fl\u0131\u011f\u0131<\/td>\n<\/tr>\n<tr>\n<td>Taray\u0131c\u0131 Deste\u011fi<\/td>\n<td>Modern taray\u0131c\u0131lar\u0131n \u00e7o\u011fu destekler (IE hari\u00e7)<\/td>\n<td>T\u00fcm modern taray\u0131c\u0131lar yayg\u0131n olarak destekler<\/td>\n<\/tr>\n<tr>\n<td>Otomatik Yeniden Ba\u011flant\u0131<\/td>\n<td>Yerle\u015fik olarak EventSource API'si taraf\u0131ndan sa\u011flan\u0131r<\/td>\n<td>Manuel olarak veya k\u00fct\u00fcphaneler arac\u0131l\u0131\u011f\u0131yla y\u00f6netilmelidir<\/td>\n<\/tr>\n<tr>\n<td>Mesaj Format\u0131<\/td>\n<td>Metin tabanl\u0131 (<code>data:<\/code>, <code>event:<\/code>, <code>id:<\/code>, <code>retry:<\/code>)<\/td>\n<td>Metin veya ikili (binary) veri<\/td>\n<\/tr>\n<tr>\n<td>Proxy \/ G\u00fcvenlik Duvar\u0131 Uyumlulu\u011fu<\/td>\n<td>Daha iyi uyumluluk, HTTP tabanl\u0131 oldu\u011fu i\u00e7in<\/td>\n<td>Bazen proxy'ler ve g\u00fcvenlik duvarlar\u0131yla sorun ya\u015fayabilir<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Yukar\u0131daki tabloya bakt\u0131\u011f\u0131m\u0131zda, SSE'nin HTTP'nin basitli\u011fini ve mevcut web altyap\u0131s\u0131n\u0131 kullanarak tek y\u00f6nl\u00fc veri ak\u0131\u015f\u0131 i\u00e7in optimize edildi\u011fini g\u00f6rebiliriz. WebSockets ise tamamen \u00e7ift y\u00f6nl\u00fc ileti\u015fime odaklanm\u0131\u015f, daha genel bir \u00e7\u00f6z\u00fcmd\u00fcr.<\/p>\n<h3>Ne Zaman SSE, Ne Zaman WebSocket? Do\u011fru Karar Verme<\/h3>\n<p>Do\u011fru se\u00e7imi yapmak i\u00e7in uygulaman\u0131z\u0131n temel ileti\u015fim ihtiya\u00e7lar\u0131n\u0131 analiz etmeniz gerekir. \u0130\u015fte size yard\u0131mc\u0131 olacak bir karar a\u011fac\u0131:<\/p>\n<ul>\n<li><strong>Uygulaman\u0131z\u0131n sadece sunucudan istemciye veri g\u00f6ndermeye mi ihtiyac\u0131 var (\u00f6rne\u011fin, canl\u0131 g\u00fcncellemeler, bildirimler, ak\u0131\u015flar)?<\/strong>\n<ul>\n<li><strong>Evet:<\/strong> SSE'yi d\u00fc\u015f\u00fcn\u00fcn. Basitli\u011fi, HTTP uyumlulu\u011fu ve otomatik yeniden ba\u011flanma \u00f6zellikleri sayesinde geli\u015ftirme s\u00fcrecinizi ve sunucu y\u00fck\u00fcn\u00fcz\u00fc \u00f6nemli \u00f6l\u00e7\u00fcde azaltacakt\u0131r. \u00d6rne\u011fin: canl\u0131 skorlar, hisse senedi takibi, haber ak\u0131\u015flar\u0131, i\u015flem ilerleme g\u00f6stergeleri, sunucu loglar\u0131.<\/li>\n<\/ul>\n<\/li>\n<li><strong>Uygulaman\u0131z\u0131n hem sunucudan istemciye hem de istemciden sunucuya anl\u0131k veri g\u00f6ndermeye mi ihtiyac\u0131 var (yani \u00e7ift y\u00f6nl\u00fc ileti\u015fim)?<\/strong>\n<ul>\n<li><strong>Evet:<\/strong> WebSockets'\u0131 tercih edin. Ger\u00e7ek zamanl\u0131 sohbet uygulamalar\u0131, \u00e7ok oyunculu oyunlar, ger\u00e7ek zamanl\u0131 \u00e7izim veya i\u015fbirli\u011fi ara\u00e7lar\u0131 gibi interaktif uygulamalar i\u00e7in WebSockets vazge\u00e7ilmezdir.<\/li>\n<\/ul>\n<\/li>\n<li><strong>Uygulaman\u0131z ikili (binary) veri g\u00f6ndermeye mi ihtiya\u00e7 duyuyor?<\/strong>\n<ul>\n<li><strong>Evet:<\/strong> WebSockets daha uygun olacakt\u0131r. SSE varsay\u0131lan olarak metin tabanl\u0131 veriler i\u00e7in tasarlanm\u0131\u015ft\u0131r.<\/li>\n<\/ul>\n<\/li>\n<li><strong>Mevcut a\u011f altyap\u0131n\u0131zda (proxy'ler, g\u00fcvenlik duvarlar\u0131) yeni bir protokol\u00fcn yap\u0131land\u0131r\u0131lmas\u0131 bir sorun te\u015fkil ediyor mu?<\/strong>\n<ul>\n<li><strong>Evet:<\/strong> SSE, standart HTTP portlar\u0131 \u00fczerinden \u00e7al\u0131\u015ft\u0131\u011f\u0131 i\u00e7in genellikle daha az yap\u0131land\u0131rma gerektirir ve daha uyumludur.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<div class=\"expert-tip\">\n        Uzman \u0130pucu: SSE, HTTP\/2 ile de uyumlu bir \u015fekilde \u00e7al\u0131\u015fabilir. HTTP\/2'nin multiplexing \u00f6zelli\u011fi sayesinde tek bir TCP ba\u011flant\u0131s\u0131 \u00fczerinden birden fazla SSE ak\u0131\u015f\u0131 ayn\u0131 anda y\u00f6netilebilir, bu da kaynak kullan\u0131m\u0131n\u0131 daha da optimize eder ve performans\u0131 art\u0131r\u0131r. Bu durum, \u00f6zellikle yo\u011fun trafikli uygulamalar i\u00e7in \u00f6nemlidir.\n    <\/div>\n<p>Sonu\u00e7 olarak, WebSockets genel ama\u00e7l\u0131, g\u00fc\u00e7l\u00fc ve esnek bir \u00e7ift y\u00f6nl\u00fc ileti\u015fim arac\u0131d\u0131r. Ancak bu g\u00fc\u00e7, ek karma\u015f\u0131kl\u0131k ve y\u00f6netim y\u00fck\u00fcyle birlikte gelir. SSE ise, belirli ve yayg\u0131n bir ihtiyac\u0131 (tek y\u00f6nl\u00fc ger\u00e7ek zamanl\u0131 veri ak\u0131\u015f\u0131) ele almak i\u00e7in tasarlanm\u0131\u015f, daha ni\u015f ama bu alanda olduk\u00e7a optimize ve basit bir \u00e7\u00f6z\u00fcmd\u00fcr. Projenizin ihtiya\u00e7lar\u0131n\u0131 do\u011fru analiz ederek, gereksiz karma\u015f\u0131kl\u0131ktan ka\u00e7\u0131nabilir ve daha verimli, \u00f6l\u00e7eklenebilir ve y\u00f6netilebilir bir uygulama geli\u015ftirebilirsiniz.<\/p>\n<h2>Geli\u015fmi\u015f SSE Kullan\u0131m\u0131 ve Optimizasyon \u0130pu\u00e7lar\u0131<\/h2>\n<p>Server-Sent Events (SSE) temel olarak basit olsa da, uygulaman\u0131z\u0131n daha sa\u011flam, esnek ve performansl\u0131 olmas\u0131n\u0131 sa\u011flamak i\u00e7in baz\u0131 geli\u015fmi\u015f teknikleri ve optimizasyon ipu\u00e7lar\u0131n\u0131 bilmek \u00f6nemlidir. Bu b\u00f6l\u00fcmde, SSE'nin yeteneklerini daha derinlemesine ke\u015ffedecek ve daha karma\u015f\u0131k senaryolarda nas\u0131l kullan\u0131labilece\u011fini inceleyece\u011fiz.<\/p>\n<h3>Hata Y\u00f6netimi ve Yeniden Ba\u011flanma Stratejileri<\/h3>\n<p>SSE'nin en g\u00fczel \u00f6zelliklerinden biri, <code>EventSource<\/code> API'sinin yerle\u015fik otomatik yeniden ba\u011flanma mekanizmas\u0131d\u0131r. Ancak bu mekanizmay\u0131 daha da optimize edebiliriz. Sunucu taraf\u0131nda g\u00f6nderdi\u011fimiz <code>retry:<\/code> alan\u0131, istemcinin ba\u011flant\u0131 kesildi\u011finde ka\u00e7 milisaniye sonra yeniden ba\u011flanmay\u0131 deneyece\u011fini belirler. \u00d6rne\u011fin:<\/p>\n<pre><code class=\"language-javascript\">\n\/\/ Sunucu taraf\u0131nda (Node.js\/Express)\nres.write('retry: 5000\\n\\n'); \/\/ 5 saniye sonra yeniden ba\u011flanmay\u0131 dene\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu, istemcinin sunucuya yo\u011fun bir y\u00fck binmesini \u00f6nlemek i\u00e7in \u00f6nemlidir, \u00f6zellikle bir sunucu \u00e7\u00f6k\u00fc\u015f\u00fc durumunda. \u0130stemci taraf\u0131nda ise <code>onerror<\/code> olay\u0131 sayesinde ba\u011flant\u0131 hatalar\u0131n\u0131 izleyebilir ve gerekti\u011finde kullan\u0131c\u0131ya bilgi verebilirsiniz. Daha geli\u015fmi\u015f yeniden ba\u011flanma stratejileri i\u00e7in, <code>EventSource<\/code>'un i\u00e7 yeniden ba\u011flanma mant\u0131\u011f\u0131na g\u00fcvenmek yerine, \u00f6zel bir geri say\u0131m ve \u00fcssel geri \u00e7ekilme (exponential backoff) algoritmas\u0131 uygulayan bir k\u00fct\u00fcphane veya kendi \u00f6zel kodunuzu kullanabilirsiniz. Bu, a\u011f sorunlar\u0131 veya sunucu a\u015f\u0131r\u0131 y\u00fcklenmesi gibi durumlarda sunucu \u00fczerindeki bask\u0131y\u0131 azalt\u0131r.<\/p>\n<h3>\u00d6zel Olay T\u00fcrleri (<code>event:<\/code> Alan\u0131) ve Veri Bi\u00e7imlendirme<\/h3>\n<p>SSE sadece genel <code>onmessage<\/code> olay\u0131n\u0131 de\u011fil, ayn\u0131 zamanda \u00f6zel olay t\u00fcrlerini de destekler. Sunucudan g\u00f6nderdi\u011finiz her olaya bir <code>event:<\/code> alan\u0131 ekleyerek, istemci taraf\u0131nda belirli olaylar\u0131 dinleyebilirsiniz. \u00d6rne\u011fin, bir uygulamada hem \"bildirim\" hem de \"canl\u0131 skor\" g\u00fcncellemeleri g\u00f6nderebilirsiniz:<\/p>\n<pre><code class=\"language-javascript\">\n\/\/ Sunucu taraf\u0131nda\nres.write('event: notification\\ndata: Yeni bir mesaj\u0131n\u0131z var!\\n\\n');\nres.write('event: live_score\\ndata: Fenerbah\u00e7e 2 - 1 Galatasaray\\n\\n');\n    <\/pre>\n<p><\/code><\/p>\n<p>\u0130stemci taraf\u0131nda ise bunlar\u0131 ayr\u0131 ayr\u0131 dinleyebilirsiniz:<\/p>\n<pre><code class=\"language-javascript\">\n\/\/ \u0130stemci taraf\u0131nda\nsource.addEventListener('notification', function(event) {\n    console.log('Bildirim:', event.data);\n    \/\/ Bildirim aray\u00fcz\u00fcn\u00fc g\u00fcncelle\n});\n\nsource.addEventListener('live_score', function(event) {\n    console.log('Canl\u0131 Skor:', event.data);\n    \/\/ Canl\u0131 skor aray\u00fcz\u00fcn\u00fc g\u00fcncelle\n});\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu yakla\u015f\u0131m, istemci taraf\u0131ndaki kodunuzu daha d\u00fczenli hale getirir ve farkl\u0131 veri t\u00fcrlerini kolayca ayr\u0131\u015ft\u0131rman\u0131za olanak tan\u0131r. Veri bi\u00e7imlendirme konusunda ise, SSE metin tabanl\u0131 oldu\u011fu i\u00e7in JSON gibi yap\u0131land\u0131r\u0131lm\u0131\u015f verileri <code>data:<\/code> alan\u0131n\u0131n i\u00e7ine dize olarak g\u00f6ndermek yayg\u0131n bir pratiktir:<\/p>\n<pre><code class=\"language-javascript\">\n\/\/ Sunucu taraf\u0131nda JSON veri g\u00f6nderme\nconst data = { matchId: 123, homeTeam: 'FB', awayTeam: 'GS', score: '2-1' };\nres.write(<code>event: live_score\\ndata: ${JSON.stringify(data)}\\n\\n<\/code>);\n    <\/pre>\n<p><\/code><\/p>\n<pre><code class=\"language-javascript\"><\/pre>\n<p><\/code><br \/>\n\/\/ \u0130stemci taraf\u0131nda JSON veriyi ayr\u0131\u015ft\u0131rma<br \/>\nsource.addEventListener('live_score', function(event) {<br \/>\n    const scoreData = JSON.parse(event.data);<br \/>\n    console.log(<code>Ma\u00e7 ID: ${scoreData.matchId}, Skor: ${scoreData.score}<\/code>);<br \/>\n});<br \/>\n    <\/code><\/p>\n<p>Bu y\u00f6ntem, karma\u015f\u0131k veri yap\u0131lar\u0131n\u0131 kolayca iletmenizi sa\u011flar ve istemci taraf\u0131nda daha esnek veri i\u015fleme imkan\u0131 sunar.<\/p>\n<h3>Sunucu Taraf\u0131 \u00d6l\u00e7eklenebilirlik ve Ba\u011flant\u0131 Y\u00f6netimi<\/h3>\n<p>Y\u00fcksek trafikli uygulamalarda, binlerce hatta milyonlarca e\u015f zamanl\u0131 SSE ba\u011flant\u0131s\u0131n\u0131 y\u00f6netmek \u00f6nemli bir zorluk olabilir. \u0130\u015fte baz\u0131 ipu\u00e7lar\u0131:<\/p>\n<ul>\n<li><strong>Y\u00fck Dengeleyiciler (Load Balancers):<\/strong> SSE ba\u011flant\u0131lar\u0131 kal\u0131c\u0131 oldu\u011fu i\u00e7in, oturum yap\u0131\u015fkanl\u0131\u011f\u0131 (session stickiness) olan y\u00fck dengeleyiciler kullanmak \u00f6nemlidir. Bu, ayn\u0131 istemcinin her zaman ayn\u0131 sunucuya y\u00f6nlendirilmesini sa\u011flayarak ba\u011flant\u0131 s\u00fcreklili\u011fini temin eder.<\/li>\n<li><strong>Pub\/Sub (Yay\u0131nla\/Abone Ol) Modelleri:<\/strong> Geleneksel olarak, her istemci i\u00e7in ayr\u0131 ayr\u0131 veri haz\u0131rlay\u0131p g\u00f6ndermek yerine, Redis Pub\/Sub, Kafka veya benzeri bir mesaj kuyru\u011fu sistemi kullanarak sunucular aras\u0131nda olaylar\u0131 yay\u0131nlayabilirsiniz. SSE sunucular\u0131n\u0131z, bu Pub\/Sub kanal\u0131na abone olarak gelen olaylar\u0131 istemcilere iletebilir. Bu, sunucular\u0131n\u0131z\u0131n durumsuz olmas\u0131n\u0131 sa\u011flar ve yatay \u00f6l\u00e7eklemeyi kolayla\u015ft\u0131r\u0131r.<\/li>\n<li><strong>Bellek ve Kaynak Y\u00f6netimi:<\/strong> Her a\u00e7\u0131k SSE ba\u011flant\u0131s\u0131, sunucu taraf\u0131nda belirli bir miktar bellek ve CPU kayna\u011f\u0131 t\u00fcketir. Sunucunuzu bu y\u00fck\u00fc kald\u0131rabilecek \u015fekilde yap\u0131land\u0131rd\u0131\u011f\u0131n\u0131zdan emin olun. Gerekirse, ba\u011flant\u0131 ba\u015f\u0131na maksimum a\u00e7\u0131k kalma s\u00fcresi veya istemci ba\u015f\u0131na bant geni\u015fli\u011fi s\u0131n\u0131rlamalar\u0131 uygulayabilirsiniz.<\/li>\n<li><strong>HTTP\/2 Kullan\u0131m\u0131:<\/strong> Daha \u00f6nce de belirtildi\u011fi gibi, HTTP\/2'nin multiplexing \u00f6zelli\u011fi, tek bir TCP ba\u011flant\u0131s\u0131 \u00fczerinden birden fazla ak\u0131\u015f\u0131n (SSE ak\u0131\u015flar\u0131 dahil) verimli bir \u015fekilde y\u00f6netilmesini sa\u011flar. Bu, \u00f6zellikle \u00e7ok say\u0131da e\u015fzamanl\u0131 ba\u011flant\u0131da a\u011f kaynaklar\u0131n\u0131 daha verimli kullan\u0131r.<\/li>\n<\/ul>\n<div class=\"expert-tip\">\n        Uzman \u0130pucu: SSE ba\u011flant\u0131lar\u0131nda kimlik do\u011frulama, standart HTTP mekanizmalar\u0131yla (\u00f6rne\u011fin, \u00e7erezler, JWT ile yetkilendirme ba\u015fl\u0131\u011f\u0131) yap\u0131labilir. \u0130lk HTTP iste\u011fi s\u0131ras\u0131nda kimlik do\u011frulamas\u0131 yap\u0131l\u0131r ve ard\u0131ndan ba\u011flant\u0131 a\u00e7\u0131k kald\u0131\u011f\u0131 s\u00fcrece bu kimlik bilgisi ge\u00e7erli say\u0131l\u0131r.\n    <\/div>\n<p>Bu geli\u015fmi\u015f teknikleri uygulayarak, SSE'nin basitli\u011fini koruyarak daha g\u00fc\u00e7l\u00fc, \u00f6l\u00e7eklenebilir ve hata toleransl\u0131 ger\u00e7ek zamanl\u0131 uygulamalar geli\u015ftirebilirsiniz. Unutmay\u0131n, do\u011fru arac\u0131 do\u011fru i\u015f i\u00e7in kullanmak her zaman en iyi sonucu verir, ve bir\u00e7ok durumda SSE, WebSockets'\u0131n gerektirdi\u011fi karma\u015f\u0131kl\u0131\u011fa gerek kalmadan m\u00fckemmel bir \u00e7\u00f6z\u00fcm sunar.<\/p>\n<h2>Sonu\u00e7: Basitlikte G\u00fc\u00e7 ve S\u0131k\u00e7a Sorulan Sorular<\/h2>\n<p>Ger\u00e7ek zamanl\u0131 web uygulamalar\u0131n\u0131n geli\u015ftirilmesi s\u00f6z konusu oldu\u011funda, WebSockets genellikle ilk akla gelen ve en pop\u00fcler \u00e7\u00f6z\u00fcmd\u00fcr. Ancak bu makalede detayl\u0131ca inceledi\u011fimiz gibi, her ger\u00e7ek zamanl\u0131 ileti\u015fim senaryosu i\u00e7in WebSockets'\u0131n sundu\u011fu \u00e7ift y\u00f6nl\u00fc ileti\u015fime ihtiya\u00e7 duyulmayabilir. Server-Sent Events (SSE), \u00f6zellikle sunucudan istemciye tek y\u00f6nl\u00fc veri ak\u0131\u015f\u0131n\u0131n yeterli oldu\u011fu durumlarda, HTTP protokol\u00fcn\u00fcn basitli\u011fini kullanarak \u015fa\u015f\u0131rt\u0131c\u0131 derecede g\u00fc\u00e7l\u00fc ve verimli bir alternatif sunar.<\/p>\n<p>SSE'nin HTTP \u00fczerine in\u015fa edilmi\u015f olmas\u0131, mevcut web altyap\u0131s\u0131 (proxy'ler, g\u00fcvenlik duvarlar\u0131, y\u00fck dengeleyiciler) ile kusursuz uyum sa\u011flamas\u0131n\u0131, kurulumunun ve y\u00f6netiminin \u00e7ok daha kolay olmas\u0131n\u0131 garanti eder. Otomatik yeniden ba\u011flanma \u00f6zelli\u011fi sayesinde a\u011f kesintilerine kar\u015f\u0131 olduk\u00e7a dayan\u0131kl\u0131d\u0131r ve geli\u015ftiricilerin hata y\u00f6netimi i\u00e7in daha az \u00e7aba sarf etmesini sa\u011flar. Canl\u0131 haber ak\u0131\u015flar\u0131, anl\u0131k bildirimler, spor skorlar\u0131, borsa verileri ve uzun s\u00fcreli i\u015flemlerin ilerleme takibi gibi say\u0131s\u0131z senaryoda SSE, gereksiz karma\u015f\u0131kl\u0131ktan ka\u00e7\u0131narak etkili ve \u00f6l\u00e7eklenebilir \u00e7\u00f6z\u00fcmler sunar. Do\u011fru arac\u0131 se\u00e7mek, uygulaman\u0131z\u0131n performans\u0131n\u0131 ve geli\u015ftirme maliyetlerini do\u011frudan etkiler. Bu nedenle, bir sonraki ger\u00e7ek zamanl\u0131 projenizde, \"Acaba WebSockets'a ger\u00e7ekten ihtiyac\u0131m var m\u0131?\" diye sorman\u0131z\u0131 ve SSE'nin sundu\u011fu basitli\u011fin g\u00fcc\u00fcn\u00fc g\u00f6z \u00f6n\u00fcnde bulundurman\u0131z\u0131 \u015fiddetle tavsiye ederiz.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular<\/h3>\n<ul>\n<li>\n<h4>SSE'nin taray\u0131c\u0131 deste\u011fi nas\u0131l?<\/h4>\n<p>SSE (<code>EventSource<\/code> API'si) g\u00fcn\u00fcm\u00fczdeki t\u00fcm modern taray\u0131c\u0131lar (Chrome, Firefox, Safari, Edge, Opera) taraf\u0131ndan yayg\u0131n olarak desteklenmektedir. Ancak Internet Explorer'da destek bulunmamaktad\u0131r. E\u011fer Internet Explorer deste\u011fi sizin i\u00e7in kritikse, bir polyfill kullanman\u0131z veya WebSockets gibi alternatiflere y\u00f6nelmeniz gerekebilir. Fakat genel olarak, \u00e7o\u011fu modern kullan\u0131c\u0131 i\u00e7in SSE deste\u011fi yeterlidir.<\/p>\n<\/li>\n<li>\n<h4>SSE HTTP\/2 ile \u00e7al\u0131\u015f\u0131r m\u0131?<\/h4>\n<p>Evet, SSE HTTP\/2 ile tamamen uyumludur. HTTP\/2'nin \u00e7oklama (multiplexing) \u00f6zelli\u011fi sayesinde, tek bir TCP ba\u011flant\u0131s\u0131 \u00fczerinden birden fazla SSE ak\u0131\u015f\u0131 paralel olarak iletilebilir. Bu durum, \u00f6zellikle \u00e7ok say\u0131da e\u015fzamanl\u0131 ba\u011flant\u0131n\u0131n oldu\u011fu senaryolarda kaynak kullan\u0131m\u0131n\u0131 daha da optimize eder ve performans\u0131 art\u0131r\u0131r. HTTP\/2'nin getirdi\u011fi verimlilik, SSE'nin zaten hafif olan yap\u0131s\u0131n\u0131 daha da g\u00fc\u00e7lendirir.<\/p>\n<\/li>\n<li>\n<h4>WebSocket yerine SSE kullanmak performans\u0131 art\u0131r\u0131r m\u0131?<\/h4>\n<p>Performans, kullan\u0131m senaryosuna ba\u011fl\u0131d\u0131r. E\u011fer uygulaman\u0131z\u0131n temel ihtiyac\u0131 sadece sunucudan istemciye veri ak\u0131\u015f\u0131 ise, SSE genellikle WebSockets'tan daha iyi veya e\u015fde\u011fer performans sunar. \u00c7\u00fcnk\u00fc SSE, HTTP\/1.1 veya HTTP\/2 \u00fczerine kuruludur, daha hafif ba\u015fl\u0131klar kullan\u0131r ve daha az protokol el s\u0131k\u0131\u015fmas\u0131 gerektirir. Ayr\u0131ca, taray\u0131c\u0131n\u0131n yerle\u015fik <code>EventSource<\/code> API'si otomatik yeniden ba\u011flanma gibi \u00f6zellikleri yerle\u015fik olarak sunarak geli\u015ftirme maliyetini ve kod karma\u015f\u0131kl\u0131\u011f\u0131n\u0131 azalt\u0131r. \u00c7ift y\u00f6nl\u00fc ileti\u015fime ihtiya\u00e7 duyulan durumlarda ise WebSockets daha \u00fcst\u00fcn olacakt\u0131r.<\/p>\n<\/li>\n<li>\n<h4>SSE'de kimlik do\u011frulama nas\u0131l yap\u0131l\u0131r?<\/h4>\n<p>SSE ba\u011flant\u0131s\u0131, standart bir HTTP iste\u011fiyle ba\u015flat\u0131ld\u0131\u011f\u0131 i\u00e7in kimlik do\u011frulama, standart HTTP mekanizmalar\u0131yla yap\u0131labilir. \u00d6rne\u011fin, istemci, ilk ba\u011flant\u0131 iste\u011fini yaparken \u00e7erezler (cookies) arac\u0131l\u0131\u011f\u0131yla veya HTTP <code>Authorization<\/code> ba\u015fl\u0131\u011f\u0131 (\u00f6rne\u011fin, JWT - JSON Web Token ile) kimlik bilgilerini g\u00f6nderebilir. Sunucu, bu iste\u011fi i\u015fleyerek kimlik do\u011frulamay\u0131 yapar ve e\u011fer ge\u00e7erliyse SSE ba\u011flant\u0131s\u0131n\u0131 a\u00e7\u0131k tutar. Ba\u011flant\u0131 bir kez kurulduktan sonra, ayn\u0131 kimlik bilgisi ge\u00e7erli olmaya devam eder.<\/p>\n<\/li>\n<li>\n<h4>SSE ka\u00e7 ba\u011flant\u0131ya kadar destekleyebilir?<\/h4>\n<p>SSE ba\u011flant\u0131lar\u0131n\u0131n say\u0131s\u0131, sunucunuzun kaynaklar\u0131na (CPU, bellek, a\u011f bant geni\u015fli\u011fi) ve i\u015fletim sisteminin a\u00e7\u0131k dosya tan\u0131t\u0131c\u0131lar\u0131 (file descriptors) s\u0131n\u0131r\u0131na ba\u011fl\u0131d\u0131r. Her SSE ba\u011flant\u0131s\u0131, sunucu taraf\u0131nda bir TCP ba\u011flant\u0131s\u0131 ve ili\u015fkili kaynaklar\u0131 gerektirir. \u0130yi yap\u0131land\u0131r\u0131lm\u0131\u015f bir sunucu, binlerce hatta on binlerce e\u015f zamanl\u0131 SSE ba\u011flant\u0131s\u0131n\u0131 rahatl\u0131kla y\u00f6netebilir. Y\u00fck dengeleyiciler ve Pub\/Sub (yay\u0131nla\/abone ol) sistemleri gibi mimarilerle birle\u015ftirildi\u011finde, \u00f6l\u00e7eklenebilirlik \u00e7ok daha y\u00fcksek seviyelere \u00e7\u0131kar\u0131labilir.<\/p>\n<\/li>\n<\/ul>\n<p><\/body><br \/>\n<\/html><\/p>\n","protected":false},"excerpt":{"rendered":"G\u00fcn\u00fcm\u00fczde web uygulamalar\u0131n\u0131n neredeyse tamam\u0131 ger\u00e7ek zamanl\u0131 veri ak\u0131\u015f\u0131na ihtiya\u00e7 duyuyor. Canl\u0131 sohbetler, bildirimler, spor skorlar\u0131 veya borsa&hellip;","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1],"tags":[],"class_list":{"0":"post-32890","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-genel","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>WebSockets&#039;a Her Zaman Gerek Yok: SSE&#039;nin Basit G\u00fcc\u00fc<\/title>\n<meta name=\"description\" content=\"G\u00fcn\u00fcm\u00fczde web uygulamalar\u0131n\u0131n neredeyse tamam\u0131 ger\u00e7ek zamanl\u0131 veri ak\u0131\u015f\u0131na ihtiya\u00e7 duyuyor. Canl\u0131 sohbetler, bildirimler, spor skorlar\u0131 veya borsa verileri gibi s\u00fcrekli g\u00fcncellenen bilgiler, kullan\u0131c\u0131 deneyiminin vazge\u00e7ilmez bir par\u00e7as\u0131 haline geldi. Pek \u00e7ok geli\u015ftirici, bu t\u00fcr ihtiya\u00e7lar i\u00e7in akla ilk gelen \u00e7\u00f6z\u00fcm olarak genellikle WebSockets&#039;\u0131 d\u00fc\u015f\u00fcn\u00fcr. Ancak, her senaryoda WebSockets&#039;\u0131n getirdi\u011fi karma\u015f\u0131kl\u0131\u011fa ve \u00e7ift y\u00f6nl\u00fc ileti\u015fim y\u00fck\u00fcne ger\u00e7ekten ihtiyac\u0131n\u0131z var m\u0131? \u0130\u015fte tam da bu noktada, daha basit ve \u00e7o\u011fu zaman yeterli bir alternatif olan Server-Sent Events (SSE) devreye giriyor. Bu makalede, SSE&#039;nin ne oldu\u011funu, nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131, hangi durumlarda WebSockets&#039;a tercih edilebilece\u011fini ve basit bir \u015fekilde nas\u0131l uyguland\u0131\u011f\u0131n\u0131 ke\u015ffedece\u011fiz. Gelin, ger\u00e7ek zamanl\u0131 web&#039;in gizli kahraman\u0131n\u0131 yak\u0131ndan tan\u0131yal\u0131m.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/websocketsa-her-zaman-gerek-yok-ssenin-basit-gucu\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"WebSockets&#039;a Her Zaman Gerek Yok: SSE&#039;nin Basit G\u00fcc\u00fc\" \/>\n<meta property=\"og:description\" content=\"G\u00fcn\u00fcm\u00fczde web uygulamalar\u0131n\u0131n neredeyse tamam\u0131 ger\u00e7ek zamanl\u0131 veri ak\u0131\u015f\u0131na ihtiya\u00e7 duyuyor. Canl\u0131 sohbetler, bildirimler, spor skorlar\u0131 veya borsa verileri gibi s\u00fcrekli g\u00fcncellenen bilgiler, kullan\u0131c\u0131 deneyiminin vazge\u00e7ilmez bir par\u00e7as\u0131 haline geldi. Pek \u00e7ok geli\u015ftirici, bu t\u00fcr ihtiya\u00e7lar i\u00e7in akla ilk gelen \u00e7\u00f6z\u00fcm olarak genellikle WebSockets&#039;\u0131 d\u00fc\u015f\u00fcn\u00fcr. Ancak, her senaryoda WebSockets&#039;\u0131n getirdi\u011fi karma\u015f\u0131kl\u0131\u011fa ve \u00e7ift y\u00f6nl\u00fc ileti\u015fim y\u00fck\u00fcne ger\u00e7ekten ihtiyac\u0131n\u0131z var m\u0131? \u0130\u015fte tam da bu noktada, daha basit ve \u00e7o\u011fu zaman yeterli bir alternatif olan Server-Sent Events (SSE) devreye giriyor. Bu makalede, SSE&#039;nin ne oldu\u011funu, nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131, hangi durumlarda WebSockets&#039;a tercih edilebilece\u011fini ve basit bir \u015fekilde nas\u0131l uyguland\u0131\u011f\u0131n\u0131 ke\u015ffedece\u011fiz. Gelin, ger\u00e7ek zamanl\u0131 web&#039;in gizli kahraman\u0131n\u0131 yak\u0131ndan tan\u0131yal\u0131m.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/websocketsa-her-zaman-gerek-yok-ssenin-basit-gucu\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-27T00:01:29+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"26 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/websocketsa-her-zaman-gerek-yok-ssenin-basit-gucu\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/websocketsa-her-zaman-gerek-yok-ssenin-basit-gucu\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"WebSockets&#8217;a Her Zaman Gerek Yok: SSE&#8217;nin Basit G\u00fcc\u00fc\",\"datePublished\":\"2025-10-27T00:01:29+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/websocketsa-her-zaman-gerek-yok-ssenin-basit-gucu\/\"},\"wordCount\":4904,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/websocketsa-her-zaman-gerek-yok-ssenin-basit-gucu\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/websocketsa-her-zaman-gerek-yok-ssenin-basit-gucu\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/websocketsa-her-zaman-gerek-yok-ssenin-basit-gucu\/\",\"name\":\"WebSockets'a Her Zaman Gerek Yok: SSE'nin Basit G\u00fcc\u00fc\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-27T00:01:29+00:00\",\"description\":\"G\u00fcn\u00fcm\u00fczde web uygulamalar\u0131n\u0131n neredeyse tamam\u0131 ger\u00e7ek zamanl\u0131 veri ak\u0131\u015f\u0131na ihtiya\u00e7 duyuyor. Canl\u0131 sohbetler, bildirimler, spor skorlar\u0131 veya borsa verileri gibi s\u00fcrekli g\u00fcncellenen bilgiler, kullan\u0131c\u0131 deneyiminin vazge\u00e7ilmez bir par\u00e7as\u0131 haline geldi. Pek \u00e7ok geli\u015ftirici, bu t\u00fcr ihtiya\u00e7lar i\u00e7in akla ilk gelen \u00e7\u00f6z\u00fcm olarak genellikle WebSockets'\u0131 d\u00fc\u015f\u00fcn\u00fcr. Ancak, her senaryoda WebSockets'\u0131n getirdi\u011fi karma\u015f\u0131kl\u0131\u011fa ve \u00e7ift y\u00f6nl\u00fc ileti\u015fim y\u00fck\u00fcne ger\u00e7ekten ihtiyac\u0131n\u0131z var m\u0131? \u0130\u015fte tam da bu noktada, daha basit ve \u00e7o\u011fu zaman yeterli bir alternatif olan Server-Sent Events (SSE) devreye giriyor. Bu makalede, SSE'nin ne oldu\u011funu, nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131, hangi durumlarda WebSockets'a tercih edilebilece\u011fini ve basit bir \u015fekilde nas\u0131l uyguland\u0131\u011f\u0131n\u0131 ke\u015ffedece\u011fiz. Gelin, ger\u00e7ek zamanl\u0131 web'in gizli kahraman\u0131n\u0131 yak\u0131ndan tan\u0131yal\u0131m.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/websocketsa-her-zaman-gerek-yok-ssenin-basit-gucu\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/websocketsa-her-zaman-gerek-yok-ssenin-basit-gucu\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/websocketsa-her-zaman-gerek-yok-ssenin-basit-gucu\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"WebSockets&#8217;a Her Zaman Gerek Yok: SSE&#8217;nin Basit G\u00fcc\u00fc\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"WebSockets'a Her Zaman Gerek Yok: SSE'nin Basit G\u00fcc\u00fc","description":"G\u00fcn\u00fcm\u00fczde web uygulamalar\u0131n\u0131n neredeyse tamam\u0131 ger\u00e7ek zamanl\u0131 veri ak\u0131\u015f\u0131na ihtiya\u00e7 duyuyor. Canl\u0131 sohbetler, bildirimler, spor skorlar\u0131 veya borsa verileri gibi s\u00fcrekli g\u00fcncellenen bilgiler, kullan\u0131c\u0131 deneyiminin vazge\u00e7ilmez bir par\u00e7as\u0131 haline geldi. Pek \u00e7ok geli\u015ftirici, bu t\u00fcr ihtiya\u00e7lar i\u00e7in akla ilk gelen \u00e7\u00f6z\u00fcm olarak genellikle WebSockets'\u0131 d\u00fc\u015f\u00fcn\u00fcr. Ancak, her senaryoda WebSockets'\u0131n getirdi\u011fi karma\u015f\u0131kl\u0131\u011fa ve \u00e7ift y\u00f6nl\u00fc ileti\u015fim y\u00fck\u00fcne ger\u00e7ekten ihtiyac\u0131n\u0131z var m\u0131? \u0130\u015fte tam da bu noktada, daha basit ve \u00e7o\u011fu zaman yeterli bir alternatif olan Server-Sent Events (SSE) devreye giriyor. Bu makalede, SSE'nin ne oldu\u011funu, nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131, hangi durumlarda WebSockets'a tercih edilebilece\u011fini ve basit bir \u015fekilde nas\u0131l uyguland\u0131\u011f\u0131n\u0131 ke\u015ffedece\u011fiz. Gelin, ger\u00e7ek zamanl\u0131 web'in gizli kahraman\u0131n\u0131 yak\u0131ndan tan\u0131yal\u0131m.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/websocketsa-her-zaman-gerek-yok-ssenin-basit-gucu\/","og_locale":"tr_TR","og_type":"article","og_title":"WebSockets'a Her Zaman Gerek Yok: SSE'nin Basit G\u00fcc\u00fc","og_description":"G\u00fcn\u00fcm\u00fczde web uygulamalar\u0131n\u0131n neredeyse tamam\u0131 ger\u00e7ek zamanl\u0131 veri ak\u0131\u015f\u0131na ihtiya\u00e7 duyuyor. Canl\u0131 sohbetler, bildirimler, spor skorlar\u0131 veya borsa verileri gibi s\u00fcrekli g\u00fcncellenen bilgiler, kullan\u0131c\u0131 deneyiminin vazge\u00e7ilmez bir par\u00e7as\u0131 haline geldi. Pek \u00e7ok geli\u015ftirici, bu t\u00fcr ihtiya\u00e7lar i\u00e7in akla ilk gelen \u00e7\u00f6z\u00fcm olarak genellikle WebSockets'\u0131 d\u00fc\u015f\u00fcn\u00fcr. Ancak, her senaryoda WebSockets'\u0131n getirdi\u011fi karma\u015f\u0131kl\u0131\u011fa ve \u00e7ift y\u00f6nl\u00fc ileti\u015fim y\u00fck\u00fcne ger\u00e7ekten ihtiyac\u0131n\u0131z var m\u0131? \u0130\u015fte tam da bu noktada, daha basit ve \u00e7o\u011fu zaman yeterli bir alternatif olan Server-Sent Events (SSE) devreye giriyor. Bu makalede, SSE'nin ne oldu\u011funu, nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131, hangi durumlarda WebSockets'a tercih edilebilece\u011fini ve basit bir \u015fekilde nas\u0131l uyguland\u0131\u011f\u0131n\u0131 ke\u015ffedece\u011fiz. Gelin, ger\u00e7ek zamanl\u0131 web'in gizli kahraman\u0131n\u0131 yak\u0131ndan tan\u0131yal\u0131m.","og_url":"https:\/\/fatihsoysal.com\/blog\/websocketsa-her-zaman-gerek-yok-ssenin-basit-gucu\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-27T00:01:29+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"26 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/websocketsa-her-zaman-gerek-yok-ssenin-basit-gucu\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/websocketsa-her-zaman-gerek-yok-ssenin-basit-gucu\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"WebSockets&#8217;a Her Zaman Gerek Yok: SSE&#8217;nin Basit G\u00fcc\u00fc","datePublished":"2025-10-27T00:01:29+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/websocketsa-her-zaman-gerek-yok-ssenin-basit-gucu\/"},"wordCount":4904,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/websocketsa-her-zaman-gerek-yok-ssenin-basit-gucu\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/websocketsa-her-zaman-gerek-yok-ssenin-basit-gucu\/","url":"https:\/\/fatihsoysal.com\/blog\/websocketsa-her-zaman-gerek-yok-ssenin-basit-gucu\/","name":"WebSockets'a Her Zaman Gerek Yok: SSE'nin Basit G\u00fcc\u00fc","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-27T00:01:29+00:00","description":"G\u00fcn\u00fcm\u00fczde web uygulamalar\u0131n\u0131n neredeyse tamam\u0131 ger\u00e7ek zamanl\u0131 veri ak\u0131\u015f\u0131na ihtiya\u00e7 duyuyor. Canl\u0131 sohbetler, bildirimler, spor skorlar\u0131 veya borsa verileri gibi s\u00fcrekli g\u00fcncellenen bilgiler, kullan\u0131c\u0131 deneyiminin vazge\u00e7ilmez bir par\u00e7as\u0131 haline geldi. Pek \u00e7ok geli\u015ftirici, bu t\u00fcr ihtiya\u00e7lar i\u00e7in akla ilk gelen \u00e7\u00f6z\u00fcm olarak genellikle WebSockets'\u0131 d\u00fc\u015f\u00fcn\u00fcr. Ancak, her senaryoda WebSockets'\u0131n getirdi\u011fi karma\u015f\u0131kl\u0131\u011fa ve \u00e7ift y\u00f6nl\u00fc ileti\u015fim y\u00fck\u00fcne ger\u00e7ekten ihtiyac\u0131n\u0131z var m\u0131? \u0130\u015fte tam da bu noktada, daha basit ve \u00e7o\u011fu zaman yeterli bir alternatif olan Server-Sent Events (SSE) devreye giriyor. Bu makalede, SSE'nin ne oldu\u011funu, nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131, hangi durumlarda WebSockets'a tercih edilebilece\u011fini ve basit bir \u015fekilde nas\u0131l uyguland\u0131\u011f\u0131n\u0131 ke\u015ffedece\u011fiz. Gelin, ger\u00e7ek zamanl\u0131 web'in gizli kahraman\u0131n\u0131 yak\u0131ndan tan\u0131yal\u0131m.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/websocketsa-her-zaman-gerek-yok-ssenin-basit-gucu\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/websocketsa-her-zaman-gerek-yok-ssenin-basit-gucu\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/websocketsa-her-zaman-gerek-yok-ssenin-basit-gucu\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"WebSockets&#8217;a Her Zaman Gerek Yok: SSE&#8217;nin Basit G\u00fcc\u00fc"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/32890","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=32890"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/32890\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=32890"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=32890"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=32890"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}