{"id":33115,"date":"2025-10-29T21:31:54","date_gmt":"2025-10-29T18:31:54","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/websockets-alternatifi-server-sent-events-ile-guclu-tek-yonlu-iletisim\/"},"modified":"2025-10-29T21:31:54","modified_gmt":"2025-10-29T18:31:54","slug":"websockets-alternatifi-server-sent-events-ile-guclu-tek-yonlu-iletisim","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/websockets-alternatifi-server-sent-events-ile-guclu-tek-yonlu-iletisim\/","title":{"rendered":"WebSockets Alternatifi: Server-Sent Events ile G\u00fc\u00e7l\u00fc Tek Y\u00f6nl\u00fc \u0130leti\u015fim"},"content":{"rendered":"<p>Ger\u00e7ek zamanl\u0131 uygulamalar geli\u015ftirirken akl\u0131n\u0131za hemen WebSockets mi geliyor? Belki de tek y\u00f6nl\u00fc, sunucudan istemciye veri ak\u0131\u015f\u0131 i\u00e7in daha basit, daha verimli bir \u00e7\u00f6z\u00fcme ihtiyac\u0131n\u0131z vard\u0131r. Server-Sent Events (SSE) tam da bu noktada devreye giriyor.<\/p>\n<p>G\u00fcn\u00fcm\u00fcz web uygulamalar\u0131, kullan\u0131c\u0131 deneyimini zenginle\u015ftirmek ad\u0131na s\u00fcrekli daha dinamik ve ger\u00e7ek zamanl\u0131 \u00f6zellikler sunma e\u011filimindedir. Canl\u0131 sohbetler, anl\u0131k bildirimler, spor skorlar\u0131n\u0131n g\u00fcncellenmesi veya finansal verilerin takibi gibi pek \u00e7ok senaryoda, sunucu ile istemci aras\u0131nda s\u00fcrekli bir ileti\u015fim hatt\u0131na ihtiya\u00e7 duyar\u0131z. Bu t\u00fcr ihtiya\u00e7lar s\u00f6z konusu oldu\u011funda, bir\u00e7ok geli\u015ftiricinin akl\u0131na ilk gelen teknoloji \u015f\u00fcphesiz WebSockets olur. WebSockets, \u00e7ift y\u00f6nl\u00fc (iki y\u00f6nl\u00fc) ve d\u00fc\u015f\u00fck gecikmeli bir ileti\u015fim kanal\u0131 sa\u011flayarak, sunucunun ve istemcinin birbirleriyle her an konu\u015fabilmesine olanak tan\u0131r. Ancak, her ara\u00e7 her i\u015f i\u00e7in uygun olmad\u0131\u011f\u0131 gibi, WebSockets de her ger\u00e7ek zamanl\u0131 ileti\u015fim senaryosu i\u00e7in mutlak en iyi \u00e7\u00f6z\u00fcm de\u011fildir.<\/p>\n<p>WebSockets&#8217;\u0131n sundu\u011fu \u00e7ift y\u00f6nl\u00fc ileti\u015fim kabiliyeti, genellikle karma\u015f\u0131kl\u0131\u011f\u0131 da beraberinde getirir. Daha karma\u015f\u0131k bir protokol el s\u0131k\u0131\u015fma s\u00fcreci, durum y\u00f6netimi ve daha fazla altyap\u0131 gereksinimi anlam\u0131na gelebilir. \u00d6zellikle \u00f6l\u00e7eklenebilirlik konusunda, her bir istemci i\u00e7in a\u00e7\u0131k tutulan kal\u0131c\u0131 ba\u011flant\u0131lar, sunucu kaynaklar\u0131 \u00fczerinde ciddi bir y\u00fck olu\u015fturabilir. Bunun yan\u0131 s\u0131ra, y\u00fck dengeleyicilerle \u00e7al\u0131\u015f\u0131rken &#8220;sticky sessions&#8221; gibi \u00f6zel konfig\u00fcrasyonlara ihtiya\u00e7 duyulmas\u0131, da\u011f\u0131t\u0131k sistemlerde y\u00f6netimi daha da zorla\u015ft\u0131r\u0131r. Dolay\u0131s\u0131yla, bir projenin ger\u00e7ek zamanl\u0131 gereksinimlerini de\u011ferlendirirken, bu karma\u015f\u0131kl\u0131\u011f\u0131n ger\u00e7ekten gerekli olup olmad\u0131\u011f\u0131n\u0131 sorgulamak hayati \u00f6nem ta\u015f\u0131r. E\u011fer uygulaman\u0131z\u0131n temel ihtiyac\u0131, sadece sunucudan istemciye do\u011fru s\u00fcrekli ve d\u00fczenli veri ak\u0131\u015f\u0131 ise, yani istemcinin sunucuya \u00e7ok fazla veri g\u00f6ndermesine gerek yoksa, WebSockets kullanmak adeta &#8220;bir sine\u011fi top at\u0131\u015f\u0131yla \u00f6ld\u00fcrmek&#8221; gibi a\u015f\u0131r\u0131ya ka\u00e7an bir \u00e7\u00f6z\u00fcm olabilir.<\/p>\n<p>\u0130\u015fte tam bu noktada, Server-Sent Events (SSE) teknolojisi devreye girer ve bir\u00e7ok geli\u015ftiricinin g\u00f6zden ka\u00e7\u0131rd\u0131\u011f\u0131, ancak bir o kadar da g\u00fc\u00e7l\u00fc ve zarif bir alternatif sunar. SSE, HTTP tabanl\u0131 yap\u0131s\u0131yla bilinen web altyap\u0131s\u0131 \u00fczerine in\u015fa edilmi\u015f, tek y\u00f6nl\u00fc bir ileti\u015fim protokol\u00fcd\u00fcr. Amac\u0131 basittir: Sunucunun, istemciye s\u00fcrekli bir &#8220;olay ak\u0131\u015f\u0131&#8221; (event stream) g\u00f6ndermesini sa\u011flamak. Bu, WebSockets&#8217;\u0131n aksine, istemcinin sunucuya veri g\u00f6nderme ihtiyac\u0131n\u0131n minimal oldu\u011fu veya hi\u00e7 olmad\u0131\u011f\u0131 senaryolar i\u00e7in idealdir. \u00d6rne\u011fin, canl\u0131 veri ak\u0131\u015flar\u0131, bildirimler, anl\u0131k g\u00fcncellemeler ve zaman bazl\u0131 olaylar gibi durumlarda SSE, WebSockets&#8217;tan \u00e7ok daha sade ve verimli bir \u00e7\u00f6z\u00fcm sunabilir. Bu makalede, SSE&#8217;nin ne oldu\u011funu, nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131, hangi durumlarda kullan\u0131lmas\u0131 gerekti\u011fini ve onu WebSockets&#8217;a kar\u015f\u0131 g\u00fc\u00e7l\u00fc bir alternatif yapan \u00f6zelliklerini detayl\u0131 bir \u015fekilde inceleyece\u011fiz. Ayr\u0131ca, ger\u00e7ek d\u00fcnya \u00f6rnekleri ve kod par\u00e7ac\u0131klar\u0131yla konuyu somutla\u015ft\u0131rarak, bu g\u00fc\u00e7l\u00fc tekni\u011fi uygulamalar\u0131n\u0131za nas\u0131l entegre edebilece\u011finizi g\u00f6sterece\u011fiz.<\/p>\n<h2 id=\"server-sent-events-sse-nedir-ve-nasil-calisir\">Server-Sent Events (SSE) Nedir ve Nas\u0131l \u00c7al\u0131\u015f\u0131r?<\/h2>\n<p>Server-Sent Events (SSE), web uygulamalar\u0131nda sunucudan istemciye tek y\u00f6nl\u00fc, s\u00fcrekli bir veri ak\u0131\u015f\u0131 sa\u011flamak i\u00e7in kullan\u0131lan basit ama etkili bir teknolojidir. Ad\u0131ndan da anla\u015f\u0131laca\u011f\u0131 gibi, sunucu taraf\u0131ndan g\u00f6nderilen &#8220;olaylar\u0131&#8221; (events) dinlemeye odaklan\u0131r. WebSockets&#8217;\u0131n iki y\u00f6nl\u00fc ileti\u015fim yetene\u011finin aksine, SSE yaln\u0131zca sunucudan istemciye do\u011fru veri ak\u0131\u015f\u0131n\u0131 hedefler. Bu tek y\u00f6nl\u00fc do\u011fa, baz\u0131 senaryolar i\u00e7in onu daha sade, daha hafif ve dolay\u0131s\u0131yla daha verimli bir se\u00e7enek haline getirir.<\/p>\n<p>SSE&#8217;nin temel \u00e7al\u0131\u015fma prensibi, standart HTTP protokol\u00fc \u00fczerine in\u015fa edilmi\u015ftir. Geleneksel HTTP istekleri genellikle k\u0131sa \u00f6m\u00fcrl\u00fcd\u00fcr; istemci bir istek g\u00f6nderir, sunucu bir yan\u0131t verir ve ba\u011flant\u0131 kapan\u0131r. Ancak SSE, bu modeli \u00f6zel bir \u015fekilde geni\u015fleterek, sunucunun ba\u011flant\u0131y\u0131 a\u00e7\u0131k tutmas\u0131na ve istemciye zaman zaman veri par\u00e7ac\u0131klar\u0131 g\u00f6ndermesine olanak tan\u0131r. Bu, genellikle &#8220;long polling&#8221; olarak bilinen tekni\u011fin daha geli\u015fmi\u015f ve standartla\u015ft\u0131r\u0131lm\u0131\u015f bir versiyonu olarak d\u00fc\u015f\u00fcn\u00fclebilir. Long polling&#8217;de istemci bir istek g\u00f6nderir, sunucu bir s\u00fcre bekler (veri gelene kadar veya zaman a\u015f\u0131m\u0131na u\u011frayana kadar) ve ard\u0131ndan yan\u0131t verir, ba\u011flant\u0131y\u0131 kapat\u0131r. \u0130stemci ise yeni veri i\u00e7in hemen yeni bir istek g\u00f6nderir. SSE ise, sunucunun ba\u011flant\u0131y\u0131 <em>a\u00e7\u0131k tutarak<\/em> birden fazla veri par\u00e7as\u0131n\u0131 ayn\u0131 ba\u011flant\u0131 \u00fczerinden g\u00f6ndermesini sa\u011flar, bu da s\u00fcrekli bir &#8220;olay ak\u0131\u015f\u0131&#8221; olu\u015fturur.<\/p>\n<p>Bu s\u00fcrekli ak\u0131\u015f, <code>text\/event-stream<\/code> MIME t\u00fcr\u00fc ile tan\u0131mlan\u0131r. \u0130stemci, bir <code>EventSource<\/code> objesi olu\u015fturarak sunucuya bir HTTP iste\u011fi g\u00f6nderdi\u011finde, sunucu bu \u00f6zel MIME t\u00fcr\u00fcyle yan\u0131t verir. Sunucu bu yan\u0131t\u0131 g\u00f6nderdikten sonra, ba\u011flant\u0131y\u0131 hemen kapatmaz; aksine, istemciye yeni olaylar geldi\u011finde bu ba\u011flant\u0131 \u00fczerinden g\u00f6ndermeye devam eder. Her olay, \u00f6zel bir formatla (<code>data: ...\\n\\n<\/code> gibi) sunucu taraf\u0131ndan paketlenir ve istemciye g\u00f6nderilir. \u0130stemci taraf\u0131ndaki taray\u0131c\u0131, bu format\u0131 otomatik olarak ayr\u0131\u015ft\u0131r\u0131r ve ilgili olaylar\u0131 JavaScript taraf\u0131nda dinlenebilir hale getirir. Bu yerle\u015fik taray\u0131c\u0131 deste\u011fi, SSE&#8217;yi geli\u015ftiriciler i\u00e7in son derece \u00e7ekici k\u0131lar, \u00e7\u00fcnk\u00fc ek k\u00fct\u00fcphanelere veya karma\u015f\u0131k protokol implementasyonlar\u0131na gerek kalmaz.<\/p>\n<p>Ayr\u0131ca, SSE&#8217;nin HTTP\/2 ile olan uyumu, performans\u0131n\u0131 daha da art\u0131r\u0131r. HTTP\/2&#8217;nin \u00e7oklama (multiplexing) \u00f6zelli\u011fi sayesinde, birden fazla SSE ak\u0131\u015f\u0131 tek bir TCP ba\u011flant\u0131s\u0131 \u00fczerinden iletilebilir. Bu durum, her SSE ba\u011flant\u0131s\u0131 i\u00e7in ayr\u0131 bir TCP ba\u011flant\u0131s\u0131 a\u00e7ma ihtiyac\u0131n\u0131 ortadan kald\u0131rarak a\u011f gecikmesini azalt\u0131r ve kaynak kullan\u0131m\u0131n\u0131 optimize eder. Sunucu taraf\u0131nda, SSE implementasyonu genellikle olduk\u00e7a basittir. Sunucunun yapmas\u0131 gereken temel \u015feyler, do\u011fru HTTP ba\u015fl\u0131klar\u0131n\u0131 (<code>Content-Type: text\/event-stream<\/code>, <code>Cache-Control: no-cache<\/code>, <code>Connection: keep-alive<\/code>) ayarlamak ve veriyi standartla\u015ft\u0131r\u0131lm\u0131\u015f olay format\u0131nda g\u00f6ndermektir. \u0130stemci taraf\u0131nda ise, JavaScript&#8217;teki <code>EventSource<\/code> API&#8217;si ile bu ak\u0131\u015f\u0131 dinlemek ve gelen olaylara tepki vermek son derece kolayd\u0131r. Taray\u0131c\u0131n\u0131n otomatik yeniden ba\u011flant\u0131 denemeleri gibi yerle\u015fik \u00f6zellikleri sayesinde, a\u011f kesintileri durumunda bile uygulaman\u0131n sa\u011flaml\u0131\u011f\u0131 art\u0131r\u0131l\u0131r. Bu \u00f6zellikler, SSE&#8217;yi \u00f6zellikle bildirim sistemleri, canl\u0131 veri ak\u0131\u015flar\u0131 veya uzun s\u00fcreli arka plan i\u015flemleri i\u00e7in ilerleme durumu g\u00f6sterme gibi senaryolarda WebSockets&#8217;a g\u00fc\u00e7l\u00fc bir alternatif yapar.<\/p>\n<div class=\"tip\">\n  Uzman \u0130pucu: SSE, HTTP\/2 ile kullan\u0131ld\u0131\u011f\u0131nda performans\u0131n\u0131 zirveye ta\u015f\u0131r. Tek bir TCP ba\u011flant\u0131s\u0131 \u00fczerinden birden fazla olay ak\u0131\u015f\u0131n\u0131 y\u00f6netebilir, bu da kaynak t\u00fcketimini ve gecikmeyi \u00f6nemli \u00f6l\u00e7\u00fcde azalt\u0131r.\n<\/div>\n<h3 id=\"sse-ile-neler-yapabiliriz-gercek-dunya-senaryolari\">SSE ile Neler Yapabiliriz: Ger\u00e7ek D\u00fcnya Senaryolar\u0131<\/h3>\n<p>SSE&#8217;nin tek y\u00f6nl\u00fc do\u011fas\u0131 ve basitli\u011fi, onu bir\u00e7ok ger\u00e7ek zamanl\u0131 senaryo i\u00e7in ideal bir se\u00e7im haline getirir. WebSockets&#8217;\u0131n karma\u015f\u0131kl\u0131\u011f\u0131na ihtiya\u00e7 duymadan, kullan\u0131c\u0131lar\u0131n\u0131za dinamik ve g\u00fcncel bilgiler sunabilirsiniz. \u0130\u015fte SSE&#8217;nin parlad\u0131\u011f\u0131 baz\u0131 yayg\u0131n ger\u00e7ek d\u00fcnya kullan\u0131m durumlar\u0131:<\/p>\n<ol>\n<li><strong>Canl\u0131 Haber ve Spor Skor G\u00fcncellemeleri:<\/strong> Haber siteleri veya spor uygulamalar\u0131, kullan\u0131c\u0131lar\u0131na en son haber ba\u015fl\u0131klar\u0131n\u0131 veya ma\u00e7 skorlar\u0131n\u0131 anl\u0131k olarak ula\u015ft\u0131rmak isterler. SSE ile sunucu, yeni bir haber d\u00fc\u015ft\u00fc\u011f\u00fcnde veya bir gol oldu\u011funda, t\u00fcm ba\u011fl\u0131 istemcilere otomatik olarak g\u00fcncellemeleri g\u00f6nderebilir. Kullan\u0131c\u0131lar\u0131n sayfay\u0131 yenilemesine gerek kalmadan en g\u00fcncel bilgilere eri\u015fmesi sa\u011flan\u0131r.<\/li>\n<li><strong>Finansal Veri Ak\u0131\u015flar\u0131 (Borsa Takibi):<\/strong> Borsa uygulamalar\u0131 veya kripto para borsalar\u0131, hisse senedi fiyatlar\u0131, d\u00f6viz kurlar\u0131 veya kripto para birimi de\u011ferleri gibi s\u00fcrekli de\u011fi\u015fen finansal verileri ger\u00e7ek zamanl\u0131 olarak g\u00f6stermek zorundad\u0131r. SSE, bu verileri sunucudan istemcilere kesintisiz bir ak\u0131\u015f halinde ula\u015ft\u0131rarak, kullan\u0131c\u0131lar\u0131n piyasa hareketlerini anl\u0131k olarak takip etmesini m\u00fcmk\u00fcn k\u0131lar.<\/li>\n<li><strong>Anl\u0131k Bildirim Sistemleri:<\/strong> Sosyal medya platformlar\u0131, e-ticaret siteleri veya her t\u00fcrl\u00fc web uygulamas\u0131, kullan\u0131c\u0131lar\u0131na yeni bir mesaj, bir be\u011feni, bir yorum veya sipari\u015f durumu de\u011fi\u015fikli\u011fi gibi olaylar hakk\u0131nda bildirim g\u00f6ndermek i\u00e7in SSE&#8217;yi kullanabilir. Bu, kullan\u0131c\u0131 deneyimini \u00f6nemli \u00f6l\u00e7\u00fcde iyile\u015ftirir ve uygulaman\u0131n etkile\u015fimini art\u0131r\u0131r.<\/li>\n<li><strong>Uzun S\u00fcreli Arka Plan G\u00f6revlerinin \u0130lerleme Takibi:<\/strong> B\u00fcy\u00fck bir dosya y\u00fcklemesi, karma\u015f\u0131k bir rapor olu\u015fturma veya veri i\u015fleme gibi uzun s\u00fcren arka plan g\u00f6revleri oldu\u011funda, kullan\u0131c\u0131ya bu g\u00f6revin ilerleme durumunu g\u00f6stermek \u00f6nemlidir. SSE ile sunucu, g\u00f6revin y\u00fczde ka\u00e7\u0131n\u0131n tamamland\u0131\u011f\u0131na dair periyodik g\u00fcncellemeleri istemciye g\u00f6ndererek, bir ilerleme \u00e7ubu\u011funun ger\u00e7ek zamanl\u0131 olarak g\u00fcncellenmesini sa\u011flayabilir.<\/li>\n<li><strong>Operasyonel Kontrol Panelleri (Dashboards):<\/strong> Sunucu performans\u0131n\u0131, uygulama loglar\u0131n\u0131, IoT cihaz verilerini veya sistem metriklerini g\u00f6steren kontrol panelleri, genellikle s\u00fcrekli g\u00fcncellenen verilere ihtiya\u00e7 duyar. SSE, bu t\u00fcr panellerin ger\u00e7ek zamanl\u0131 veri ak\u0131\u015f\u0131yla g\u00fcncel kalmas\u0131n\u0131 sa\u011flayarak y\u00f6neticilere anl\u0131k bilgi sa\u011flar.<\/li>\n<li><strong>Canl\u0131 Etkinlik Ak\u0131\u015flar\u0131 ve Yorumlar:<\/strong> Bir online konferans, webinar veya canl\u0131 yay\u0131n s\u0131ras\u0131nda, kat\u0131l\u0131mc\u0131lardan gelen sorular\u0131 veya yorumlar\u0131 anl\u0131k olarak g\u00f6stermek i\u00e7in SSE kullan\u0131labilir. Sunucu, yeni bir yorum geldi\u011finde bunu t\u00fcm kat\u0131l\u0131mc\u0131lara ileterek dinamik bir etkile\u015fim ortam\u0131 yarat\u0131r.<\/li>\n<\/ol>\n<p>T\u00fcm bu senaryolar, temelde sunucudan istemciye tek y\u00f6nl\u00fc veri ak\u0131\u015f\u0131na odaklan\u0131r. \u0130stemcinin sunucuya yo\u011fun bir \u015fekilde veri g\u00f6ndermesi gerekmedi\u011fi durumlarda, SSE&#8217;nin basitli\u011fi, g\u00fcvenilirli\u011fi ve taray\u0131c\u0131 deste\u011fi, onu WebSockets gibi daha karma\u015f\u0131k \u00e7\u00f6z\u00fcmlere tercih edilebilir k\u0131lar. Bu sayede, hem geli\u015ftirme s\u00fcreci h\u0131zlan\u0131r hem de uygulaman\u0131n performans\u0131 ve \u00f6l\u00e7eklenebilirli\u011fi art\u0131r\u0131labilir.<\/p>\n<h2 id=\"sse-uygulamak-bu-kadar-kolay-mi-istemci-ve-sunucu-tarafi-adimlar\">SSE Uygulamak Bu Kadar Kolay M\u0131? \u0130stemci ve Sunucu Taraf\u0131 Ad\u0131mlar<\/h2>\n<p>Server-Sent Events&#8217;in en b\u00fcy\u00fck avantajlar\u0131ndan biri, uygulamas\u0131n\u0131n \u015fa\u015f\u0131rt\u0131c\u0131 derecede basit olmas\u0131d\u0131r. Gerek istemci taraf\u0131nda gerekse sunucu taraf\u0131nda, standart web teknolojileri ve minimal kodlama ile g\u00fc\u00e7l\u00fc bir ger\u00e7ek zamanl\u0131 ileti\u015fim kanal\u0131 olu\u015fturabilirsiniz. Bu b\u00f6l\u00fcmde, SSE&#8217;yi bir web uygulamas\u0131na nas\u0131l entegre edece\u011finizi ad\u0131m ad\u0131m hem istemci hem de sunucu perspektifinden inceleyece\u011fiz.<\/p>\n<h3 id=\"istemci-tarafi-event-source-api-ile-veri-dinleme\">\u0130stemci Taraf\u0131: EventSource API ile Veri Dinleme<\/h3>\n<p>\u0130stemci taraf\u0131nda SSE kullanmak, modern taray\u0131c\u0131larda yerle\u015fik olarak bulunan <code>EventSource<\/code> API&#8217;si sayesinde olduk\u00e7a basittir. Bu API, sunucudan gelen olay ak\u0131\u015f\u0131n\u0131 dinlemek i\u00e7in kullan\u0131l\u0131r. Temel ad\u0131mlar \u015funlard\u0131r:<\/p>\n<ol>\n<li><strong><code>EventSource<\/code> Objesi Olu\u015fturma:<\/strong> Sunucudan olaylar\u0131 dinlemeye ba\u015flamak i\u00e7in, <code>EventSource<\/code> constructor&#8217;\u0131na olay ak\u0131\u015f\u0131n\u0131n URL&#8217;sini parametre olarak ge\u00e7irerek yeni bir obje olu\u015fturman\u0131z yeterlidir.<\/li>\n<li><strong>Olay Dinleyicileri Ekleme:<\/strong> <code>EventSource<\/code> objesi, standart DOM olaylar\u0131 gibi olaylara sahiptir. En yayg\u0131n kullan\u0131lanlar:\n<ul>\n<li><code>onopen<\/code>: Ba\u011flant\u0131 a\u00e7\u0131ld\u0131\u011f\u0131nda tetiklenir.<\/li>\n<li><code>onmessage<\/code>: Sunucudan <code>data:<\/code> anahtar\u0131 ile g\u00f6nderilen genel mesajlar geldi\u011finde tetiklenir.<\/li>\n<li><code>onerror<\/code>: Ba\u011flant\u0131 hatas\u0131 olu\u015ftu\u011funda tetiklenir.<\/li>\n<li><code>addEventListener('customEvent', handler)<\/code>: Sunucunun <code>event:<\/code> anahtar\u0131yla g\u00f6nderdi\u011fi belirli t\u00fcrdeki \u00f6zel olaylar\u0131 dinlemek i\u00e7in kullan\u0131l\u0131r.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<p>\u0130\u015fte basit bir istemci taraf\u0131 kodu \u00f6rne\u011fi:<\/p>\n<pre><code class=\"language-javascript\">\n\/\/ Yeni bir EventSource ba\u011flant\u0131s\u0131 olu\u015ftur\nconst eventSource = new EventSource('\/events');\n\n\/\/ Ba\u011flant\u0131 a\u00e7\u0131ld\u0131\u011f\u0131nda\neventSource.onopen = () => {\n    console.log('Server-Sent Events ba\u011flant\u0131s\u0131 a\u00e7\u0131ld\u0131.');\n    const statusDiv = document.getElementById('status');\n    if (statusDiv) {\n        statusDiv.textContent = 'Ba\u011flant\u0131 a\u00e7\u0131k';\n        statusDiv.style.color = 'green';\n    }\n};\n\n\/\/ Sunucudan genel mesajlar geldi\u011finde (data: ...)\neventSource.onmessage = (event) => {\n    console.log('Sunucudan gelen mesaj:', event.data);\n    const messagesDiv = document.getElementById('messages');\n    if (messagesDiv) {\n        const p = document.createElement('p');\n        p.textContent = <code>Mesaj: ${event.data}<\/code>;\n        messagesDiv.appendChild(p);\n    }\n};\n\n\/\/ Sunucudan belirli bir 'notification' olay\u0131 geldi\u011finde\neventSource.addEventListener('notification', (event) => {\n    console.log('Yeni bildirim al\u0131nd\u0131:', event.data);\n    const notificationsDiv = document.getElementById('notifications');\n    if (notificationsDiv) {\n        const p = document.createElement('p');\n        p.textContent = <code>Bildirim: ${event.data}<\/code>;\n        notificationsDiv.appendChild(p);\n    }\n});\n\n\/\/ Ba\u011flant\u0131da bir hata olu\u015ftu\u011funda\neventSource.onerror = (error) => {\n    console.error('Server-Sent Events hatas\u0131:', error);\n    const statusDiv = document.getElementById('status');\n    if (statusDiv) {\n        statusDiv.textContent = 'Ba\u011flant\u0131 hatas\u0131 veya kapal\u0131';\n        statusDiv.style.color = 'red';\n    }\n    \/\/ Hata durumunda EventSource otomatik olarak yeniden ba\u011flanmay\u0131 deneyecektir.\n    \/\/ Manuel olarak kapatmak isterseniz: eventSource.close();\n};\n\n\/\/ Uygulaman\u0131z\u0131n HTML k\u0131sm\u0131 (\u00f6rnek)\n\/\/ <div id=\"status\">Ba\u011flant\u0131 bekleniyor...<\/div>\n\/\/ <div id=\"messages\"><\/div>\n\/\/ <div id=\"notifications\"><\/div>\n<\/pre>\n<p><\/code><\/p>\n<p>G\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi, <code>EventSource<\/code> objesi, a\u011f hatalar\u0131n\u0131 ve ba\u011flant\u0131 kopukluklar\u0131n\u0131 otomatik olarak y\u00f6netir, belirli bir gecikme s\u00fcresinden sonra yeniden ba\u011flanmay\u0131 dener. Bu, geli\u015ftiriciler i\u00e7in \u00f6nemli bir kolayl\u0131k sa\u011flar ve uygulaman\u0131n sa\u011flaml\u0131\u011f\u0131n\u0131 art\u0131r\u0131r.<\/p>\n<h3 id=\"sunucu-tarafi-event-stream-olusturma\">Sunucu Taraf\u0131: Event Stream Olu\u015fturma<\/h3>\n<p>Sunucu taraf\u0131nda, herhangi bir web framework (Node.js, Python Flask\/Django, PHP Laravel\/Symfony, Java Spring vb.) ile bir SSE ak\u0131\u015f\u0131 olu\u015fturabilirsiniz. Temel prensip, istemciye \u00f6zel HTTP ba\u015fl\u0131klar\u0131 g\u00f6ndermek ve ard\u0131ndan veriyi belirli bir formatta s\u00fcrekli olarak yazmakt\u0131r.<\/p>\n<ol>\n<li><strong>HTTP Ba\u015fl\u0131klar\u0131n\u0131 Ayarlama:<\/strong> Yan\u0131t\u0131n <code>Content-Type<\/code> ba\u015fl\u0131\u011f\u0131 <code>text\/event-stream<\/code> olarak ayarlanmal\u0131 ve <code>Cache-Control: no-cache<\/code> ile <code>Connection: keep-alive<\/code> ba\u015fl\u0131klar\u0131 eklenmelidir. Bu, taray\u0131c\u0131ya bu ba\u011flant\u0131n\u0131n geleneksel bir yan\u0131t olmad\u0131\u011f\u0131n\u0131 ve s\u00fcrekli bir veri ak\u0131\u015f\u0131 beklendi\u011fini bildirir.<\/li>\n<li><strong>Olaylar\u0131 Formatlama ve G\u00f6nderme:<\/strong> Her olay, belirli bir formatta g\u00f6nderilmelidir:\n<ul>\n<li><code>data: [mesaj i\u00e7eri\u011fi]\\n\\n<\/code>: Bu, en basit olay format\u0131d\u0131r ve <code>onmessage<\/code> dinleyicisi taraf\u0131ndan yakalan\u0131r.<\/li>\n<li><code>event: [olay ad\u0131]\\n<\/code>: Olay\u0131n ad\u0131n\u0131 belirtir. \u0130stemci taraf\u0131nda <code>addEventListener('olay ad\u0131', ...)<\/code> ile yakalan\u0131r.<\/li>\n<li><code>id: [olay kimli\u011fi]\\n<\/code>: Her olaya benzersiz bir ID atar. \u0130stemci ba\u011flant\u0131s\u0131 kesilip tekrar ba\u011fland\u0131\u011f\u0131nda, <code>Last-Event-ID<\/code> ba\u015fl\u0131\u011f\u0131 ile en son ald\u0131\u011f\u0131 olay\u0131n ID'sini sunucuya bildirir, b\u00f6ylece sunucu ka\u00e7\u0131r\u0131lan olaylar\u0131 tekrar g\u00f6nderebilir (iste\u011fe ba\u011fl\u0131).<\/li>\n<li><code>retry: [milisaniye]\\n<\/code>: \u0130stemcinin otomatik yeniden ba\u011flanma denemeleri aras\u0131ndaki varsay\u0131lan bekleme s\u00fcresini ayarlar.<\/li>\n<\/ul>\n<p>        Her olay\u0131n sonunda iki yeni sat\u0131r karakteri (<code>\\n\\n<\/code>) olmal\u0131d\u0131r, bu taray\u0131c\u0131ya olay\u0131n bitti\u011fini bildirir.\n    <\/li>\n<\/ol>\n<p>\u0130\u015fte Node.js ve Express ile basit bir sunucu \u00f6rne\u011fi:<\/p>\n<pre><code class=\"language-javascript\">\nconst express = require('express');\nconst cors = require('cors'); \/\/ CORS politikalar\u0131n\u0131 y\u00f6netmek i\u00e7in\n\nconst app = express();\nconst port = 3000;\n\napp.use(cors()); \/\/ T\u00fcm k\u00f6kenlerden eri\u015fime izin ver\n\napp.get('\/events', (req, res) => {\n    \/\/ 1. HTTP Ba\u015fl\u0131klar\u0131n\u0131 Ayarlama\n    res.setHeader('Content-Type', 'text\/event-stream');\n    res.setHeader('Cache-Control', 'no-cache');\n    res.setHeader('Connection', 'keep-alive');\n    \/\/ Taray\u0131c\u0131lar\u0131n ba\u011flant\u0131lar\u0131 otomatik olarak kapatmas\u0131n\u0131 \u00f6nlemek i\u00e7in\n    res.flushHeaders(); \n\n    console.log('Yeni SSE istemcisi ba\u011fland\u0131.');\n\n    \/\/ 2. Olaylar\u0131 Formatlama ve G\u00f6nderme\n    let counter = 0;\n    const intervalId = setInterval(() => {\n        counter++;\n        if (res.writableEnded) { \/\/ Ba\u011flant\u0131 kapanm\u0131\u015fsa durdur\n            console.log('\u0130stemci ba\u011flant\u0131s\u0131 kapand\u0131, setInterval durduruldu.');\n            clearInterval(intervalId);\n            return;\n        }\n\n        \/\/ Genel mesaj g\u00f6nderme\n        res.write(<code>data: Sunucudan genel mesaj ${counter} - ${new Date().toLocaleTimeString()}\\n\\n<\/code>);\n\n        \/\/ \u00d6zel bir olay g\u00f6nderme\n        if (counter % 3 === 0) {\n            res.write(<code>event: notification\\n<\/code>);\n            res.write(<code>data: Yeni bir bildiriminiz var! Counter: ${counter}\\n\\n<\/code>);\n        }\n\n        \/\/ Olay kimli\u011fi ile g\u00f6nderme\n        res.write(<code>id: ${counter}\\n<\/code>);\n        res.write(<code>data: ID&#039;li mesaj: ${counter}\\n\\n<\/code>);\n\n        console.log(<code>Sunucu mesaj g\u00f6nderdi: ${counter}<\/code>);\n\n    }, 3000); \/\/ Her 3 saniyede bir mesaj g\u00f6nder\n\n    \/\/ \u0130stemci ba\u011flant\u0131y\u0131 kapatt\u0131\u011f\u0131nda temizlik yap\n    req.on('close', () => {\n        console.log('\u0130stemci ba\u011flant\u0131y\u0131 kapatt\u0131.');\n        clearInterval(intervalId);\n        res.end(); \/\/ Yan\u0131t\u0131 sonland\u0131r\n    });\n});\n\n\/\/ Ana sayfa veya di\u011fer statik dosyalar i\u00e7in\napp.get('\/', (req, res) => {\n    res.send(<code><!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 Test Sayfas\u0131<\/title>\n            <style>\n                body { font-family: sans-serif; margin: 20px; }\n                div { margin-bottom: 10px; padding: 10px; border: 1px solid #ccc; background-color: #f9f9f9; }\n                .status-indicator { font-weight: bold; }\n            <\/style>\n        <\/head>\n        <body>\n            <h1>Server-Sent Events (SSE) Testi<\/h1>\n            <p>Bu sayfa sunucudan gelen ger\u00e7ek zamanl\u0131 g\u00fcncellemeleri dinlemektedir.<\/p>\n            <div>Ba\u011flant\u0131 Durumu: <span id=\"status\" class=\"status-indicator\">Bekleniyor...<\/span><\/div>\n            <h3>Genel Mesajlar<\/h3>\n            <div id=\"messages\"><\/div>\n            <h3>Bildirimler<\/h3>\n            <div id=\"notifications\"><\/div>\n\n            <script>\n                const eventSource = new EventSource(&#039;\/events&#039;);\n\n                eventSource.onopen = () => {\n                    document.getElementById(&#039;status&#039;).textContent = &#039;A\u00e7\u0131k&#039;;\n                    document.getElementById(&#039;status&#039;).style.color = &#039;green&#039;;\n                };\n\n                eventSource.onmessage = (event) => {\n                    const p = document.createElement(&#039;p&#039;);\n                    p.textContent =<\/code>Genel: ${event.data}<code>;\n                    document.getElementById(&#039;messages&#039;).appendChild(p);\n                };\n\n                eventSource.addEventListener(&#039;notification&#039;, (event) => {\n                    const p = document.createElement(&#039;p&#039;);\n                    p.textContent =<\/code>Bildirim: ${event.data}<code>;\n                    document.getElementById(&#039;notifications&#039;).appendChild(p);\n                });\n\n                eventSource.onerror = (error) => {\n                    console.error(&#039;SSE Error:&#039;, error);\n                    document.getElementById(&#039;status&#039;).textContent = &#039;Hata \/ Kapal\u0131&#039;;\n                    document.getElementById(&#039;status&#039;).style.color = &#039;red&#039;;\n                };\n            <\/script>\n        <\/body>\n        <\/html><\/code>);\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>Bu \u00f6rnekte g\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi, sunucu taraf\u0131nda <code>res.write()<\/code> metodunu kullanarak s\u00fcrekli veri g\u00f6nderiyoruz. <code>setInterval<\/code> kullanarak d\u00fczenli aral\u0131klarla mesajlar g\u00f6nderiyor ve istemci ba\u011flant\u0131y\u0131 kapatt\u0131\u011f\u0131nda <code>req.on('close')<\/code> eventi ile kaynaklar\u0131 temizliyoruz. Bu, SSE'yi uygulamak i\u00e7in gereken temel ad\u0131mlar\u0131 \u00f6zetlemektedir. Bu basitlik, geli\u015ftirme s\u00fcresini k\u0131salt\u0131rken, bir\u00e7ok ger\u00e7ek zamanl\u0131 ihtiya\u00e7 i\u00e7in yeterince g\u00fc\u00e7l\u00fc bir \u00e7\u00f6z\u00fcm sunar.<\/p>\n<h2 id=\"performans-ve-olceklenebilirlik-acisindan-sse-ve-websockets-karsilastirmasi\">Performans ve \u00d6l\u00e7eklenebilirlik A\u00e7\u0131s\u0131ndan SSE ve WebSockets Kar\u015f\u0131la\u015ft\u0131rmas\u0131<\/h2>\n<p>Ger\u00e7ek zamanl\u0131 uygulamalar geli\u015ftirirken, performans ve \u00f6l\u00e7eklenebilirlik her zaman \u00f6ncelikli endi\u015feler aras\u0131nda yer al\u0131r. Server-Sent Events (SSE) ve WebSockets, her ikisi de bu alanlarda \u00f6nemli \u00e7\u00f6z\u00fcmler sunsa da, farkl\u0131 mimarilere ve kullan\u0131m senaryolar\u0131na uygun olduklar\u0131 i\u00e7in performans ve \u00f6l\u00e7eklenebilirlik \u00f6zellikleri de farkl\u0131l\u0131k g\u00f6sterir. Bu iki teknolojiyi kar\u015f\u0131la\u015ft\u0131rmak, projeniz i\u00e7in do\u011fru se\u00e7imi yapman\u0131za yard\u0131mc\u0131 olacakt\u0131r.<\/p>\n<h3 id=\"performans-farkliliklari\">Performans Farkl\u0131l\u0131klar\u0131<\/h3>\n<p><strong>Server-Sent Events (SSE):<\/strong><\/p>\n<ul>\n<li><strong>HTTP Tabanl\u0131l\u0131k:<\/strong> SSE, standart HTTP\/1.1 veya HTTP\/2 protokolleri \u00fczerine in\u015fa edilmi\u015ftir. Bu, mevcut HTTP altyap\u0131s\u0131ndan (proxy'ler, y\u00fck dengeleyiciler, g\u00fcvenlik duvarlar\u0131) do\u011frudan faydalanabilece\u011fi anlam\u0131na gelir. Protokol overhead'i, WebSockets'a g\u00f6re genellikle daha d\u00fc\u015f\u00fckt\u00fcr, \u00f6zellikle tek y\u00f6nl\u00fc ileti\u015fimde.<\/li>\n<li><strong>D\u00fc\u015f\u00fck Ba\u015flang\u0131\u00e7 Maliyeti:<\/strong> Bir SSE ba\u011flant\u0131s\u0131, basit bir HTTP GET iste\u011fiyle ba\u015flar. WebSockets'taki gibi karma\u015f\u0131k bir el s\u0131k\u0131\u015fma (handshake) s\u00fcreci gerektirmez. Bu, ba\u011flant\u0131 kurulum s\u00fcresini k\u0131salt\u0131r ve ba\u015flang\u0131\u00e7ta daha az kaynak t\u00fcketir.<\/li>\n<li><strong>HTTP\/2 ile Sinerji:<\/strong> Modern uygulamalarda HTTP\/2 kullan\u0131m\u0131 giderek yayg\u0131nla\u015fmaktad\u0131r. HTTP\/2, tek bir TCP ba\u011flant\u0131s\u0131 \u00fczerinden birden fazla ak\u0131\u015f\u0131n (multiplexing) e\u015fzamanl\u0131 olarak iletilmesine olanak tan\u0131r. SSE, bu \u00f6zellikten do\u011frudan faydalanabilir. Yani, tek bir sunucudan birden fazla istemciye veya ayn\u0131 istemciye birden fazla farkl\u0131 SSE ak\u0131\u015f\u0131 g\u00f6nderirken, hepsi tek bir a\u011f ba\u011flant\u0131s\u0131 \u00fczerinden verimli bir \u015fekilde iletilir. Bu, a\u011f gecikmesini ve kaynak kullan\u0131m\u0131n\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde azalt\u0131r.<\/li>\n<li><strong>Veri Format\u0131 Basitli\u011fi:<\/strong> SSE'nin veri format\u0131 (<code>data: ...\\n\\n<\/code>) son derece basittir. Bu, verinin ayr\u0131\u015ft\u0131r\u0131lmas\u0131 ve i\u015flenmesi i\u00e7in istemci ve sunucu taraf\u0131nda daha az CPU d\u00f6ng\u00fcs\u00fc gerektirir.<\/li>\n<\/ul>\n<p><strong>WebSockets:<\/strong><\/p>\n<ul>\n<li><strong>\u0130ki Y\u00f6nl\u00fc \u0130leti\u015fim:<\/strong> WebSockets, \u00e7ift y\u00f6nl\u00fc bir ileti\u015fim kanal\u0131 sa\u011flar. Bu, istemcinin sunucuya s\u00fcrekli ve d\u00fc\u015f\u00fck gecikmeli veri g\u00f6ndermesi gereken durumlarda (\u00f6rne\u011fin, online oyunlar, interaktif \u00e7izim uygulamalar\u0131) vazge\u00e7ilmezdir. Ancak, bu \u00e7ift y\u00f6nl\u00fcl\u00fck gereksiz yere karma\u015f\u0131kl\u0131k ve overhead getirebilir.<\/li>\n<li><strong>Daha Y\u00fcksek Ba\u015flang\u0131\u00e7 Maliyeti:<\/strong> Bir WebSocket ba\u011flant\u0131s\u0131, standart HTTP'den WebSocket protokol\u00fcne y\u00fckseltme (upgrade) yapan bir el s\u0131k\u0131\u015fma s\u00fcreciyle ba\u015flar. Bu, SSE'ye g\u00f6re biraz daha fazla ba\u015flang\u0131\u00e7 gecikmesi ve kaynak t\u00fcketimi demektir.<\/li>\n<li><strong>Protokol Overhead:<\/strong> WebSocket protokol\u00fc, \u00e7er\u00e7eveleme (framing) gibi kendi overhead'ine sahiptir. Her mesaj, belirli bir protokol yap\u0131s\u0131 i\u00e7ine al\u0131n\u0131r. Bu, \u00f6zellikle \u00e7ok say\u0131da k\u00fc\u00e7\u00fck mesaj g\u00f6nderildi\u011finde SSE'ye k\u0131yasla daha fazla a\u011f trafi\u011fi anlam\u0131na gelebilir.<\/li>\n<li><strong>HTTP\/2 Multiplexing'den Faydalanamama:<\/strong> WebSockets, HTTP \u00fczerinden y\u00fckseltilse de, bir kez kurulduktan sonra HTTP\/2'nin \u00e7oklama \u00f6zelliklerinden do\u011frudan faydalanmaz. Her WebSocket ba\u011flant\u0131s\u0131, genellikle kendi TCP ba\u011flant\u0131s\u0131n\u0131 kullan\u0131r (HTTP\/1.1 \u00fczerinde). HTTP\/2 ile bile, WebSocket ak\u0131\u015f\u0131 tek bir TCP ba\u011flant\u0131s\u0131 i\u00e7inde olsa da, HTTP\/2'nin ak\u0131\u015f seviyesi \u00e7oklamas\u0131 WebSocket'in i\u00e7 mesaj \u00e7er\u00e7eveleme yap\u0131s\u0131na do\u011frudan uygulanmaz.<\/li>\n<\/ul>\n<h3 id=\"olceklenebilirlik-farkliliklari\">\u00d6l\u00e7eklenebilirlik Farkl\u0131l\u0131klar\u0131<\/h3>\n<p><strong>Server-Sent Events (SSE):<\/strong><\/p>\n<ul>\n<li><strong>HTTP Altyap\u0131s\u0131yla Uyum:<\/strong> SSE, HTTP \u00fczerine in\u015fa edildi\u011fi i\u00e7in, mevcut HTTP y\u00fck dengeleyiciler ve ters proxy'ler (Nginx, HAProxy gibi) ile sorunsuz bir \u015fekilde \u00e7al\u0131\u015f\u0131r. Bu ara\u00e7lar, ba\u011flant\u0131lar\u0131 sunucular aras\u0131nda da\u011f\u0131tma ve oturum y\u00f6netimi konusunda olduk\u00e7a yeteneklidir. \"Sticky sessions\" gibi \u00f6zel konfig\u00fcrasyonlara genellikle gerek kalmaz \u00e7\u00fcnk\u00fc SSE, istemcinin belirli bir sunucuya ba\u011fl\u0131 kalmas\u0131n\u0131 zorunlu k\u0131lmaz (yine de baz\u0131 cache senaryolar\u0131 i\u00e7in faydal\u0131 olabilir).<\/li>\n<li><strong>Stateless Yakla\u015f\u0131m:<\/strong> SSE ba\u011flant\u0131lar\u0131 genellikle sunucu taraf\u0131nda daha az durum (state) bilgisi gerektirir. Bu, yatay \u00f6l\u00e7eklendirmeyi kolayla\u015ft\u0131r\u0131r; yeni sunucular ekleyerek gelen ba\u011flant\u0131 y\u00fck\u00fcn\u00fc da\u011f\u0131tabilirsiniz.<\/li>\n<li><strong>Ba\u011flant\u0131 Ba\u015f\u0131na Daha Az Kaynak:<\/strong> Her SSE ba\u011flant\u0131s\u0131, WebSockets'a g\u00f6re genellikle daha az sunucu kayna\u011f\u0131 (bellek, CPU) t\u00fcketir \u00e7\u00fcnk\u00fc daha basit bir protokold\u00fcr ve \u00e7ift y\u00f6nl\u00fc ileti\u015fim i\u00e7in ekstra mekanizmalar i\u00e7ermez. Bu, ayn\u0131 sunucu \u00fczerinde daha fazla e\u015fzamanl\u0131 ba\u011flant\u0131n\u0131n y\u00f6netilebilece\u011fi anlam\u0131na gelebilir.<\/li>\n<\/ul>\n<p><strong>WebSockets:<\/strong><\/p>\n<ul>\n<li><strong>Durum Y\u00f6netimi Zorlu\u011fu:<\/strong> WebSockets, \u00e7ift y\u00f6nl\u00fc ve kal\u0131c\u0131 ba\u011flant\u0131lar nedeniyle sunucu taraf\u0131nda daha fazla durum bilgisi (hangi istemcinin hangi sunucuya ba\u011fl\u0131 oldu\u011fu, oturum verileri vb.) y\u00f6netmeyi gerektirir. Bu durum, birden fazla sunucuya sahip bir k\u00fcme ortam\u0131nda \u00f6l\u00e7eklendirme yaparken zorluklar yaratabilir. Genellikle, bir istemcinin her zaman ayn\u0131 sunucuya y\u00f6nlendirilmesini sa\u011flayan \"sticky sessions\" ad\u0131 verilen mekanizmalar\u0131n kullan\u0131lmas\u0131 gerekir ki bu da y\u00fck dengeleyicilerin karma\u015f\u0131kl\u0131\u011f\u0131n\u0131 art\u0131r\u0131r.<\/li>\n<li><strong>Daha Fazla Kaynak T\u00fcketimi:<\/strong> Her bir WebSocket ba\u011flant\u0131s\u0131, hem sunucu hem de istemci taraf\u0131nda belirli bir miktar kaynak t\u00fcketir. \u00d6zellikle \u00e7ok say\u0131da e\u015fzamanl\u0131 ba\u011flant\u0131 ve s\u00fcrekli mesaj al\u0131\u015fveri\u015fi oldu\u011funda, bu kaynak t\u00fcketimi \u00f6nemli hale gelebilir.<\/li>\n<li><strong>\u00d6zel Y\u00fck Dengeleyici Konfig\u00fcrasyonlar\u0131:<\/strong> WebSockets'\u0131n y\u00fck dengelemesi, SSE'ye k\u0131yasla daha \u00f6zel konfig\u00fcrasyonlar gerektirebilir. Baz\u0131 y\u00fck dengeleyiciler, WebSocket protokol\u00fcn\u00fc d\u00fczg\u00fcn bir \u015fekilde proxy'lemek veya \"sticky sessions\" y\u00f6netmek i\u00e7in ek ayarlara ihtiya\u00e7 duyar.<\/li>\n<\/ul>\n<p>\u00d6zetle, e\u011fer uygulaman\u0131z\u0131n temel ihtiyac\u0131 sunucudan istemciye tek y\u00f6nl\u00fc veri ak\u0131\u015f\u0131 ise ve istemcinin sunucuya s\u00fcrekli ve d\u00fc\u015f\u00fck gecikmeli veri g\u00f6ndermesi gerekmiyorsa, SSE genellikle daha basit, daha performansl\u0131 ve \u00f6l\u00e7eklendirmesi daha kolay bir \u00e7\u00f6z\u00fcmd\u00fcr. WebSockets ise, ger\u00e7ek \u00e7ift y\u00f6nl\u00fc ve interaktif uygulamalar i\u00e7in vazge\u00e7ilmez bir ara\u00e7 olmaya devam etmektedir. Do\u011fru se\u00e7imi yapmak, uygulaman\u0131z\u0131n gereksinimlerini ve mimari k\u0131s\u0131tlamalar\u0131n\u0131 dikkatlice de\u011ferlendirmeyi gerektirir.<\/p>\n<h2 id=\"sse-kullaniminda-dikkat-edilmesi-gerekenler-ve-ipuclari\">SSE Kullan\u0131m\u0131nda Dikkat Edilmesi Gerekenler ve \u0130pu\u00e7lar\u0131<\/h2>\n<p>Server-Sent Events (SSE), basitli\u011fi ve verimlili\u011fi ile bir\u00e7ok senaryo i\u00e7in ideal bir se\u00e7im olsa da, her teknolojide oldu\u011fu gibi baz\u0131 dikkat edilmesi gereken noktalar\u0131 ve performans ipu\u00e7lar\u0131n\u0131 bar\u0131nd\u0131r\u0131r. Bu b\u00f6l\u00fcmde, SSE kullan\u0131m\u0131n\u0131z\u0131 daha sa\u011flam, g\u00fcvenli ve optimize hale getirecek \u00f6nemli fakt\u00f6rleri ve pratik \u00f6nerileri inceleyece\u011fiz.<\/p>\n<h3 id=\"hata-yonetimi-ve-otomatik-yeniden-baglanti\">Hata Y\u00f6netimi ve Otomatik Yeniden Ba\u011flant\u0131<\/h3>\n<p>SSE'nin en g\u00fczel \u00f6zelliklerinden biri, <code>EventSource<\/code> API'sinin yerle\u015fik otomatik yeniden ba\u011flanma \u00f6zelli\u011fidir. A\u011f ba\u011flant\u0131s\u0131 kesildi\u011finde veya sunucu bir hatayla kar\u015f\u0131la\u015ft\u0131\u011f\u0131nda, taray\u0131c\u0131 belirli bir gecikme s\u00fcresinden sonra otomatik olarak yeniden ba\u011flant\u0131 kurmaya \u00e7al\u0131\u015f\u0131r. Bu gecikme s\u00fcresi, sunucu taraf\u0131ndan <code>retry: [milisaniye]\\n<\/code> komutu ile ayarlanabilir. Bu, uygulamalar\u0131n\u0131z\u0131n a\u011f kesintilerine kar\u015f\u0131 daha dayan\u0131kl\u0131 olmas\u0131n\u0131 sa\u011flar.<\/p>\n<p>Ancak, her hata otomatik yeniden ba\u011flant\u0131 ile \u00e7\u00f6z\u00fclmez. \u00d6rne\u011fin, sunucu taraf\u0131nda bir uygulaman\u0131n tamamen kapanmas\u0131 veya yetkilendirme hatas\u0131 gibi durumlarda, s\u00fcrekli yeniden ba\u011flanma d\u00f6ng\u00fcs\u00fcne girmek yerine, kullan\u0131c\u0131ya bilgi vermek veya farkl\u0131 bir aksiyon almak gerekebilir. Bu nedenle, <code>onerror<\/code> olay dinleyicisini kullanarak hatalar\u0131 uygun \u015fekilde ele almak \u00f6nemlidir. Sunucu taraf\u0131nda ise, bir hata olu\u015ftu\u011funda ba\u011flant\u0131y\u0131 d\u00fczg\u00fcn bir \u015fekilde kapatmak ve istemcinin yeniden ba\u011flanma mant\u0131\u011f\u0131n\u0131 tetiklemek i\u00e7in HTTP durum kodlar\u0131 veya \u00f6zel hata mesajlar\u0131 kullan\u0131labilir.<\/p>\n<h3 id=\"guvenlik-kimlik-dogrulama-ve-yetkilendirme\">G\u00fcvenlik: Kimlik Do\u011frulama ve Yetkilendirme<\/h3>\n<p>SSE ba\u011flant\u0131lar\u0131 da di\u011fer web ileti\u015fimleri gibi g\u00fcvenlik \u00f6nlemlerini gerektirir. Kullan\u0131c\u0131n\u0131n kimli\u011fini do\u011frulamak ve sadece yetkili kullan\u0131c\u0131lar\u0131n olay ak\u0131\u015f\u0131na eri\u015fmesini sa\u011flamak hayati \u00f6nem ta\u015f\u0131r. <code>EventSource<\/code> API'si, do\u011frudan \u00f6zel HTTP ba\u015fl\u0131klar\u0131 (\u00f6rne\u011fin <code>Authorization<\/code> ba\u015fl\u0131\u011f\u0131) eklemeyi desteklemez. Bu nedenle, kimlik do\u011frulama genellikle \u015fu y\u00f6ntemlerle yap\u0131l\u0131r:<\/p>\n<ul>\n<li><strong>URL Parametreleri:<\/strong> Kullan\u0131c\u0131n\u0131n oturum token'\u0131 veya API anahtar\u0131, <code>EventSource<\/code> URL'sine bir sorgu parametresi olarak eklenebilir (<code>\/events?token=abc123<\/code> gibi). Ancak, bu y\u00f6ntem URL'nin proxy sunucular\u0131nda veya taray\u0131c\u0131 ge\u00e7mi\u015finde g\u00f6r\u00fcnebilece\u011fi i\u00e7in hassas veriler i\u00e7in dikkatli kullan\u0131lmal\u0131d\u0131r.<\/li>\n<li><strong>\u00c7erezler (Cookies):<\/strong> E\u011fer oturum bilgileriniz \u00e7erezlerde saklan\u0131yorsa, taray\u0131c\u0131 SSE iste\u011fiyle birlikte otomatik olarak bu \u00e7erezleri g\u00f6nderecektir. Bu, sunucu taraf\u0131nda kullan\u0131c\u0131y\u0131 do\u011frulamak i\u00e7in g\u00fcvenli ve yayg\u0131n bir y\u00f6ntemdir.<\/li>\n<li><strong>Proxy Sunucu Kullan\u0131m\u0131:<\/strong> E\u011fer \u00f6zel ba\u015fl\u0131klar g\u00f6ndermeniz gerekiyorsa, istemci taraf\u0131nda <code>fetch<\/code> API'si ile bir HTTP iste\u011fi yaparak ve daha sonra bu iste\u011fi bir SSE proxy'sine y\u00f6nlendirerek ba\u015fl\u0131klar\u0131 ekleyebilirsiniz. Ancak bu, <code>EventSource<\/code>'un basitli\u011fini biraz karma\u015f\u0131kla\u015ft\u0131r\u0131r.<\/li>\n<\/ul>\n<p>Yetkilendirme ise sunucu taraf\u0131nda, kimli\u011fi do\u011frulanm\u0131\u015f kullan\u0131c\u0131n\u0131n hangi olay ak\u0131\u015flar\u0131na eri\u015febilece\u011fini belirlemekle ilgilidir. Sunucu, gelen iste\u011fin kimlik do\u011frulama bilgilerini kontrol etmeli ve kullan\u0131c\u0131n\u0131n yetkisi yoksa ba\u011flant\u0131y\u0131 kesmelidir.<\/p>\n<h3 id=\"mesaj-formati-ve-veri-islemesi\">Mesaj Format\u0131 ve Veri \u0130\u015flemesi<\/h3>\n<p>SSE varsay\u0131lan olarak metin tabanl\u0131 veriler g\u00f6nderir. Ancak \u00e7o\u011fu modern web uygulamas\u0131 JSON format\u0131n\u0131 tercih eder. Verilerinizi JSON format\u0131nda paketleyerek, istemci taraf\u0131nda kolayca ayr\u0131\u015ft\u0131rabilir ve JavaScript objeleri olarak kullanabilirsiniz:<\/p>\n<pre><code class=\"language-javascript\">\n\/\/ Sunucu taraf\u0131nda (\u00f6rnek)\nconst data = {\n    id: 123,\n    type: 'news',\n    title: 'Yeni Haber Ba\u015fl\u0131\u011f\u0131',\n    content: 'Bu bir deneme haberidir.'\n};\nres.write(<code>data: ${JSON.stringify(data)}\\n\\n<\/code>);\n\n\/\/ \u0130stemci taraf\u0131nda (\u00f6rnek)\neventSource.onmessage = (event) => {\n    try {\n        const message = JSON.parse(event.data);\n        console.log('Al\u0131nan obje:', message);\n        if (message.type === 'news') {\n            \/\/ Haberleri i\u015fleme\n        }\n    } catch (e) {\n        console.error('JSON ayr\u0131\u015ft\u0131rma hatas\u0131:', e);\n    }\n};\n<\/pre>\n<p><\/code><\/p>\n<p>Bu yakla\u015f\u0131m, verilerinizi yap\u0131land\u0131r\u0131lm\u0131\u015f ve kolayca i\u015flenebilir hale getirir.<\/p>\n<h3 id=\"http-2-avantajlari\">HTTP\/2 Avantajlar\u0131<\/h3>\n<p>Yukar\u0131da da bahsedildi\u011fi gibi, SSE'nin HTTP\/2 ile kullan\u0131m\u0131 b\u00fcy\u00fck performans avantajlar\u0131 sa\u011flar. HTTP\/2'nin \u00e7oklama (multiplexing) \u00f6zelli\u011fi, birden fazla SSE ak\u0131\u015f\u0131n\u0131n veya di\u011fer HTTP isteklerinin tek bir TCP ba\u011flant\u0131s\u0131 \u00fczerinden verimli bir \u015fekilde iletilmesine olanak tan\u0131r. Bu, \u00f6zellikle taray\u0131c\u0131n\u0131n ayn\u0131 anda a\u00e7abilece\u011fi maksimum SSE ba\u011flant\u0131 say\u0131s\u0131n\u0131 a\u015fma endi\u015fesini azalt\u0131r (genellikle taray\u0131c\u0131lar ayn\u0131 domain i\u00e7in 6-10 ba\u011flant\u0131 s\u0131n\u0131r\u0131 koyar).<\/p>\n<h3 id=\"mobil-uyumlu-tasarim-ve-performans\">Mobil Uyumlu Tasar\u0131m ve Performans<\/h3>\n<p>SSE kullan\u0131rken, mobil cihazlarda da uygulaman\u0131z\u0131n iyi \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flamak \u00f6nemlidir. Mobil a\u011flar daha karars\u0131z olabilir, bu da <code>EventSource<\/code>'un otomatik yeniden ba\u011flant\u0131 \u00f6zelli\u011finin daha s\u0131k devreye girmesi anlam\u0131na gelebilir. Bu durum, pil t\u00fcketimi \u00fczerinde bir etki yaratabilir. A\u015fa\u011f\u0131daki noktalar\u0131 g\u00f6z \u00f6n\u00fcnde bulundurun:<\/p>\n<ul>\n<li><strong>Ba\u011flant\u0131 Frekans\u0131:<\/strong> Mobil cihazlarda, ekran kapand\u0131\u011f\u0131nda veya uygulama arka plana al\u0131nd\u0131\u011f\u0131nda SSE ba\u011flant\u0131s\u0131n\u0131 ge\u00e7ici olarak duraklatmay\u0131 d\u00fc\u015f\u00fcnebilirsiniz.<\/li>\n<li><strong>Veri Y\u00fck\u00fc:<\/strong> G\u00f6nderdi\u011finiz verinin boyutunu ve s\u0131kl\u0131\u011f\u0131n\u0131 optimize edin. Mobil cihazlarda her KB veri \u00f6nemlidir.<\/li>\n<li><strong>Medya Sorgular\u0131:<\/strong> SSE ile gelen veriyi g\u00f6sterece\u011finiz aray\u00fcz\u00fcn mobil uyumlu oldu\u011fundan emin olun. CSS medya sorgular\u0131, farkl\u0131 ekran boyutlar\u0131na ve cihazlara g\u00f6re d\u00fczeni otomatik olarak ayarlaman\u0131za yard\u0131mc\u0131 olur. \u00d6rne\u011fin:<\/li>\n<\/ul>\n<pre><code class=\"language-css\">\n\/* Genel stil *\/\nbody {\n    font-family: Arial, sans-serif;\n    margin: 20px;\n}\n\n\/* Mobil cihazlar i\u00e7in (ekran geni\u015fli\u011fi 768px'ten az) *\/\n@media (max-width: 768px) {\n    body {\n        margin: 10px;\n        font-size: 14px;\n    }\n    #messages, #notifications {\n        padding: 5px;\n        border: 1px solid #eee;\n    }\n    p {\n        margin-bottom: 5px;\n    }\n}\n\n\/* Tabletler ve daha b\u00fcy\u00fck ekranlar i\u00e7in *\/\n@media (min-width: 769px) {\n    #messages, #notifications {\n        max-width: 800px; \/* Okunabilirli\u011fi art\u0131rmak i\u00e7in maksimum geni\u015flik *\/\n        margin-left: auto;\n        margin-right: auto;\n    }\n}\n<\/pre>\n<p><\/code><\/p>\n<p>Bu CSS kodu, taray\u0131c\u0131 ekran geni\u015fli\u011fine g\u00f6re farkl\u0131 stiller uygulayarak, uygulaman\u0131z\u0131n mobil cihazlarda da iyi bir kullan\u0131c\u0131 deneyimi sunmas\u0131na yard\u0131mc\u0131 olur. Sonu\u00e7 olarak, SSE'nin basitli\u011fi ve sa\u011flaml\u0131\u011f\u0131, onu bir\u00e7ok senaryoda ideal bir se\u00e7im yapsa da, g\u00fcvenlik, hata y\u00f6netimi ve performans optimizasyonlar\u0131 gibi alanlarda dikkatli olmak, uygulaman\u0131z\u0131n uzun \u00f6m\u00fcrl\u00fc ve ba\u015far\u0131l\u0131 olmas\u0131n\u0131 sa\u011flayacakt\u0131r.<\/p>\n<h2 id=\"sonuc-dogru-araci-dogru-is-icin-secmek\">Sonu\u00e7: Do\u011fru Arac\u0131 Do\u011fru \u0130\u015f \u0130\u00e7in Se\u00e7mek<\/h2>\n<p>Modern web geli\u015ftirmenin dinamik d\u00fcnyas\u0131nda, ger\u00e7ek zamanl\u0131 ileti\u015fim yetenekleri, kullan\u0131c\u0131 deneyimini zenginle\u015ftirmenin ve uygulamalar\u0131n etkile\u015fimini art\u0131rman\u0131n anahtar\u0131d\u0131r. Bu ba\u011flamda, WebSockets uzun s\u00fcredir de facto standart olarak kabul edilse de, Server-Sent Events (SSE) gibi alternatiflerin de\u011feri g\u00f6z ard\u0131 edilmemelidir. Bu makale boyunca ele ald\u0131\u011f\u0131m\u0131z gibi, SSE, \u00f6zellikle sunucudan istemciye do\u011fru tek y\u00f6nl\u00fc ve s\u00fcrekli veri ak\u0131\u015f\u0131 gerektiren senaryolar i\u00e7in g\u00fc\u00e7l\u00fc, basit ve son derece verimli bir \u00e7\u00f6z\u00fcmd\u00fcr.<\/p>\n<p>SSE'nin temel avantajlar\u0131, HTTP tabanl\u0131 yap\u0131s\u0131ndan gelir. Bu sayede, mevcut web altyap\u0131s\u0131n\u0131 (y\u00fck dengeleyiciler, proxy'ler, g\u00fcvenlik duvarlar\u0131) do\u011frudan kullanabilir, bu da da\u011f\u0131t\u0131m ve \u00f6l\u00e7eklendirme s\u00fcre\u00e7lerini \u00f6nemli \u00f6l\u00e7\u00fcde basitle\u015ftirir. HTTP\/2'nin \u00e7oklama (multiplexing) \u00f6zelli\u011fiyle birle\u015fti\u011finde, SSE'nin performans\u0131 daha da artar, tek bir TCP ba\u011flant\u0131s\u0131 \u00fczerinden birden fazla olay ak\u0131\u015f\u0131n\u0131 verimli bir \u015fekilde y\u00f6netebilir. \u0130stemci taraf\u0131nda <code>EventSource<\/code> API'sinin basitli\u011fi ve otomatik yeniden ba\u011flant\u0131 gibi yerle\u015fik \u00f6zellikleri, geli\u015ftiriciler i\u00e7in kodlama y\u00fck\u00fcn\u00fc azalt\u0131rken uygulaman\u0131n sa\u011flaml\u0131\u011f\u0131n\u0131 art\u0131r\u0131r.<\/p>\n<p>\u00d6te yandan, WebSockets, ger\u00e7ek zamanl\u0131 \u00e7ift y\u00f6nl\u00fc ileti\u015fim i\u00e7in rakipsizdir. Online oyunlar, canl\u0131 sohbet uygulamalar\u0131 veya i\u015fbirli\u011fine dayal\u0131 d\u00fczenleyiciler gibi hem istemcinin hem de sunucunun birbirine s\u00fcrekli ve d\u00fc\u015f\u00fck gecikmeli veri g\u00f6ndermesi gereken durumlarda WebSockets en uygun \u00e7\u00f6z\u00fcmd\u00fcr. Ancak, bu iki y\u00f6nl\u00fcl\u00fck, beraberinde daha y\u00fcksek bir karma\u015f\u0131kl\u0131k (protokol el s\u0131k\u0131\u015fmas\u0131, durum y\u00f6netimi, \u00f6zel y\u00fck dengeleme konfig\u00fcrasyonlar\u0131) getirir. Bu karma\u015f\u0131kl\u0131k, e\u011fer uygulaman\u0131z\u0131n temel ihtiyac\u0131 sadece sunucudan veri almak ise, gereksiz bir y\u00fck olabilir.<\/p>\n<p>Dolay\u0131s\u0131yla, en \u00f6nemli \u00e7\u0131kar\u0131m, \"do\u011fru arac\u0131 do\u011fru i\u015f i\u00e7in se\u00e7mek\" prensibidir. E\u011fer uygulaman\u0131z\u0131n gereksinimi canl\u0131 spor skorlar\u0131, hisse senedi g\u00fcncellemeleri, anl\u0131k bildirimler, ilerleme \u00e7ubuklar\u0131 veya veri panelleri gibi tek y\u00f6nl\u00fc veri ak\u0131\u015flar\u0131 ise, SSE genellikle daha basit, daha az kaynak t\u00fcketen ve daha kolay \u00f6l\u00e7eklenebilir bir alternatif sunar. WebSockets'\u0131n getirdi\u011fi karma\u015f\u0131kl\u0131ktan ka\u00e7\u0131narak, daha h\u0131zl\u0131 geli\u015ftirme s\u00fcreleri ve daha optimize edilmi\u015f bir altyap\u0131 elde edebilirsiniz. Her iki teknoloji de web'in ger\u00e7ek zamanl\u0131 gelece\u011finde \u00f6nemli bir rol oynamaya devam edecektir. Geli\u015ftiricilerin g\u00f6revi ise, projenin \u00f6zg\u00fcn ihtiya\u00e7lar\u0131n\u0131 ve k\u0131s\u0131tlamalar\u0131n\u0131 dikkatlice de\u011ferlendirerek en uygun \u00e7\u00f6z\u00fcm\u00fc se\u00e7mektir.<\/p>\n<h3 id=\"sikca-sorulan-sorular-sss\">S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<dl>\n<dt><strong>1. Server-Sent Events (SSE) \u00e7ift y\u00f6nl\u00fc (bidirectional) ileti\u015fimi destekler mi?<\/strong><\/dt>\n<dd>Hay\u0131r, Server-Sent Events (SSE) do\u011fas\u0131 gere\u011fi tek y\u00f6nl\u00fc bir ileti\u015fim protokol\u00fcd\u00fcr. Yaln\u0131zca sunucudan istemciye do\u011fru veri ak\u0131\u015f\u0131n\u0131 destekler. \u0130stemcinin sunucuya veri g\u00f6ndermesi gerekti\u011finde ayr\u0131 bir HTTP POST\/GET\/PUT iste\u011fi yapmas\u0131 gerekir. \u00c7ift y\u00f6nl\u00fc ileti\u015fim i\u00e7in WebSockets tercih edilmelidir.<\/dd>\n<dt><strong>2. SSE'nin maksimum e\u015fzamanl\u0131 ba\u011flant\u0131 s\u0131n\u0131r\u0131 var m\u0131d\u0131r?<\/strong><\/dt>\n<dd>Evet, taray\u0131c\u0131lar ayn\u0131 domain i\u00e7in e\u015fzamanl\u0131 SSE ba\u011flant\u0131 say\u0131s\u0131na genellikle bir s\u0131n\u0131r koyar. Bu s\u0131n\u0131r, taray\u0131c\u0131ya g\u00f6re de\u011fi\u015fmekle birlikte genellikle 6 ila 10 ba\u011flant\u0131 civar\u0131ndad\u0131r. Bu, HTTP\/1.1 k\u0131s\u0131tlamas\u0131ndan kaynaklan\u0131r. Ancak HTTP\/2 kullan\u0131ld\u0131\u011f\u0131nda, tek bir TCP ba\u011flant\u0131s\u0131 \u00fczerinden birden fazla SSE ak\u0131\u015f\u0131 multiplexing (\u00e7oklama) yap\u0131larak bu s\u0131n\u0131rlama hafifletilebilir.<\/dd>\n<dt><strong>3. Eski taray\u0131c\u0131lar Server-Sent Events'\u0131 destekler mi?<\/strong><\/dt>\n<dd>Modern taray\u0131c\u0131lar\u0131n (Chrome, Firefox, Safari, Edge) b\u00fcy\u00fck \u00e7o\u011funlu\u011fu SSE'yi do\u011frudan destekler. Ancak Internet Explorer ve baz\u0131 eski taray\u0131c\u0131 s\u00fcr\u00fcmleri i\u00e7in yerel destek bulunmamaktad\u0131r. Bu t\u00fcr eski taray\u0131c\u0131lar\u0131 desteklemeniz gerekiyorsa, SSE'yi sim\u00fcle eden (\u00f6rne\u011fin long-polling kullanarak) polyfill k\u00fct\u00fcphaneleri kullanabilirsiniz.<\/dd>\n<dt><strong>4. SSE ile WebSockets aras\u0131nda ne zaman se\u00e7im yapmal\u0131y\u0131m?<\/strong><\/dt>\n<dd>\n<ul>\n<li><strong>SSE'yi tercih edin:<\/strong> E\u011fer uygulaman\u0131z\u0131n temel ihtiyac\u0131 sunucudan istemciye do\u011fru tek y\u00f6nl\u00fc veri ak\u0131\u015f\u0131 ise (\u00f6rne\u011fin canl\u0131 haber ak\u0131\u015flar\u0131, borsa g\u00fcncellemeleri, bildirimler, ilerleme g\u00f6stergeleri). SSE daha basit bir implementasyona sahiptir ve HTTP altyap\u0131s\u0131yla daha iyi uyum sa\u011flar.<\/li>\n<li><strong>WebSockets'\u0131 tercih edin:<\/strong> E\u011fer uygulaman\u0131zda hem sunucudan istemciye hem de istemciden sunucuya do\u011fru s\u00fcrekli ve d\u00fc\u015f\u00fck gecikmeli veri al\u0131\u015fveri\u015fine ihtiya\u00e7 duyuluyorsa (\u00f6rne\u011fin canl\u0131 sohbet, online oyunlar, interaktif i\u015fbirli\u011fi ara\u00e7lar\u0131).<\/li>\n<\/ul>\n<\/dd>\n<dt><strong>5. SSE \u00fczerinde kimlik do\u011frulama (authentication) ve yetkilendirme (authorization) nas\u0131l yap\u0131l\u0131r?<\/strong><\/dt>\n<dd>SSE'nin <code>EventSource<\/code> API'si do\u011frudan \u00f6zel HTTP ba\u015fl\u0131klar\u0131 (\u00f6rne\u011fin <code>Authorization<\/code>) g\u00f6ndermeyi desteklemez. Kimlik do\u011frulama genellikle \u015fu y\u00f6ntemlerle yap\u0131l\u0131r:<\/p>\n<ul>\n<li><strong>URL Parametreleri:<\/strong> Kullan\u0131c\u0131n\u0131n kimlik do\u011frulama token'\u0131n\u0131 URL sorgu parametresi olarak eklemek (<code>\/events?token=YOUR_TOKEN<\/code>).<\/li>\n<li><strong>\u00c7erezler (Cookies):<\/strong> E\u011fer oturum bilgileriniz \u00e7erezlerde saklan\u0131yorsa, taray\u0131c\u0131 SSE iste\u011fiyle birlikte bu \u00e7erezleri otomatik olarak g\u00f6nderir ve sunucu bu \u00e7erezleri kullanarak kullan\u0131c\u0131y\u0131 do\u011frulayabilir.<\/li>\n<li><strong>Proxy Kullan\u0131m\u0131:<\/strong> \u00d6zel ba\u015fl\u0131klar g\u00f6nderme ihtiyac\u0131n\u0131z varsa, istemci taraf\u0131nda <code>fetch<\/code> API'si ile kimlik do\u011frulamal\u0131 bir HTTP iste\u011fi yaparak bu iste\u011fi bir SSE proxy'sine y\u00f6nlendirebilirsiniz. Yetkilendirme ise sunucu taraf\u0131nda, gelen iste\u011fin do\u011frulanm\u0131\u015f kimli\u011fine g\u00f6re kullan\u0131c\u0131n\u0131n hangi olay ak\u0131\u015flar\u0131na eri\u015febilece\u011fini belirleyerek yap\u0131l\u0131r.<\/li>\n<\/ul>\n<\/dd>\n<\/dl>\n","protected":false},"excerpt":{"rendered":"Ger\u00e7ek zamanl\u0131 uygulamalar geli\u015ftirirken akl\u0131n\u0131za hemen WebSockets mi geliyor? Belki de tek y\u00f6nl\u00fc, sunucudan istemciye veri ak\u0131\u015f\u0131 i\u00e7in&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":[874],"tags":[],"class_list":{"0":"post-33115","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-server","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 Alternatifi: Server-Sent Events ile G\u00fc\u00e7l\u00fc Tek Y\u00f6nl\u00fc \u0130leti\u015fim<\/title>\n<meta name=\"description\" content=\"Ger\u00e7ek zamanl\u0131 uygulamalar geli\u015ftirirken akl\u0131n\u0131za hemen WebSockets mi geliyor? Belki de tek y\u00f6nl\u00fc, sunucudan istemciye veri ak\u0131\u015f\u0131 i\u00e7in daha basit, daha verimli bir \u00e7\u00f6z\u00fcme ihtiyac\u0131n\u0131z vard\u0131r. Server-Sent Events (SSE) tam da bu noktada devreye giriyor.\" \/>\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\/websockets-alternatifi-server-sent-events-ile-guclu-tek-yonlu-iletisim\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"WebSockets Alternatifi: Server-Sent Events ile G\u00fc\u00e7l\u00fc Tek Y\u00f6nl\u00fc \u0130leti\u015fim\" \/>\n<meta property=\"og:description\" content=\"Ger\u00e7ek zamanl\u0131 uygulamalar geli\u015ftirirken akl\u0131n\u0131za hemen WebSockets mi geliyor? Belki de tek y\u00f6nl\u00fc, sunucudan istemciye veri ak\u0131\u015f\u0131 i\u00e7in daha basit, daha verimli bir \u00e7\u00f6z\u00fcme ihtiyac\u0131n\u0131z vard\u0131r. Server-Sent Events (SSE) tam da bu noktada devreye giriyor.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/websockets-alternatifi-server-sent-events-ile-guclu-tek-yonlu-iletisim\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-29T18:31:54+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=\"28 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/websockets-alternatifi-server-sent-events-ile-guclu-tek-yonlu-iletisim\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/websockets-alternatifi-server-sent-events-ile-guclu-tek-yonlu-iletisim\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"WebSockets Alternatifi: Server-Sent Events ile G\u00fc\u00e7l\u00fc Tek Y\u00f6nl\u00fc \u0130leti\u015fim\",\"datePublished\":\"2025-10-29T18:31:54+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/websockets-alternatifi-server-sent-events-ile-guclu-tek-yonlu-iletisim\/\"},\"wordCount\":4989,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Server\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/websockets-alternatifi-server-sent-events-ile-guclu-tek-yonlu-iletisim\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/websockets-alternatifi-server-sent-events-ile-guclu-tek-yonlu-iletisim\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/websockets-alternatifi-server-sent-events-ile-guclu-tek-yonlu-iletisim\/\",\"name\":\"WebSockets Alternatifi: Server-Sent Events ile G\u00fc\u00e7l\u00fc Tek Y\u00f6nl\u00fc \u0130leti\u015fim\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-29T18:31:54+00:00\",\"description\":\"Ger\u00e7ek zamanl\u0131 uygulamalar geli\u015ftirirken akl\u0131n\u0131za hemen WebSockets mi geliyor? Belki de tek y\u00f6nl\u00fc, sunucudan istemciye veri ak\u0131\u015f\u0131 i\u00e7in daha basit, daha verimli bir \u00e7\u00f6z\u00fcme ihtiyac\u0131n\u0131z vard\u0131r. Server-Sent Events (SSE) tam da bu noktada devreye giriyor.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/websockets-alternatifi-server-sent-events-ile-guclu-tek-yonlu-iletisim\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/websockets-alternatifi-server-sent-events-ile-guclu-tek-yonlu-iletisim\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/websockets-alternatifi-server-sent-events-ile-guclu-tek-yonlu-iletisim\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"WebSockets Alternatifi: Server-Sent Events ile G\u00fc\u00e7l\u00fc Tek Y\u00f6nl\u00fc \u0130leti\u015fim\"}]},{\"@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 Alternatifi: Server-Sent Events ile G\u00fc\u00e7l\u00fc Tek Y\u00f6nl\u00fc \u0130leti\u015fim","description":"Ger\u00e7ek zamanl\u0131 uygulamalar geli\u015ftirirken akl\u0131n\u0131za hemen WebSockets mi geliyor? Belki de tek y\u00f6nl\u00fc, sunucudan istemciye veri ak\u0131\u015f\u0131 i\u00e7in daha basit, daha verimli bir \u00e7\u00f6z\u00fcme ihtiyac\u0131n\u0131z vard\u0131r. Server-Sent Events (SSE) tam da bu noktada devreye giriyor.","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\/websockets-alternatifi-server-sent-events-ile-guclu-tek-yonlu-iletisim\/","og_locale":"tr_TR","og_type":"article","og_title":"WebSockets Alternatifi: Server-Sent Events ile G\u00fc\u00e7l\u00fc Tek Y\u00f6nl\u00fc \u0130leti\u015fim","og_description":"Ger\u00e7ek zamanl\u0131 uygulamalar geli\u015ftirirken akl\u0131n\u0131za hemen WebSockets mi geliyor? Belki de tek y\u00f6nl\u00fc, sunucudan istemciye veri ak\u0131\u015f\u0131 i\u00e7in daha basit, daha verimli bir \u00e7\u00f6z\u00fcme ihtiyac\u0131n\u0131z vard\u0131r. Server-Sent Events (SSE) tam da bu noktada devreye giriyor.","og_url":"https:\/\/fatihsoysal.com\/blog\/websockets-alternatifi-server-sent-events-ile-guclu-tek-yonlu-iletisim\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-29T18:31:54+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"28 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/websockets-alternatifi-server-sent-events-ile-guclu-tek-yonlu-iletisim\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/websockets-alternatifi-server-sent-events-ile-guclu-tek-yonlu-iletisim\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"WebSockets Alternatifi: Server-Sent Events ile G\u00fc\u00e7l\u00fc Tek Y\u00f6nl\u00fc \u0130leti\u015fim","datePublished":"2025-10-29T18:31:54+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/websockets-alternatifi-server-sent-events-ile-guclu-tek-yonlu-iletisim\/"},"wordCount":4989,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Server"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/websockets-alternatifi-server-sent-events-ile-guclu-tek-yonlu-iletisim\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/websockets-alternatifi-server-sent-events-ile-guclu-tek-yonlu-iletisim\/","url":"https:\/\/fatihsoysal.com\/blog\/websockets-alternatifi-server-sent-events-ile-guclu-tek-yonlu-iletisim\/","name":"WebSockets Alternatifi: Server-Sent Events ile G\u00fc\u00e7l\u00fc Tek Y\u00f6nl\u00fc \u0130leti\u015fim","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-29T18:31:54+00:00","description":"Ger\u00e7ek zamanl\u0131 uygulamalar geli\u015ftirirken akl\u0131n\u0131za hemen WebSockets mi geliyor? Belki de tek y\u00f6nl\u00fc, sunucudan istemciye veri ak\u0131\u015f\u0131 i\u00e7in daha basit, daha verimli bir \u00e7\u00f6z\u00fcme ihtiyac\u0131n\u0131z vard\u0131r. Server-Sent Events (SSE) tam da bu noktada devreye giriyor.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/websockets-alternatifi-server-sent-events-ile-guclu-tek-yonlu-iletisim\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/websockets-alternatifi-server-sent-events-ile-guclu-tek-yonlu-iletisim\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/websockets-alternatifi-server-sent-events-ile-guclu-tek-yonlu-iletisim\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"WebSockets Alternatifi: Server-Sent Events ile G\u00fc\u00e7l\u00fc Tek Y\u00f6nl\u00fc \u0130leti\u015fim"}]},{"@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\/33115","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=33115"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/33115\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=33115"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=33115"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=33115"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}