{"id":30920,"date":"2025-10-03T12:05:27","date_gmt":"2025-10-03T09:05:27","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/websocketsa-gercekten-ihtiyaciniz-var-mi-sunucu-tarafindan-gonderilen-olaylarin-gucu\/"},"modified":"2025-10-03T12:05:27","modified_gmt":"2025-10-03T09:05:27","slug":"websocketsa-gercekten-ihtiyaciniz-var-mi-sunucu-tarafindan-gonderilen-olaylarin-gucu","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/websocketsa-gercekten-ihtiyaciniz-var-mi-sunucu-tarafindan-gonderilen-olaylarin-gucu\/","title":{"rendered":"WebSockets&#8217;a Ger\u00e7ekten \u0130htiyac\u0131n\u0131z Var M\u0131? Sunucu Taraf\u0131ndan G\u00f6nderilen Olaylar\u0131n G\u00fcc\u00fc"},"content":{"rendered":"<p><body><\/p>\n<style>\n    \/* Basic mobile responsiveness *\/\n    body {\n      font-family: Arial, sans-serif;\n      line-height: 1.6;\n      color: #333;\n      max-width: 1000px;\n      margin: 0 auto;\n      padding: 20px;\n    }\n    h2 {\n      color: #2c3e50;\n      border-bottom: 2px solid #3498db;\n      padding-bottom: 10px;\n      margin-top: 40px;\n      font-size: 2em; \/* Bigger for H2 *\/\n    }\n    h3 {\n      color: #34495e;\n      margin-top: 30px;\n      font-size: 1.5em; \/* Bigger for H3 *\/\n    }\n    pre {\n      background-color: #f4f4f4;\n      padding: 15px;\n      border-left: 4px solid #3498db;\n      overflow-x: auto;\n      margin-bottom: 20px;\n      border-radius: 4px;\n    }\n    code {\n      font-family: 'Courier New', monospace;\n      color: #c0392b;\n    }\n    table {\n      width: 100%;\n      border-collapse: collapse;\n      margin: 20px 0;\n    }\n    th, td {\n      border: 1px solid #ddd;\n      padding: 12px;\n      text-align: left;\n    }\n    th {\n      background-color: #f2f2f2;\n      font-weight: bold;\n    }\n    ul {\n      list-style-type: disc;\n      margin-left: 20px;\n      padding-left: 0;\n    }\n    ol {\n      list-style-type: decimal;\n      margin-left: 20px;\n      padding-left: 0;\n    }\n    li {\n      margin-bottom: 8px;\n    }\n    .uzman-ipucu {\n      background-color: #e8f5e9; \/* Light green *\/\n      border-left: 5px solid #4caf50; \/* Green *\/\n      padding: 15px;\n      margin: 20px 0;\n      font-style: italic;\n      color: #388e3c;\n      border-radius: 4px;\n    }\n    @media (max-width: 768px) {\n      body {\n        padding: 15px;\n      }\n      h2 {\n        font-size: 1.8em;\n      }\n      h3 {\n        font-size: 1.3em;\n      }\n      table, thead, tbody, th, td, tr {\n        display: block;\n      }\n      thead tr {\n        position: absolute;\n        top: -9999px;\n        left: -9999px;\n      }\n      tr { border: 1px solid #ccc; margin-bottom: 10px;}\n      td {\n        border: none;\n        border-bottom: 1px solid #eee;\n        position: relative;\n        padding-left: 50%;\n        text-align: right;\n      }\n      td:before {\n        position: absolute;\n        top: 6px;\n        left: 6px;\n        width: 45%;\n        padding-right: 10px;\n        white-space: nowrap;\n        content: attr(data-label);\n        font-weight: bold;\n        text-align: left;\n      }\n    }\n  <\/style>\n<p>G\u00fcn\u00fcm\u00fcz web uygulamalar\u0131, ger\u00e7ek zamanl\u0131 veri ak\u0131\u015f\u0131 ihtiyac\u0131n\u0131 her ge\u00e7en g\u00fcn daha fazla hissediyor. \u00c7o\u011fu geli\u015ftirici bu noktada hemen WebSockets&#8217;a y\u00f6nelse de, asl\u0131nda tek y\u00f6nl\u00fc ileti\u015fim gerektiren senaryolarda Server-Sent Events (SSE) \u00e7ok daha basit ve etkili bir alternatif sunabilir. Bu makale, WebSockets&#8217;a olan ihtiyac\u0131n\u0131z\u0131 sorgulaman\u0131za yard\u0131mc\u0131 olacak ve SSE&#8217;nin g\u00fcc\u00fcn\u00fc ke\u015ffetmenizi sa\u011flayacak.<\/p>\n<p>Modern web uygulamalar\u0131, kullan\u0131c\u0131lara an\u0131nda ve dinamik i\u00e7erik sunma beklentisiyle \u015fekillenmektedir. Sosyal medya bildirimlerinden canl\u0131 spor skorlar\u0131na, hisse senedi piyasas\u0131 g\u00fcncellemelerinden \u00e7ok kullan\u0131c\u0131l\u0131 i\u015fbirli\u011fi ara\u00e7lar\u0131na kadar bir\u00e7ok alanda, sunucudan istemciye kesintisiz veri ak\u0131\u015f\u0131 hayati bir rol oynamaktad\u0131r. Geleneksel web mimarisi, HTTP&#8217;nin istek-cevap d\u00f6ng\u00fcs\u00fc \u00fczerine kuruludur; yani istemci bir istek g\u00f6nderir, sunucu yan\u0131t verir ve ba\u011flant\u0131 kapan\u0131r. Ancak, bu model, anl\u0131k g\u00fcncellemeler gerektiren senaryolarda yetersiz kalmaktad\u0131r. Kullan\u0131c\u0131lar\u0131n s\u00fcrekli olarak sayfay\u0131 yenilemek zorunda kalmas\u0131 veya sunucunun yeni veri olup olmad\u0131\u011f\u0131n\u0131 anlamak i\u00e7in d\u00fczenli aral\u0131klarla sorgulanmas\u0131 (polling), hem k\u00f6t\u00fc bir kullan\u0131c\u0131 deneyimine yol a\u00e7ar hem de gereksiz a\u011f trafi\u011fi ve sunucu y\u00fck\u00fc olu\u015fturur. Bu durum, daha verimli ve proaktif ileti\u015fim y\u00f6ntemlerinin geli\u015ftirilmesini zorunlu k\u0131lm\u0131\u015ft\u0131r.<\/p>\n<p>Ger\u00e7ek zamanl\u0131 ileti\u015fim, uygulaman\u0131z\u0131n etkile\u015fimini ve yan\u0131t h\u0131z\u0131n\u0131 art\u0131rarak kullan\u0131c\u0131 memnuniyetini \u00f6nemli \u00f6l\u00e7\u00fcde y\u00fckseltir. \u00d6rne\u011fin, bir haber sitesi, son dakika geli\u015fmelerini an\u0131nda ziyaret\u00e7ilerine ula\u015ft\u0131rarak bilgiye eri\u015fim h\u0131z\u0131n\u0131 maksimize eder. Bir g\u00f6sterge paneli uygulamas\u0131 (dashboard), sunucu taraf\u0131ndaki veriler g\u00fcncellendi\u011finde grafiklerini ve istatistiklerini e\u015f zamanl\u0131 olarak yenileyerek karar alma s\u00fcre\u00e7lerini destekler. Bu t\u00fcr senaryolarda, sunucunun istemciye &#8220;bir \u015feyler oldu&#8221; mesaj\u0131n\u0131 g\u00f6ndermesi ve istemcinin de bu mesaj\u0131 alarak uygun tepkiyi vermesi gerekmektedir. \u0130\u015fte bu noktada, Server-Sent Events (SSE) gibi teknolojiler devreye girerek, bu t\u00fcr tek y\u00f6nl\u00fc veri ak\u0131\u015f\u0131n\u0131 kolay, verimli ve standart HTTP protokolleri \u00fczerinde sa\u011flamaktad\u0131r. \u00d6zellikle, istemciden sunucuya anl\u0131k geri bildirim veya yo\u011fun iki y\u00f6nl\u00fc ileti\u015fim ihtiyac\u0131n\u0131n olmad\u0131\u011f\u0131 durumlarda, SSE, WebSockets&#8217;\u0131n getirece\u011fi ek karma\u015f\u0131kl\u0131ktan ka\u00e7\u0131narak m\u00fckemmel bir \u00e7\u00f6z\u00fcm sunar. Bu nedenle, projenizin ger\u00e7ek zamanl\u0131 ileti\u015fim ihtiya\u00e7lar\u0131n\u0131 do\u011fru bir \u015fekilde analiz etmek, performans\u0131 ve geli\u015ftirme kolayl\u0131\u011f\u0131n\u0131 optimize etmek ad\u0131na b\u00fcy\u00fck \u00f6nem ta\u015f\u0131maktad\u0131r.<\/p>\n<h2>Server-Sent Events (SSE) Nedir ve Nas\u0131l \u00c7al\u0131\u015f\u0131r?<\/h2>\n<p>Server-Sent Events (SSE), ad\u0131ndan da anla\u015f\u0131laca\u011f\u0131 \u00fczere, sunucudan istemciye olaylar\u0131n g\u00f6nderildi\u011fi bir ileti\u015fim mekanizmas\u0131d\u0131r. Bu, web taray\u0131c\u0131lar\u0131n\u0131n bir HTTP ba\u011flant\u0131s\u0131 \u00fczerinden sunucudan gelen otomatik g\u00fcncellemeleri almas\u0131n\u0131 sa\u011flayan standart bir web API&#8217;sidir. SSE&#8217;nin temel amac\u0131, sunucudan istemciye do\u011fru, tek y\u00f6nl\u00fc bir veri ak\u0131\u015f\u0131 sa\u011flamakt\u0131r. Yani istemci sadece dinler, sunucu ise diledi\u011fi zaman veri g\u00f6nderir. Bu, anl\u0131k bildirimler, canl\u0131 veri ak\u0131\u015flar\u0131 veya uzun s\u00fcreli i\u015flemlerin ilerlemesini izleme gibi bir\u00e7ok senaryo i\u00e7in ideal bir \u00e7\u00f6z\u00fcmd\u00fcr.<\/p>\n<p>SSE&#8217;nin \u00e7al\u0131\u015fma prensibi olduk\u00e7a basittir ve mevcut HTTP\/1.1 veya HTTP\/2 protokol\u00fc \u00fczerinde \u00e7al\u0131\u015f\u0131r. \u0130stemci (taray\u0131c\u0131), sunucuya \u00f6zel bir HTTP iste\u011fi g\u00f6nderir. Bu iste\u011fin en kritik \u00f6zelli\u011fi, <code>Accept<\/code> ba\u015fl\u0131\u011f\u0131nda <code>text\/event-stream<\/code> MIME t\u00fcr\u00fcn\u00fc belirtmesidir. Bu, taray\u0131c\u0131ya &#8220;Ben bir olay ak\u0131\u015f\u0131 bekliyorum&#8221; mesaj\u0131n\u0131 iletir. Sunucu bu iste\u011fi ald\u0131\u011f\u0131nda, cevab\u0131n <code>Content-Type<\/code> ba\u015fl\u0131\u011f\u0131n\u0131 <code>text\/event-stream<\/code> olarak ayarlar ve ba\u011flant\u0131y\u0131 a\u00e7\u0131k tutar. Sunucu, bu a\u00e7\u0131k ba\u011flant\u0131 \u00fczerinden, belirli bir formatta (genellikle <code>data: [veri]\\n\\n<\/code> \u015feklinde) olaylar\u0131 (event) g\u00f6ndermeye ba\u015flar. Her olay g\u00f6nderildi\u011finde, taray\u0131c\u0131da \u00e7al\u0131\u015fan JavaScript <code>EventSource<\/code> API&#8217;si taraf\u0131ndan otomatik olarak al\u0131n\u0131r ve i\u015flenir. Ba\u011flant\u0131 kesilirse (a\u011f hatas\u0131, sunucu hatas\u0131 vb.), <code>EventSource<\/code> API&#8217;si varsay\u0131lan olarak belirli bir gecikmeyle otomatik olarak yeniden ba\u011flant\u0131 kurmaya \u00e7al\u0131\u015f\u0131r; bu da yerle\u015fik bir dayan\u0131kl\u0131l\u0131k mekanizmas\u0131 sunar.<\/p>\n<h3>Polling ve Long Polling&#8217;e Kar\u015f\u0131 SSE: Neden Daha \u0130yi Bir Se\u00e7enek?<\/h3>\n<p>SSE&#8217;nin avantajlar\u0131n\u0131 daha iyi anlamak i\u00e7in, ger\u00e7ek zamanl\u0131 g\u00fcncellemeler i\u00e7in daha \u00f6nce kullan\u0131lan veya hala kullan\u0131lan alternatif y\u00f6ntemlerle kar\u015f\u0131la\u015ft\u0131rmak faydal\u0131d\u0131r:<\/p>\n<ul>\n<li>\n<h4>Polling (Yoklama):<\/h4>\n<p>Bu y\u00f6ntemde, istemci (taray\u0131c\u0131) sunucuda yeni bir veri olup olmad\u0131\u011f\u0131n\u0131 anlamak i\u00e7in d\u00fczenli aral\u0131klarla (\u00f6rne\u011fin her 5 saniyede bir) sunucuya standart HTTP istekleri g\u00f6nderir. Sunucu, her iste\u011fe yan\u0131t verir, yeni veri olup olmad\u0131\u011f\u0131n\u0131 bildirir ve ba\u011flant\u0131y\u0131 kapat\u0131r. Yeni veri olsa da olmasa da bu d\u00f6ng\u00fc devam eder.<\/p>\n<ul>\n<li><strong>Dezavantajlar\u0131:<\/strong> Yeni veri olmad\u0131\u011f\u0131nda bile gereksiz a\u011f trafi\u011fi ve sunucu y\u00fck\u00fc olu\u015fturur. Y\u00fcksek gecikmeye sahiptir \u00e7\u00fcnk\u00fc g\u00fcncelleme ancak bir sonraki yoklama iste\u011fi g\u00f6nderildi\u011finde al\u0131nabilir. Kullan\u0131c\u0131 deneyimi genellikle kesintilidir.<\/li>\n<\/ul>\n<\/li>\n<li>\n<h4>Long Polling (Uzun Yoklama):<\/h4>\n<p>Polling&#8217;den biraz daha geli\u015fmi\u015f bir y\u00f6ntemdir. \u0130stemci bir HTTP iste\u011fi g\u00f6nderir, ancak sunucu yeni bir veri olana kadar cevab\u0131 bekletir. Yeni veri geldi\u011finde veya belirli bir zaman a\u015f\u0131m\u0131 s\u00fcresi doldu\u011funda, sunucu cevab\u0131 g\u00f6nderir ve ba\u011flant\u0131 kapan\u0131r. \u0130stemci cevab\u0131 ald\u0131ktan veya zaman a\u015f\u0131m\u0131 olu\u015ftuktan hemen sonra yeni bir uzun yoklama iste\u011fi g\u00f6ndererek d\u00f6ng\u00fcy\u00fc s\u00fcrd\u00fcr\u00fcr.<\/p>\n<ul>\n<li><strong>Dezavantajlar\u0131:<\/strong> Polling&#8217;e g\u00f6re daha verimli olsa da, her g\u00fcncelleme i\u00e7in yeni bir HTTP ba\u011flant\u0131s\u0131 kurulur ve kapat\u0131l\u0131r. Bu da hem istemci hem de sunucu taraf\u0131nda ek overhead (ba\u015flang\u0131\u00e7 ve biti\u015f maliyeti) yarat\u0131r. Sunucu taraf\u0131nda her ba\u011flant\u0131 i\u00e7in bir &#8220;bekleyen&#8221; istek tutulmas\u0131 gerekir, bu da kaynak y\u00f6netimi a\u00e7\u0131s\u0131ndan karma\u015f\u0131kl\u0131\u011fa yol a\u00e7abilir.<\/li>\n<\/ul>\n<\/li>\n<li>\n<h4>Server-Sent Events (SSE):<\/h4>\n<p>\u0130stemci bir kez ba\u011flant\u0131 kurar ve bu ba\u011flant\u0131, sunucudan s\u00fcrekli veri ak\u0131\u015f\u0131 i\u00e7in a\u00e7\u0131k kal\u0131r. Sunucu diledi\u011fi zaman, bu a\u00e7\u0131k HTTP ba\u011flant\u0131s\u0131 \u00fczerinden olaylar\u0131 g\u00f6nderebilir. Taray\u0131c\u0131, EventSource API sayesinde bu olaylar\u0131 kolayca i\u015fler.<\/p>\n<ul>\n<li><strong>Avantajlar\u0131:<\/strong> Tek bir HTTP ba\u011flant\u0131s\u0131 \u00fczerinden \u00e7al\u0131\u015f\u0131r, bu da ba\u011flant\u0131 kurulumu ve kapatma maliyetini ortadan kald\u0131r\u0131r. Daha az a\u011f trafi\u011fi ve sunucu y\u00fck\u00fc olu\u015fturur. Taray\u0131c\u0131 taraf\u0131nda yerle\u015fik otomatik yeniden ba\u011flanma mekanizmas\u0131 bulunur, bu da ba\u011flant\u0131 kesintilerinde dayan\u0131kl\u0131l\u0131k sa\u011flar. Standart HTTP protokol\u00fc \u00fczerinde \u00e7al\u0131\u015ft\u0131\u011f\u0131 i\u00e7in mevcut HTTP altyap\u0131s\u0131 (proxy&#8217;ler, g\u00fcvenlik duvarlar\u0131) ile daha uyumludur ve WebSocket&#8217;lere k\u0131yasla daha basittir. \u00d6zellikle HTTP\/2 ile kullan\u0131ld\u0131\u011f\u0131nda, ayn\u0131 TCP ba\u011flant\u0131s\u0131 \u00fczerinden birden fazla SSE ak\u0131\u015f\u0131 y\u00f6netilebilir, bu da performans\u0131 daha da art\u0131r\u0131r.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>\u00d6zetle, SSE, \u00f6zellikle sunucudan istemciye tek y\u00f6nl\u00fc veri ak\u0131\u015f\u0131n\u0131n bask\u0131n oldu\u011fu durumlarda, Polling ve Long Polling gibi eski y\u00f6ntemlere g\u00f6re \u00e7ok daha verimli, basit ve kaynak dostu bir \u00e7\u00f6z\u00fcmd\u00fcr. Geli\u015ftiricilerin daha az \u00e7abayla ger\u00e7ek zamanl\u0131 \u00f6zellikler eklemesine olanak tan\u0131r.<\/p>\n<div class=\"uzman-ipucu\">\n    Uzman \u0130pucu: SSE, HTTP\/2 protokol\u00fc ile birlikte kullan\u0131ld\u0131\u011f\u0131nda daha da verimli hale gelir. HTTP\/2&#8217;nin \u00e7oklama (multiplexing) \u00f6zelli\u011fi sayesinde, ayn\u0131 ba\u011flant\u0131 \u00fczerinden birden fazla SSE ak\u0131\u015f\u0131 y\u00f6netilebilir, bu da ba\u015fl\u0131k y\u00fck\u00fcn\u00fc azalt\u0131r ve performans\u0131 %40&#8217;a kadar art\u0131rabilir.\n  <\/div>\n<h2>SSE Ne Zaman Tercih Edilmelidir: Ger\u00e7ek D\u00fcnya Senaryolar\u0131<\/h2>\n<p>Server-Sent Events, her ne kadar WebSockets kadar kapsaml\u0131 bir iki y\u00f6nl\u00fc ileti\u015fim yetene\u011fi sunmasa da, belirli senaryolarda \u00e7ok daha uygun, hafif ve y\u00f6netilebilir bir \u00e7\u00f6z\u00fcmd\u00fcr. Temel fark, SSE&#8217;nin tamamen sunucudan istemciye tek y\u00f6nl\u00fc veri ak\u0131\u015f\u0131na odaklanmas\u0131d\u0131r. Bu, istemcinin sunucuya anl\u0131k olarak veri g\u00f6ndermesi gerekmedi\u011fi durumlar i\u00e7in onu ideal k\u0131lar. Peki, WebSockets yerine SSE&#8217;yi ne zaman d\u00fc\u015f\u00fcnmelisiniz? \u0130\u015fte baz\u0131 ger\u00e7ek d\u00fcnya senaryolar\u0131 ve vaka analizleri:<\/p>\n<h3>Canl\u0131 Veri Ak\u0131\u015flar\u0131 ve Bildirim Sistemleri: Bir Halka A\u00e7\u0131k \u015eirketin Hisse Senedi Takip Uygulamas\u0131<\/h3>\n<p>Bir finansal platformun hisse senedi takip uygulamas\u0131 geli\u015ftirdi\u011fini d\u00fc\u015f\u00fcnelim. Kullan\u0131c\u0131lar, ilgilendikleri hisse senetlerinin anl\u0131k fiyat de\u011fi\u015fimlerini, i\u015flem hacimlerini ve \u00f6nemli haber ba\u015fl\u0131klar\u0131n\u0131 takip etmek istiyor. Bu senaryoda, sunucu taraf\u0131nda s\u00fcrekli g\u00fcncellenen veriler vard\u0131r ve bu verilerin taray\u0131c\u0131lara an\u0131nda iletilmesi gerekmektedir. Kullan\u0131c\u0131n\u0131n hisse senedi al\u0131m sat\u0131m emri gibi durumlar d\u0131\u015f\u0131nda, taray\u0131c\u0131dan sunucuya s\u00fcrekli bir veri ak\u0131\u015f\u0131 ihtiyac\u0131 yoktur; sadece sunucunun yeni bilgileri istemcilere g\u00f6ndermesi yeterlidir. \u0130\u015fte tam da bu noktada SSE parlar. Her hisse senedi de\u011fi\u015fti\u011finde, sunucu bunu ba\u011fl\u0131 olan t\u00fcm istemcilere bir SSE olay\u0131 olarak g\u00f6nderebilir. Taray\u0131c\u0131lar bu olaylar\u0131 dinleyerek UI&#8217;y\u0131 an\u0131nda g\u00fcnceller. Bu yakla\u015f\u0131m, WebSockets&#8217;\u0131n getirece\u011fi ek y\u00fck (\u00e7ift y\u00f6nl\u00fc ileti\u015fim protokol\u00fc, el s\u0131k\u0131\u015fma maliyeti vb.) olmadan, tam da istenen ger\u00e7ek zamanl\u0131 g\u00fcncellemeyi sa\u011flar. Daha geni\u015f bir perspektiften bak\u0131ld\u0131\u011f\u0131nda, bir e-ticaret sitesindeki &#8220;sepetinize eklenen \u00fcr\u00fcnler&#8221; bildirimleri, bir blogdaki yeni yorum uyar\u0131lar\u0131 veya bir lojistik firmas\u0131n\u0131n kargo takip g\u00fcncellemeleri de SSE ile sorunsuz bir \u015fekilde y\u00f6netilebilir. Sunucu, ilgili bir olay oldu\u011funda do\u011frudan istemcilere bildirim g\u00f6nderebilir, b\u00f6ylece kullan\u0131c\u0131lar her zaman en g\u00fcncel bilgilere eri\u015febilir. Bu durum, \u00f6zellikle y\u00fcksek performansl\u0131 ve d\u00fc\u015f\u00fck gecikmeli bilgi ak\u0131\u015f\u0131n\u0131n kritik oldu\u011fu ancak istemcinin sunucuya s\u00fcrekli veri g\u00f6ndermesinin gerekmedi\u011fi uygulamalar i\u00e7in SSE&#8217;yi bi\u00e7ilmi\u015f kaftan yapar.<\/p>\n<h3>Progress Bar ve Uzun S\u00fcreli \u0130\u015flemlerin Takibi: B\u00fcy\u00fck Bir Veri Raporunun Haz\u0131rlanmas\u0131<\/h3>\n<p>Bir web uygulamas\u0131, kullan\u0131c\u0131lar\u0131n b\u00fcy\u00fck veri k\u00fcmeleri \u00fczerinde karma\u015f\u0131k raporlar olu\u015fturmas\u0131na veya dosya d\u00f6n\u00fc\u015f\u00fcmleri gibi uzun s\u00fcreli arka plan i\u015flemleri ba\u015flatmas\u0131na olanak tan\u0131yor. Bu t\u00fcr i\u015flemlerin tamamlanmas\u0131 dakikalar, hatta daha uzun s\u00fcrebilir. Kullan\u0131c\u0131n\u0131n bu i\u015flemin hangi a\u015famada oldu\u011funu (\u00f6rne\u011fin: &#8220;Veri \u00e7ekiliyor&#8230;&#8221;, &#8220;Analiz ediliyor&#8230;&#8221;, &#8220;PDF olu\u015fturuluyor&#8230;&#8221;, &#8220;%X tamamland\u0131&#8221;) anl\u0131k olarak g\u00f6rmesi, bekleme s\u00fcresini daha katlan\u0131labilir hale getirir ve kullan\u0131c\u0131n\u0131n sabr\u0131n\u0131 art\u0131r\u0131r. Geleneksel HTTP ile bu durumu izlemek i\u00e7in istemcinin s\u00fcrekli sunucuya &#8220;\u0130\u015flem durumu nedir?&#8221; diye sormas\u0131 (polling) gerekirdi ki bu da gereksiz a\u011f trafi\u011fi ve sunucu kaynaklar\u0131n\u0131n israf\u0131na neden olurdu. SSE ile ise, sunucu i\u015flemdeki ilerlemeyi belirten olaylar\u0131 d\u00fczenli aral\u0131klarla istemciye g\u00f6nderebilir. &#8220;Rapor %10 tamamland\u0131&#8221;, &#8220;Rapor %50 tamamland\u0131&#8221;, &#8220;Rapor tamamland\u0131&#8221; gibi mesajlar, istemciye EventSource arac\u0131l\u0131\u011f\u0131yla ula\u015f\u0131r ve progress bar veya durum g\u00f6stergesi anl\u0131k olarak g\u00fcncellenir. Bu, hem sunucu y\u00fck\u00fcn\u00fc azalt\u0131r hem de kullan\u0131c\u0131ya kesintisiz, \u015feffaf ve ak\u0131c\u0131 bir deneyim sunar. Benzer \u015fekilde, bir dosya y\u00fckleme veya indirme i\u015flemi s\u0131ras\u0131nda sunucunun istemciye &#8220;y\u00fczde ka\u00e7 tamamland\u0131&#8221; bilgisini g\u00f6ndermesi, bir derleme i\u015fleminin log ak\u0131\u015f\u0131n\u0131n anl\u0131k olarak g\u00f6sterilmesi veya bir yapay zeka modelinin e\u011fitim s\u00fcrecinin izlenmesi gibi senaryolar da SSE&#8217;nin g\u00fc\u00e7l\u00fc y\u00f6nlerini ortaya koyar. Bu kullan\u0131m alanlar\u0131, SSE&#8217;nin basitli\u011fi ve etkinli\u011fi sayesinde geli\u015ftirme maliyetlerini d\u00fc\u015f\u00fcr\u00fcrken, kullan\u0131c\u0131 deneyimini \u00f6nemli \u00f6l\u00e7\u00fcde iyile\u015ftirebilece\u011fini kan\u0131tlar.<\/p>\n<p>\u00d6zetle, SSE, a\u015fa\u011f\u0131daki durumlarda WebSockets&#8217;a g\u00fc\u00e7l\u00fc bir alternatiftir:<\/p>\n<ul>\n<li>Sunucudan istemciye tek y\u00f6nl\u00fc, s\u00fcrekli veri ak\u0131\u015f\u0131 gerekti\u011finde.<\/li>\n<li>\u0130stemcinin sunucuya anl\u0131k olarak veri g\u00f6nderme ihtiyac\u0131 nadir veya hi\u00e7 olmad\u0131\u011f\u0131nda.<\/li>\n<li>Uygulaman\u0131n basitlik ve mevcut HTTP altyap\u0131s\u0131yla entegrasyonu \u00f6ncelikli oldu\u011funda.<\/li>\n<li>Ger\u00e7ek zamanl\u0131 bildirimler, canl\u0131 skorlar, log ak\u0131\u015flar\u0131, hisse senedi g\u00fcncellemeleri gibi senaryolarda.<\/li>\n<\/ul>\n<p>Bu senaryolar, SSE&#8217;nin WebSockets&#8217;a g\u00f6re daha az karma\u015f\u0131kl\u0131k, daha az kaynak t\u00fcketimi ve daha kolay hata ay\u0131klama avantajlar\u0131 sundu\u011funu a\u00e7\u0131k\u00e7a g\u00f6stermektedir. Bu nedenle, projenizin gereksinimlerini dikkatlice analiz ederek do\u011fru arac\u0131 se\u00e7mek, uzun vadede \u00f6nemli faydalar sa\u011flayacakt\u0131r.<\/p>\n<h2>SSE ile \u0130lk Ad\u0131mlar: Basit Bir Uygulama Nas\u0131l Yap\u0131l\u0131r?<\/h2>\n<p>Server-Sent Events (SSE) teknolojisini anlaman\u0131n ve g\u00fcc\u00fcn\u00fc kavraman\u0131n en etkili yolu, onu ger\u00e7ek bir \u00f6rnek \u00fczerinde deneyimlemektir. Bu b\u00f6l\u00fcmde, hem sunucu hem de istemci taraf\u0131nda basit bir SSE uygulamas\u0131 olu\u015fturarak, ad\u0131m ad\u0131m kurulum ve i\u015fleyi\u015fi ele alaca\u011f\u0131z. Amac\u0131m\u0131z, sunucudan belirli aral\u0131klarla otomatik mesajlar g\u00f6nderen ve bu mesajlar\u0131 bir web sayfas\u0131nda ger\u00e7ek zamanl\u0131 olarak g\u00f6r\u00fcnt\u00fcleyen temel bir yap\u0131 kurmakt\u0131r. Bu \u00f6rnek, SSE&#8217;nin ne kadar kolay entegre edilebildi\u011fini ve minimum \u00e7abayla nas\u0131l ger\u00e7ek zamanl\u0131 \u00f6zellikler sa\u011flayabildi\u011fini g\u00f6zler \u00f6n\u00fcne serecektir.<\/p>\n<h3>Sunucu Taraf\u0131 Kurulumu: Node.js ile Bir Event Stream Olu\u015fturma<\/h3>\n<p>SSE ba\u011flant\u0131s\u0131 kurmak i\u00e7in sunucunuzun belirli HTTP ba\u015fl\u0131klar\u0131n\u0131 do\u011fru bir \u015fekilde ayarlamas\u0131 ve veri ak\u0131\u015f\u0131n\u0131 \u00f6zel bir SSE format\u0131nda g\u00f6ndermesi gerekmektedir. A\u015fa\u011f\u0131daki \u00f6rnekte, pop\u00fcler bir JavaScript \u00e7al\u0131\u015fma zaman\u0131 olan Node.js ve Express.js web \u00e7er\u00e7evesini kullanarak basit bir SSE sunucusu olu\u015fturaca\u011f\u0131z. \u0130lk olarak, projenizi ba\u015flat\u0131n ve Express&#8217;i kurun:<\/p>\n<pre><code class=\"language-bash\">\nmkdir sse-example\ncd sse-example\nnpm init -y\nnpm install express\n  <\/pre>\n<p><\/code><\/p>\n<p>\u015eimdi <code>server.js<\/code> ad\u0131nda bir dosya olu\u015fturun ve i\u00e7ine a\u015fa\u011f\u0131daki kodu ekleyin:<\/p>\n<pre><code class=\"language-javascript\">\nconst express = require('express');\nconst app = express();\nconst PORT = 3000;\n\n\/\/ 'public' klas\u00f6r\u00fcndeki statik dosyalar\u0131 (HTML, CSS, JS) servis etmek i\u00e7in\napp.use(express.static('public'));\n\napp.get('\/events', (req, res) => {\n  \/\/ 1. SSE i\u00e7in gerekli HTTP ba\u015fl\u0131klar\u0131n\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 politikas\u0131: Her kaynaktan eri\u015fime izin ver\n\n  \/\/ \u0130stemciye \u00f6zel bir 'id' atayabiliriz, bu genellikle yeniden ba\u011flant\u0131da son al\u0131nan olay\u0131n takibi i\u00e7in kullan\u0131l\u0131r.\n  \/\/ const clientId = Date.now();\n  \/\/ console.log(<code>Yeni SSE istemcisi ba\u011fland\u0131: ${clientId}<\/code>);\n\n  let counter = 0;\n  const intervalId = setInterval(() => {\n    \/\/ 2. Belirli aral\u0131klarla yeni olay g\u00f6nder\n    if (counter >= 10) {\n      \/\/ \u00d6rne\u011fin, 10 olay g\u00f6nderdikten sonra ba\u011flant\u0131y\u0131 kapatabiliriz\n      res.write('event: end\\n'); \/\/ \u00d6zel bir 'end' olay\u0131 tan\u0131mla\n      res.write('data: {\"message\": \"Ba\u011flant\u0131 kapat\u0131l\u0131yor.\", \"status\": \"closed\"}\\n\\n'); \/\/ JSON format\u0131nda veri\n      clearInterval(intervalId); \/\/ Interval'i durdur\n      res.end(); \/\/ Ba\u011flant\u0131y\u0131 sonland\u0131r\n      console.log('SSE ba\u011flant\u0131s\u0131 10 olaydan sonra sunucu taraf\u0131ndan kapat\u0131ld\u0131.');\n      return;\n    }\n\n    counter++;\n    const data = { message: <code>Sunucudan gelen mesaj ${counter}<\/code>, timestamp: new Date().toISOString() };\n\n    \/\/ 3. Veriyi SSE format\u0131nda g\u00f6nder: \"data: [veri]\\n\\n\"\n    \/\/ \u0130ste\u011fe ba\u011fl\u0131 olarak, farkl\u0131 olay t\u00fcrlerini belirtmek i\u00e7in 'event:' anahtar kelimesi kullan\u0131labilir.\n    \/\/ Varsay\u0131lan olarak 'message' olay\u0131 tetiklenir.\n    res.write(<code>data: ${JSON.stringify(data)}\\n\\n<\/code>); \/\/ JSON verisini string'e \u00e7evirip g\u00f6nder\n    console.log(<code>G\u00f6nderilen SSE olay\u0131: ${JSON.stringify(data)}<\/code>);\n  }, 2000); \/\/ Her 2 saniyede bir olay g\u00f6nder\n\n  \/\/ 4. \u0130stemci ba\u011flant\u0131s\u0131 kapand\u0131\u011f\u0131nda kaynaklar\u0131 temizle\n  req.on('close', () => {\n    console.log('\u0130stemci ba\u011flant\u0131s\u0131 kapand\u0131. Interval temizleniyor.');\n    clearInterval(intervalId); \/\/ Interval'i durdur\n    res.end(); \/\/ Ba\u011flant\u0131y\u0131 g\u00fcvenli bir \u015fekilde sonland\u0131r\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 \u00f6ne \u00e7\u0131kan \u00f6nemli noktalar \u015funlard\u0131r:<\/p>\n<ul>\n<li><code>res.setHeader('Content-Type', 'text\/event-stream');<\/code>: Bu ba\u015fl\u0131k, taray\u0131c\u0131ya gelen veri ak\u0131\u015f\u0131n\u0131n bir Server-Sent Event ak\u0131\u015f\u0131 oldu\u011funu bildirir. Taray\u0131c\u0131, bu ba\u015fl\u0131\u011f\u0131 g\u00f6rd\u00fc\u011f\u00fcnde otomatik olarak <code>EventSource<\/code> API'sini kullanmaya ba\u015flar.<\/li>\n<li><code>res.setHeader('Cache-Control', 'no-cache');<\/code> ve <code>res.setHeader('Connection', 'keep-alive');<\/code>: Bu ba\u015fl\u0131klar, taray\u0131c\u0131n\u0131n veriyi \u00f6nbelle\u011fe almamas\u0131n\u0131 ve ba\u011flant\u0131n\u0131n a\u00e7\u0131k kalmas\u0131n\u0131 sa\u011flar.<\/li>\n<li><code>data: [veri]\\n\\n<\/code>: Sunucudan olaylar\u0131 g\u00f6ndermek i\u00e7in kullan\u0131lan standart SSE format\u0131d\u0131r. Her veri sat\u0131r\u0131 <code>data:<\/code> ile ba\u015flar ve bir \u00e7ift yeni sat\u0131r karakteri (<code>\\n\\n<\/code>) ile sonland\u0131r\u0131lmal\u0131d\u0131r. JSON format\u0131nda veri g\u00f6ndermek, karma\u015f\u0131k bilgileri aktarman\u0131n yayg\u0131n ve etkili bir yoludur.<\/li>\n<li><code>event: [event_ad\u0131]\\n<\/code>: \u0130ste\u011fe ba\u011fl\u0131 olarak, farkl\u0131 olay t\u00fcrlerini belirlemek i\u00e7in kullan\u0131labilir. \u0130stemci taraf\u0131nda bu olay ad\u0131yla belirli bir dinleyici kaydedebilirsiniz (\u00f6rne\u011fin <code>source.addEventListener('end', ...)<\/code>).<\/li>\n<li><code>res.end()<\/code>: Sunucu taraf\u0131ndan SSE ba\u011flant\u0131s\u0131n\u0131 g\u00fcvenli bir \u015fekilde kapatmak i\u00e7in kullan\u0131l\u0131r.<\/li>\n<li><code>req.on('close', ...)<\/code>: \u0130stemcinin taray\u0131c\u0131y\u0131 kapatmas\u0131 veya ba\u011flant\u0131y\u0131 kesmesi durumunda sunucudaki <code>setInterval<\/code> gibi kaynaklar\u0131 temizlemek kritik \u00f6neme sahiptir. Bu, sunucunun gereksiz kaynak t\u00fcketmesini engeller.<\/li>\n<\/ul>\n<h3>\u0130stemci Taraf\u0131 Entegrasyonu: EventSource API Kullan\u0131m\u0131<\/h3>\n<p>Taray\u0131c\u0131 taraf\u0131nda SSE ak\u0131\u015f\u0131n\u0131 dinlemek ve gelen olaylar\u0131 i\u015flemek i\u00e7in JavaScript'in yerle\u015fik <code>EventSource<\/code> API'sini kullan\u0131r\u0131z. Bu API, sunucuyla ba\u011flant\u0131 kurma, olaylar\u0131 ayr\u0131\u015ft\u0131rma ve ba\u011flant\u0131 kesildi\u011finde otomatik olarak yeniden ba\u011flanma gibi i\u015flemleri bizim i\u00e7in otomatik olarak y\u00f6netir. <code>public\/index.html<\/code> ad\u0131nda bir dosya olu\u015fturun ve i\u00e7ine a\u015fa\u011f\u0131daki HTML ve JavaScript kodunu ekleyin:<\/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>Server-Sent Events (SSE) \u00d6rne\u011fi<\/title>\n    <style>\n        body { font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; margin: 20px; background-color: #f4f7f6; color: #333; }\n        .container { max-width: 800px; margin: 0 auto; background-color: #fff; padding: 30px; border-radius: 8px; box-shadow: 0 4px 12px rgba(0,0,0,0.05); }\n        h2 { color: #2c3e50; text-align: center; margin-bottom: 25px; }\n        p { text-align: center; color: #666; margin-bottom: 30px; }\n        #messages {\n            border: 1px solid #e0e0e0;\n            padding: 15px;\n            min-height: 200px;\n            max-height: 400px;\n            overflow-y: auto;\n            background-color: #fafafa;\n            border-radius: 6px;\n            box-shadow: inset 0 1px 3px rgba(0,0,0,0.05);\n        }\n        .message-item {\n            margin-bottom: 10px;\n            padding: 8px 12px;\n            border-bottom: 1px solid #eee;\n            color: #555;\n            font-size: 0.95em;\n        }\n        .message-item:last-child { border-bottom: none; margin-bottom: 0; }\n        .system-message { color: #007bff; font-weight: bold; }\n        .error-message { color: #dc3545; font-weight: bold; }\n        .timestamp { float: right; color: #999; font-size: 0.85em; }\n    <\/style>\n<\/head>\n<body>\n    <div class=\"container\">\n        <h2>Sunucu Taraf\u0131ndan G\u00f6nderilen Olaylar (SSE) Uygulamas\u0131<\/h2>\n        <p>Sunucudan gelen ger\u00e7ek zamanl\u0131 mesajlar a\u015fa\u011f\u0131da otomatik olarak g\u00f6sterilecektir.<\/p>\n        <div id=\"messages\">\n            <div class=\"message-item system-message\">Ba\u011flant\u0131 bekleniyor...<\/div>\n        <\/div>\n    <\/div>\n\n    <script>\n        const messagesDiv = document.getElementById('messages');\n\n        \/\/ EventSource objesi ile sunucuya SSE ba\u011flant\u0131s\u0131 kur\n        const source = new EventSource('http:\/\/localhost:3000\/events');\n\n        \/\/ 'message' olay\u0131: Sunucudan g\u00f6nderilen ve belirli bir 'event:' tipi olmayan varsay\u0131lan olaylard\u0131r.\n        source.onmessage = function(event) {\n            try {\n                const data = JSON.parse(event.data); \/\/ Gelen veriyi JSON olarak ayr\u0131\u015ft\u0131r\n                const messageElement = document.createElement('div');\n                messageElement.className = 'message-item';\n                messageElement.innerHTML = <code><span>${data.message}<\/span> <span class=\"timestamp\">${new Date(data.timestamp).toLocaleTimeString()}<\/span><\/code>;\n                messagesDiv.appendChild(messageElement);\n                messagesDiv.scrollTop = messagesDiv.scrollHeight; \/\/ Mesaj kutusunu en alta kayd\u0131r\n                console.log('Al\u0131nan varsay\u0131lan mesaj:', data);\n            } catch (e) {\n                console.error('JSON ayr\u0131\u015ft\u0131rma hatas\u0131:', e, 'Gelen veri:', event.data);\n                const messageElement = document.createElement('div');\n                messageElement.className = 'message-item error-message';\n                messageElement.textContent = <code>[Hata] Sunucudan hatal\u0131 veri geldi: ${event.data.substring(0, 100)}...<\/code>;\n                messagesDiv.appendChild(messageElement);\n            }\n        };\n\n        \/\/ Belirli bir olay t\u00fcr\u00fcn\u00fc dinlemek i\u00e7in addEventListener kullan\u0131n.\n        \/\/ Sunucu taraf\u0131nda 'event: end\\n' olarak g\u00f6nderdi\u011fimiz olay\u0131 dinliyoruz.\n        source.addEventListener('end', function(event) {\n            const data = JSON.parse(event.data);\n            const messageElement = document.createElement('div');\n            messageElement.className = 'message-item system-message';\n            messageElement.innerHTML = <code><span>[Sunucu] ${data.message}<\/span> <span class=\"timestamp\">${new Date().toLocaleTimeString()}<\/span><\/code>;\n            messagesDiv.appendChild(messageElement);\n            messagesDiv.scrollTop = messagesDiv.scrollHeight;\n            console.log('Ba\u011flant\u0131 sonland\u0131rma olay\u0131:', data.message);\n            source.close(); \/\/ Bu olay al\u0131nd\u0131\u011f\u0131nda EventSource ba\u011flant\u0131s\u0131n\u0131 kapat\n        });\n\n        \/\/ Ba\u011flant\u0131 a\u00e7\u0131ld\u0131\u011f\u0131nda tetiklenir\n        source.onopen = function(event) {\n            const messageElement = document.createElement('div');\n            messageElement.className = 'message-item system-message';\n            messageElement.innerHTML = <code><span>[Sistem] SSE ba\u011flant\u0131s\u0131 ba\u015far\u0131yla a\u00e7\u0131ld\u0131.<\/span> <span class=\"timestamp\">${new Date().toLocaleTimeString()}<\/span><\/code>;\n            messagesDiv.appendChild(messageElement);\n            messagesDiv.scrollTop = messagesDiv.scrollHeight;\n            console.log('SSE ba\u011flant\u0131s\u0131 a\u00e7\u0131ld\u0131.');\n        };\n\n        \/\/ Hata durumunda veya ba\u011flant\u0131 kesildi\u011finde tetiklenir\n        source.onerror = function(event) {\n            const messageElement = document.createElement('div');\n            messageElement.className = 'message-item error-message';\n            let errorMessage = '[Hata] SSE ba\u011flant\u0131s\u0131nda bir sorun olu\u015ftu.';\n            if (event.readyState === EventSource.CLOSED) {\n                errorMessage += ' (Ba\u011flant\u0131 kapand\u0131, otomatik yeniden ba\u011flanma denenecek.)';\n            } else if (event.readyState === EventSource.CONNECTING) {\n                errorMessage += ' (Yeniden ba\u011flan\u0131l\u0131yor...)';\n            }\n            messageElement.innerHTML = <code><span>${errorMessage}<\/span> <span class=\"timestamp\">${new Date().toLocaleTimeString()}<\/span><\/code>;\n            messagesDiv.appendChild(messageElement);\n            messagesDiv.scrollTop = messagesDiv.scrollHeight;\n            console.error('SSE hatas\u0131:', event);\n        };\n    <\/script>\n<\/body>\n<\/html>\n  <\/pre>\n<p><\/code><\/p>\n<p>Bu istemci taraf\u0131 kodu, a\u015fa\u011f\u0131daki anahtar i\u015flevleri yerine getirir:<\/p>\n<ul>\n<li><code>new EventSource('http:\/\/localhost:3000\/events')<\/code>: Sunucuya bir SSE ba\u011flant\u0131s\u0131 kurar. <code>EventSource<\/code> nesnesi, t\u00fcm ba\u011flant\u0131 y\u00f6netimini (ba\u015flatma, hata durumunda yeniden ba\u011flanma) otomatik olarak \u00fcstlenir.<\/li>\n<li><code>source.onmessage<\/code>: Bu olay dinleyicisi, sunucudan <code>event:<\/code> anahtar kelimesi belirtilmeden g\u00f6nderilen t\u00fcm olaylar\u0131 yakalar. Genellikle bu, ana veri ak\u0131\u015f\u0131n\u0131 i\u015flemek i\u00e7in kullan\u0131l\u0131r. Gelen <code>event.data<\/code> string'ini <code>JSON.parse()<\/code> ile ayr\u0131\u015ft\u0131rarak mesaj i\u00e7eri\u011fine ula\u015f\u0131l\u0131r.<\/li>\n<li><code>source.addEventListener('end', ...)<\/code>: Bu y\u00f6ntem, sunucudan <code>event: end\\n<\/code> \u015feklinde g\u00f6nderilen \u00f6zel olaylar\u0131 dinlemek i\u00e7in kullan\u0131l\u0131r. Bu, farkl\u0131 olay t\u00fcrleri i\u00e7in \u00f6zel i\u015fleyiciler tan\u0131mlaman\u0131za olanak tan\u0131r.<\/li>\n<li><code>source.onopen<\/code>: SSE ba\u011flant\u0131s\u0131 ba\u015far\u0131yla kuruldu\u011funda tetiklenir. Kullan\u0131c\u0131ya ba\u011flant\u0131 durumunu bildirmek i\u00e7in kullan\u0131\u015fl\u0131d\u0131r.<\/li>\n<li><code>source.onerror<\/code>: Ba\u011flant\u0131 hatas\u0131 olu\u015ftu\u011funda tetiklenir (\u00f6rne\u011fin a\u011f kesintisi, sunucu taraf\u0131nda hata). Bu olay, ba\u011flant\u0131n\u0131n kapal\u0131 olup olmad\u0131\u011f\u0131n\u0131 (<code>event.readyState === EventSource.CLOSED<\/code>) veya yeniden ba\u011flanma denemesi yap\u0131l\u0131p yap\u0131lmad\u0131\u011f\u0131n\u0131 anlamak i\u00e7in kontrol edilebilir. EventSource API'si otomatik yeniden ba\u011flanmay\u0131 deneyecektir.<\/li>\n<li><code>messagesDiv.scrollTop = messagesDiv.scrollHeight;<\/code>: Yeni mesajlar eklendi\u011finde mesaj kutusunu otomatik olarak en alta kayd\u0131rmak i\u00e7in kullan\u0131l\u0131r, b\u00f6ylece kullan\u0131c\u0131 her zaman en g\u00fcncel mesaj\u0131 g\u00f6r\u00fcr.<\/li>\n<\/ul>\n<p>Bu basit \u00f6rnek, SSE'nin ne kadar az kodla g\u00fc\u00e7l\u00fc bir ger\u00e7ek zamanl\u0131 ileti\u015fim yetene\u011fi sundu\u011funu a\u00e7\u0131k\u00e7a g\u00f6stermektedir. Hem sunucu hem de istemci taraf\u0131nda, nispeten az yap\u0131land\u0131rma ile dinamik ve g\u00fcncel i\u00e7erik sunabilirsiniz. Bu basitlik, bir\u00e7ok ger\u00e7ek zamanl\u0131 ihtiyac\u0131n\u0131z i\u00e7in SSE'yi olduk\u00e7a cazip bir se\u00e7enek haline getirir.<\/p>\n<h2>WebSockets ile Kar\u015f\u0131la\u015ft\u0131rma: Farklar ve Se\u00e7im Kriterleri<\/h2>\n<p>Server-Sent Events (SSE) ve WebSockets, her ikisi de web'de ger\u00e7ek zamanl\u0131 ileti\u015fim sa\u011flamak i\u00e7in kullan\u0131lan g\u00fc\u00e7l\u00fc teknolojilerdir, ancak farkl\u0131 mimarilere, kullan\u0131m senaryolar\u0131na ve temel yeteneklere sahiptirler. Do\u011fru teknolojiyi se\u00e7mek, uygulaman\u0131z\u0131n performans\u0131n\u0131, \u00f6l\u00e7eklenebilirli\u011fini, geli\u015ftirme karma\u015f\u0131kl\u0131\u011f\u0131n\u0131 ve kaynak t\u00fcketimini \u00f6nemli \u00f6l\u00e7\u00fcde etkiler. Bu nedenle, projenizin spesifik gereksinimlerini dikkatlice de\u011ferlendirmek kritik \u00f6neme sahiptir. \u0130\u015fte iki teknoloji aras\u0131ndaki ana farklar ve do\u011fru se\u00e7imi yapman\u0131za yard\u0131mc\u0131 olacak kriterler:<\/p>\n<h3>Tek Y\u00f6nl\u00fc m\u00fc, \u00c7ift Y\u00f6nl\u00fc m\u00fc? \u0130leti\u015fim Modelinin \u00d6nemi<\/h3>\n<p>Bu, iki teknoloji aras\u0131ndaki en temel ve belirleyici farkt\u0131r:<\/p>\n<ul>\n<li><strong>Server-Sent Events (SSE):<\/strong> Sunucudan istemciye *tek y\u00f6nl\u00fc* bir veri ak\u0131\u015f\u0131 sa\u011flar. \u0130stemci sadece sunucudan veri dinleyebilir ve sunucuya SSE ba\u011flant\u0131s\u0131 \u00fczerinden anl\u0131k veri g\u00f6nderemez. Elbette, istemci normal HTTP istekleri g\u00f6ndererek sunucuyla ileti\u015fim kurabilir, ancak bu SSE ak\u0131\u015f\u0131n\u0131n bir par\u00e7as\u0131 de\u011fildir. Bu ileti\u015fim modeli, bildirimler, canl\u0131 spor skorlar\u0131, hisse senedi g\u00fcncellemeleri, log ak\u0131\u015flar\u0131, i\u015flem ilerlemesi g\u00f6stergeleri gibi senaryolar i\u00e7in m\u00fckemmeldir; yani istemcinin s\u00fcrekli olarak bilgiye ihtiyac\u0131 oldu\u011fu, ancak kendi taraf\u0131nda anl\u0131k veri g\u00f6nderme gereksiniminin nadir veya hi\u00e7 olmad\u0131\u011f\u0131 durumlar. SSE'nin bu basitli\u011fi, daha az karma\u015f\u0131kl\u0131k ve daha kolay hata ay\u0131klama avantajlar\u0131 sunar.<\/li>\n<li><strong>WebSockets:<\/strong> \u0130stemci ve sunucu aras\u0131nda *\u00e7ift y\u00f6nl\u00fc*, tam-duplex (e\u015f zamanl\u0131 veri g\u00f6nderip alabilen) bir ileti\u015fim kanal\u0131 sa\u011flar. Ba\u011flant\u0131 bir kez kurulduktan sonra, her iki taraf da diledi\u011fi zaman ve ba\u011f\u0131ms\u0131z olarak veri g\u00f6nderebilir ve alabilir. Bu \u00f6zellik, ger\u00e7ek zamanl\u0131 sohbet uygulamalar\u0131, \u00e7ok oyunculu oyunlar, interaktif beyaz tahtalar, canl\u0131 i\u015fbirli\u011fi ara\u00e7lar\u0131 gibi istemcinin de anl\u0131k geri bildirim veya yo\u011fun veri g\u00f6ndermesi gereken durumlar i\u00e7in vazge\u00e7ilmezdir. WebSockets, daha d\u00fc\u015f\u00fck gecikme s\u00fcresi ve daha y\u00fcksek verimlilik sunabilir, \u00e7\u00fcnk\u00fc her iki y\u00f6nde de veri paketleri g\u00f6nderilebilir.<\/li>\n<\/ul>\n<p>Uygulaman\u0131z\u0131n temel i\u015flevselli\u011fi, hangi ileti\u015fim modelinin daha uygun oldu\u011funu belirleyecektir. E\u011fer uygulaman\u0131z\u0131n b\u00fcy\u00fck \u00e7o\u011funlu\u011fu sunucudan gelen g\u00fcncellemelerden ibaretse ve istemciden sunucuya g\u00f6nderilen mesajlar nadir veya standart HTTP istekleriyle (POST, PUT vb.) y\u00f6netilebilir ise, SSE daha basit ve etkili bir \u00e7\u00f6z\u00fcm sunar. Aksi takdirde, yani istemci ve sunucu aras\u0131nda yo\u011fun ve anl\u0131k \u00e7ift y\u00f6nl\u00fc etkile\u015fim gerekiyorsa, WebSockets ka\u00e7\u0131n\u0131lmaz bir se\u00e7enektir.<\/p>\n<h3>Protokol ve Karma\u015f\u0131kl\u0131k: HTTP\/2 Avantajlar\u0131<\/h3>\n<p>Her iki teknoloji de farkl\u0131 protokoller \u00fczerinde \u00e7al\u0131\u015f\u0131r ve bu, kurulum ve y\u00f6netim karma\u015f\u0131kl\u0131klar\u0131n\u0131 etkiler:<\/p>\n<ul>\n<li><strong>SSE:<\/strong> Mevcut HTTP\/1.1 veya HTTP\/2 protokol\u00fc \u00fczerinde \u00e7al\u0131\u015f\u0131r. Bu, standart HTTP sunucular\u0131, proxy'ler ve g\u00fcvenlik duvarlar\u0131 ile tam uyumlu oldu\u011fu anlam\u0131na gelir. HTTP\/2 ile kullan\u0131ld\u0131\u011f\u0131nda, tek bir TCP ba\u011flant\u0131s\u0131 \u00fczerinden birden fazla SSE ak\u0131\u015f\u0131 multiplex (\u00e7oklan\u0131r) edilebilir, bu da ba\u015fl\u0131k y\u00fck\u00fcn\u00fc azalt\u0131r ve performans\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131r\u0131r. SSE, HTTP'nin do\u011fal hata i\u015fleme (\u00f6rne\u011fin <code>EventSource<\/code>'un otomatik yeniden ba\u011flanma \u00f6zelli\u011fi) ve yeniden ba\u011flant\u0131 mekanizmalar\u0131ndan faydalan\u0131r. Bu, geli\u015ftiriciler i\u00e7in genellikle daha az karma\u015f\u0131kl\u0131k, daha az ek yap\u0131land\u0131rma ve daha kolay hata ay\u0131klama anlam\u0131na gelir. Var olan HTTP altyap\u0131n\u0131za kolayca entegre edilebilir.<\/li>\n<li><strong>WebSockets:<\/strong> Kendi \u00f6zel WebSocket protokol\u00fcn\u00fc (<code>ws:\/\/<\/code> veya <code>wss:\/\/<\/code>) kullan\u0131r. Bu protokol, bir HTTP y\u00fckseltme iste\u011fi (HTTP Upgrade request) ile ba\u015flar, ard\u0131ndan kal\u0131c\u0131 bir TCP ba\u011flant\u0131s\u0131 \u00fczerinden ikili (binary) veya metin tabanl\u0131 (text-based) \u00e7er\u00e7eveler (frames) g\u00f6nderilir. Bu, daha d\u00fc\u015f\u00fck gecikme ve daha y\u00fcksek verimlilik sa\u011flayabilir ancak standart HTTP altyap\u0131s\u0131yla entegrasyonu bazen daha karma\u015f\u0131k olabilir. \u00d6zellikle eski proxy'ler ve g\u00fcvenlik duvarlar\u0131 WebSocket ba\u011flant\u0131lar\u0131n\u0131 farkl\u0131 \u015fekilde i\u015fleyebilir veya hi\u00e7 desteklemeyebilir, bu da ek yap\u0131land\u0131rmalar gerektirebilir. WebSocket sunucular\u0131 genellikle \u00f6zel olarak tasarlan\u0131r ve bazen ek k\u00fct\u00fcphanelere veya sunucu mod\u00fcllerine ihtiya\u00e7 duyulur.<\/li>\n<\/ul>\n<p>SSE'nin HTTP \u00fczerinde \u00e7al\u0131\u015fmas\u0131, \u00e7o\u011fu web geli\u015ftiricisi i\u00e7in tan\u0131d\u0131k bir zeminde kalmak anlam\u0131na gelirken, WebSockets daha farkl\u0131 bir protokol y\u0131\u011f\u0131n\u0131 ve potansiyel olarak daha karma\u015f\u0131k bir altyap\u0131 y\u00f6netimi gerektirebilir.<\/p>\n<h3>Taray\u0131c\u0131 Uyumlulu\u011fu, Veri Format\u0131 ve \u00d6l\u00e7eklenebilirlik<\/h3>\n<p>Bu iki teknoloji aras\u0131nda karar verirken g\u00f6z \u00f6n\u00fcnde bulundurman\u0131z gereken di\u011fer kritik fakt\u00f6rlerdir:<\/p>\n<ul>\n<li><strong>SSE:<\/strong>\n<ul>\n<li><strong>Taray\u0131c\u0131 Uyumlulu\u011fu:<\/strong> Modern taray\u0131c\u0131lar\u0131n \u00e7o\u011fu (Chrome, Firefox, Safari, Edge) <code>EventSource<\/code> API'sini geni\u015f \u00f6l\u00e7\u00fcde destekler. Internet Explorer deste\u011fi olmasa da, yayg\u0131n olarak kullan\u0131lan polyfill k\u00fct\u00fcphaneleri ile bu sorun a\u015f\u0131labilir.<\/li>\n<li><strong>Veri Format\u0131:<\/strong> Yaln\u0131zca UTF-8 metin tabanl\u0131 veri g\u00f6nderebilir. Genellikle JSON format\u0131nda veriler string'e d\u00f6n\u00fc\u015ft\u00fcr\u00fclerek g\u00f6nderilir. \u0130kili veri (resim, video vb.) g\u00f6ndermek istiyorsan\u0131z uygun de\u011fildir.<\/li>\n<li><strong>\u00d6l\u00e7eklenebilirlik:<\/strong> Her SSE ba\u011flant\u0131s\u0131 sunucuda a\u00e7\u0131k bir HTTP ba\u011flant\u0131s\u0131n\u0131 temsil eder. Bu, \u00e7ok say\u0131da e\u015fzamanl\u0131 ba\u011flant\u0131da sunucu kaynaklar\u0131n\u0131 (\u00f6zellikle dosya tan\u0131mlay\u0131c\u0131lar\u0131) etkileyebilir. Ancak, iyi tasarlanm\u0131\u015f bir mimari, HTTP\/2 kullan\u0131m\u0131, y\u00fck dengeleyicilerle \"sticky sessions\" (ayn\u0131 istemcinin her zaman ayn\u0131 sunucuya y\u00f6nlendirilmesi) ve mesaj kuyruklar\u0131 (Redis Pub\/Sub, Kafka gibi) ile SSE uygulamalar\u0131 olduk\u00e7a \u00f6l\u00e7eklenebilir hale getirilebilir.<\/li>\n<\/ul>\n<\/li>\n<li><strong>WebSockets:<\/strong>\n<ul>\n<li><strong>Taray\u0131c\u0131 Uyumlulu\u011fu:<\/strong> SSE'ye benzer \u015fekilde modern taray\u0131c\u0131larda geni\u015f deste\u011fe sahiptir.<\/li>\n<li><strong>Veri Format\u0131:<\/strong> Hem metin tabanl\u0131 (UTF-8) hem de ikili (binary) veri g\u00f6nderebilir. Bu, dosya transferi veya oyunlar gibi ikili veri gerektiren uygulamalar i\u00e7in b\u00fcy\u00fck bir avantajd\u0131r.<\/li>\n<li><strong>\u00d6l\u00e7eklenebilirlik:<\/strong> WebSocket sunucular\u0131 da a\u00e7\u0131k ba\u011flant\u0131lar\u0131 y\u00f6netmek zorundad\u0131r. \u00c7ift y\u00f6nl\u00fc yap\u0131s\u0131 ve daha d\u00fc\u015f\u00fck protokol y\u00fck\u00fc sayesinde, anl\u0131k ve yo\u011fun \u00e7ift y\u00f6nl\u00fc ileti\u015fim i\u00e7in daha optimize edilebilir. WebSocket sunucular\u0131 genellikle \u00f6zel olarak tasarlan\u0131r ve \u00e7oklu sunucular aras\u0131nda y\u00fck dengeleme genellikle daha karma\u015f\u0131kt\u0131r; burada da \"sticky sessions\" bir gereksinim olabilir.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\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 data-label=\"\u0130leti\u015fim Y\u00f6n\u00fc\">\u0130leti\u015fim Y\u00f6n\u00fc<\/td>\n<td data-label=\"Server-Sent Events (SSE)\">Tek y\u00f6nl\u00fc (Sunucudan istemciye)<\/td>\n<td data-label=\"WebSockets\">\u00c7ift y\u00f6nl\u00fc (\u0130stemci <-> Sunucu)<\/td>\n<\/tr>\n<tr>\n<td data-label=\"Protokol\">Protokol<\/td>\n<td data-label=\"Server-Sent Events (SSE)\">Standart HTTP\/1.1 veya HTTP\/2 \u00fczerinde<\/td>\n<td data-label=\"WebSockets\">Kendi \u00f6zel WebSocket protokol\u00fc (WS\/WSS)<\/td>\n<\/tr>\n<tr>\n<td data-label=\"Karma\u015f\u0131kl\u0131k\">Karma\u015f\u0131kl\u0131k<\/td>\n<td data-label=\"Server-Sent Events (SSE)\">Daha basit API, mevcut HTTP altyap\u0131s\u0131yla uyumlu<\/td>\n<td data-label=\"WebSockets\">Daha karma\u015f\u0131k, \u00f6zel sunucu\/altyap\u0131 gerektirebilir<\/td>\n<\/tr>\n<tr>\n<td data-label=\"Veri Format\u0131\">Veri Format\u0131<\/td>\n<td data-label=\"Server-Sent Events (SSE)\">Sadece UTF-8 metin tabanl\u0131 (genellikle JSON)<\/td>\n<td data-label=\"WebSockets\">Metin veya ikili (binary) veri<\/td>\n<\/tr>\n<tr>\n<td data-label=\"Otomatik Yeniden Ba\u011flant\u0131\">Otomatik Yeniden Ba\u011flant\u0131<\/td>\n<td data-label=\"Server-Sent Events (SSE)\">Yerle\u015fik taray\u0131c\u0131 deste\u011fi (EventSource API)<\/td>\n<td data-label=\"WebSockets\">Manuel olarak ele al\u0131nmal\u0131 veya k\u00fct\u00fcphane kullan\u0131lmal\u0131<\/td>\n<\/tr>\n<tr>\n<td data-label=\"Kullan\u0131m Alanlar\u0131\">Kullan\u0131m Alanlar\u0131<\/td>\n<td data-label=\"Server-Sent Events (SSE)\">Bildirimler, canl\u0131 skorlar, log ak\u0131\u015flar\u0131, hisse senedi takibi, uzun i\u015flem takibi<\/td>\n<td data-label=\"WebSockets\">Sohbet uygulamalar\u0131, \u00e7ok oyunculu oyunlar, ger\u00e7ek zamanl\u0131 i\u015fbirli\u011fi ara\u00e7lar\u0131, uzaktan kontrol<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Sonu\u00e7 olarak, uygulaman\u0131z\u0131n temel ihtiya\u00e7lar\u0131n\u0131 derinlemesine anlamak, hangi teknolojiyi se\u00e7ece\u011finiz konusunda size yol g\u00f6sterecektir. E\u011fer sadece sunucudan istemciye bilgi ak\u0131\u015f\u0131 sa\u011fl\u0131yorsan\u0131z ve istemciden sunucuya anl\u0131k geri bildirim ihtiyac\u0131n\u0131z yoksa, SSE genellikle daha basit, daha hafif ve daha y\u00f6netilebilir bir \u00e7\u00f6z\u00fcmd\u00fcr. Ancak, tam \u00e7ift y\u00f6nl\u00fc, d\u00fc\u015f\u00fck gecikmeli ve y\u00fcksek performansl\u0131 bir ileti\u015fim kanal\u0131 gerekiyorsa, WebSockets daha uygun bir se\u00e7enektir. Her iki teknolojinin de kendine \u00f6zg\u00fc g\u00fc\u00e7l\u00fc y\u00f6nleri ve kullan\u0131m alanlar\u0131 bulunmaktad\u0131r ve do\u011fru ara\u00e7 se\u00e7imi, projenizin ba\u015far\u0131s\u0131n\u0131 do\u011frudan etkileyecektir.<\/p>\n<h2>Geli\u015fmi\u015f SSE Kullan\u0131m\u0131: G\u00fcvenlik, Hata Y\u00f6netimi ve \u00d6l\u00e7eklenebilirlik \u0130pu\u00e7lar\u0131<\/h2>\n<p>Server-Sent Events (SSE) temel olarak basit ve kullan\u0131\u015fl\u0131 bir teknoloji olsa da, \u00fcretim ortam\u0131nda kullan\u0131rken baz\u0131 geli\u015fmi\u015f konular\u0131 g\u00f6z \u00f6n\u00fcnde bulundurmak uygulaman\u0131z\u0131n sa\u011flaml\u0131\u011f\u0131n\u0131, g\u00fcvenli\u011fini ve performans\u0131n\u0131 art\u0131racakt\u0131r. G\u00fcvenlik, ba\u011flant\u0131 kesintileriyle ba\u015fa \u00e7\u0131kma ve y\u00fcksek y\u00fck alt\u0131nda sistemi \u00f6l\u00e7eklendirme gibi konular, her ger\u00e7ek zamanl\u0131 uygulamada oldu\u011fu gibi SSE i\u00e7in de hayati \u00f6neme sahiptir. Bu b\u00f6l\u00fcmde, SSE uygulamalar\u0131n\u0131z\u0131 daha diren\u00e7li ve verimli hale getirmek i\u00e7in baz\u0131 ileri d\u00fczey ipu\u00e7lar\u0131 ve en iyi uygulamalar\u0131 ele alaca\u011f\u0131z.<\/p>\n<h3>G\u00fcvenlik \u00d6nlemleri: Kimlik Do\u011frulama ve Yetkilendirme<\/h3>\n<p>SSE ba\u011flant\u0131lar\u0131 da di\u011fer HTTP ba\u011flant\u0131lar\u0131 gibi g\u00fcvenli olmal\u0131d\u0131r. G\u00fcvenli\u011fi sa\u011flamak i\u00e7in a\u015fa\u011f\u0131daki ad\u0131mlar\u0131 izlemek kritik \u00f6neme sahiptir:<\/p>\n<ul>\n<li><strong>HTTPS Kullan\u0131m\u0131:<\/strong> T\u00fcm ger\u00e7ek zamanl\u0131 ileti\u015fimlerde oldu\u011fu gibi, SSE ba\u011flant\u0131lar\u0131n\u0131z\u0131 da mutlaka HTTPS \u00fczerinden kurmal\u0131s\u0131n\u0131z. Bu, verilerin \u015fifrelenmesini sa\u011flar ve man-in-the-middle (ortadaki adam) sald\u0131r\u0131lar\u0131na kar\u015f\u0131 koruma sa\u011flar. HTTPS kullan\u0131m\u0131, sadece SSE i\u00e7in de\u011fil, t\u00fcm web uygulaman\u0131z i\u00e7in bir standart olmal\u0131d\u0131r.<\/li>\n<li><strong>Kimlik Do\u011frulama (Authentication) ve Yetkilendirme (Authorization):<\/strong> SSE endpoint'inize eri\u015fen her kullan\u0131c\u0131n\u0131n kimli\u011fini do\u011frulamak ve yetkisini kontrol etmek, hassas verilerin yanl\u0131\u015f ki\u015filere ula\u015fmas\u0131n\u0131 engellemek a\u00e7\u0131s\u0131ndan hayati \u00f6neme sahiptir.\n<ul>\n<li><strong>Token Bazl\u0131 Kimlik Do\u011frulama:<\/strong> En yayg\u0131n ve \u00f6nerilen y\u00f6ntemlerden biridir. \u0130stemci, bir JWT (JSON Web Token) veya benzeri bir kimlik do\u011frulama token\u0131n\u0131 SSE iste\u011fiyle birlikte g\u00f6nderebilir. <code>EventSource<\/code> API'si do\u011frudan \u00f6zel HTTP ba\u015fl\u0131klar\u0131 eklemeye izin vermedi\u011fi i\u00e7in, bu token genellikle URL parametresi olarak g\u00f6nderilir. Sunucu bu token\u0131 do\u011frulayarak kullan\u0131c\u0131n\u0131n oturum a\u00e7m\u0131\u015f ve yetkili olup olmad\u0131\u011f\u0131n\u0131 kontrol eder. E\u011fer token ge\u00e7ersizse, sunucu 401 Unauthorized yan\u0131t\u0131 d\u00f6nebilir ve ba\u011flant\u0131y\u0131 reddedebilir.<\/li>\n<pre><code class=\"language-javascript\">\n\/\/ \u0130stemci taraf\u0131 (token'\u0131 URL'ye ekleme)\nconst authToken = localStorage.getItem('jwt_token'); \/\/ Kullan\u0131c\u0131n\u0131n oturum a\u00e7t\u0131ktan sonra ald\u0131\u011f\u0131 token\nif (authToken) {\n    const source = new EventSource(<code>\/events?auth_token=${authToken}<\/code>);\n    \/\/ ... olay dinleyicileri\n} else {\n    console.warn('Kimlik do\u011frulama token\u0131 bulunamad\u0131. SSE ba\u011flant\u0131s\u0131 kurulamad\u0131.');\n    \/\/ Kullan\u0131c\u0131y\u0131 oturum a\u00e7maya y\u00f6nlendir veya bir hata mesaj\u0131 g\u00f6ster\n}\n\n\/\/ Sunucu taraf\u0131 (Node.js Express \u00f6rne\u011fi)\napp.get('\/events', (req, res) => {\n  const token = req.query.auth_token;\n  if (!token || !isValidJwt(token)) { \/\/ isValidJwt kendi do\u011frulama fonksiyonunuz olmal\u0131\n    res.status(401).send('Unauthorized: Ge\u00e7ersiz veya eksik token.');\n    return;\n  }\n  \/\/ Token ge\u00e7erliyse, kullan\u0131c\u0131ya \u00f6zel olay ak\u0131\u015f\u0131n\u0131 ba\u015flat\n  \/\/ ... SSE olaylar\u0131n\u0131 g\u00f6nder\n});\n        <\/pre>\n<p><\/code><\/p>\n<li><strong>Session \u00c7erezleri:<\/strong> E\u011fer oturum y\u00f6netimi i\u00e7in \u00e7erezler kullan\u0131yorsan\u0131z, taray\u0131c\u0131 SSE iste\u011fini g\u00f6nderdi\u011finde bu \u00e7erezler otomatik olarak dahil edilecektir (ayn\u0131 k\u00f6kene sahip isteklerde). Sunucu bu \u00e7erezler arac\u0131l\u0131\u011f\u0131yla kullan\u0131c\u0131 oturumunu do\u011frulayabilir ve yetkilendirme kontrolleri yapabilir.<\/li>\n<\/ul>\n<\/li>\n<li><strong>CORS Politikalar\u0131:<\/strong> E\u011fer SSE sunucunuz ve istemciniz farkl\u0131 domain'lerde veya portlarda bar\u0131nd\u0131r\u0131l\u0131yorsa (ki bu \u00fcretimde olduk\u00e7a yayg\u0131nd\u0131r), sunucunuzda uygun CORS (Cross-Origin Resource Sharing) ba\u015fl\u0131klar\u0131n\u0131 ayarlaman\u0131z gerekir. Aksi takdirde, taray\u0131c\u0131 g\u00fcvenlik politikalar\u0131 nedeniyle ba\u011flant\u0131y\u0131 engelleyecektir. \u00d6rne\u011fin: <code>Access-Control-Allow-Origin: https:\/\/yourfrontend.com<\/code> veya geli\u015ftirme ortam\u0131nda <code>*<\/code> (t\u00fcm kaynaklara izin ver).<\/li>\n<\/ul>\n<h3>Hata Y\u00f6netimi ve Yeniden Ba\u011flanma Stratejileri<\/h3>\n<p>SSE'nin yerle\u015fik otomatik yeniden ba\u011flanma \u00f6zelli\u011fi b\u00fcy\u00fck bir avantajd\u0131r, ancak bu durumu daha da iyile\u015ftirebilir ve daha kullan\u0131c\u0131 dostu hale getirebiliriz:<\/p>\n<ul>\n<li><strong><code>EventSource.onerror<\/code> \u0130zleme:<\/strong> Bu olay dinleyicisi, ba\u011flant\u0131 kesintileri, a\u011f hatalar\u0131 veya sunucu taraf\u0131nda olu\u015fan hatalar gibi durumlarda tetiklenir. Burada kullan\u0131c\u0131ya uygun geri bildirim sa\u011flayabilir (\u00f6rne\u011fin \"Ba\u011flant\u0131 kesildi, yeniden ba\u011flan\u0131l\u0131yor...\") veya hata loglar\u0131n\u0131za kaydedebilirsiniz. <code>EventSource<\/code> API'si, ba\u011flant\u0131 kesildi\u011finde varsay\u0131lan olarak \u00fcstel bir geri say\u0131m (exponential backoff) ile otomatik olarak yeniden ba\u011flanmaya \u00e7al\u0131\u015f\u0131r, bu da sunucuya a\u015f\u0131r\u0131 y\u00fck bindirmeyi engeller.<\/li>\n<li><strong><code>retry<\/code> Alan\u0131:<\/strong> Sunucu, g\u00f6nderdi\u011fi her SSE olay\u0131n\u0131n ba\u015f\u0131na <code>retry: [milisaniye]\\n<\/code> ekleyerek istemcinin yeniden ba\u011flanma s\u00fcresini kontrol edebilir. Bu, a\u011f ko\u015fullar\u0131na, sunucu y\u00fck\u00fcne veya belirli olay t\u00fcrlerine g\u00f6re dinamik olarak ayarlanabilir. \u00d6rne\u011fin, sunucu yo\u011funsa yeniden deneme s\u00fcresini art\u0131rarak istemci say\u0131s\u0131n\u0131 bir miktar azaltabilirsiniz.<\/li>\n<pre><code class=\"language-javascript\">\n\/\/ Sunucu taraf\u0131\nres.write('retry: 10000\\n'); \/\/ 10 saniye sonra yeniden ba\u011flanmay\u0131 dene\nres.write('data: {\"status\": \"heartbeat\", \"time\": \"'+new Date().toISOString()+'\"}\\n\\n');\n    <\/pre>\n<p><\/code><\/p>\n<li><strong>\u0130stemci Taraf\u0131ndan Manuel Yeniden Ba\u011flanma ve Durum Kontrol\u00fc:<\/strong> Genellikle <code>EventSource<\/code> API'si otomatik yeniden ba\u011flanmay\u0131 iyi y\u00f6netir. Ancak, baz\u0131 \u00f6zel durumlarda (\u00f6rne\u011fin, sunucudan belirli bir \"ba\u011flant\u0131y\u0131 kapat ve yeniden ba\u015fla\" mesaj\u0131 geldi\u011finde) kendiniz <code>EventSource.close()<\/code> \u00e7a\u011f\u0131r\u0131p yeni bir <code>EventSource<\/code> \u00f6rne\u011fi olu\u015fturarak yeniden ba\u011flant\u0131y\u0131 tetikleyebilirsiniz. Ayr\u0131ca, uygulaman\u0131z\u0131n kullan\u0131c\u0131 aray\u00fcz\u00fcnde ba\u011flant\u0131 durumunu (ba\u011fl\u0131, ba\u011flan\u0131yor, ba\u011flant\u0131 kesildi) g\u00f6stermek, kullan\u0131c\u0131 deneyimini \u00f6nemli \u00f6l\u00e7\u00fcde iyile\u015ftirir.<\/li>\n<\/ul>\n<h3>\u00d6l\u00e7eklenebilirlik Stratejileri<\/h3>\n<p>Y\u00fcksek say\u0131da e\u015fzamanl\u0131 SSE ba\u011flant\u0131s\u0131n\u0131 y\u00f6netmek, sunucu kaynaklar\u0131 \u00fczerinde bask\u0131 olu\u015fturabilir. \u0130\u015fte baz\u0131 \u00f6l\u00e7eklenebilirlik ipu\u00e7lar\u0131:<\/p>\n<ul>\n<li><strong>\u00c7ok \u00c7ekirdekli CPU Kullan\u0131m\u0131:<\/strong> Node.js gibi tek i\u015f par\u00e7ac\u0131kl\u0131 dillerde, cluster mod\u00fcl\u00fc veya PM2 gibi s\u00fcre\u00e7 y\u00f6neticileri kullanarak uygulaman\u0131z\u0131 birden fazla CPU \u00e7ekirde\u011finde \u00e7al\u0131\u015ft\u0131rmak, ayn\u0131 anda daha fazla ba\u011flant\u0131 i\u015flemenizi sa\u011flar ve sunucu kaynaklar\u0131n\u0131 daha etkin kullan\u0131r.<\/li>\n<li><strong>Y\u00fck Dengeleyiciler ve Sticky Sessions:<\/strong> Birden fazla SSE sunucunuz varsa, bir y\u00fck dengeleyici (Nginx, HAProxy, AWS ELB vb.) kullanman\u0131z gerekir. Ancak, SSE ba\u011flant\u0131s\u0131 kal\u0131c\u0131 oldu\u011fu i\u00e7in, ayn\u0131 istemcinin her zaman ayn\u0131 sunucuya y\u00f6nlendirilmesini sa\u011flayan \"sticky sessions\" (oturum kal\u0131c\u0131l\u0131\u011f\u0131) yap\u0131land\u0131rman\u0131z \u00f6nemlidir. Aksi takdirde, istemci her yeniden ba\u011fland\u0131\u011f\u0131nda farkl\u0131 bir sunucuya d\u00fc\u015febilir ve olay ak\u0131\u015f\u0131 kesintiye u\u011frayabilir veya veri tutars\u0131zl\u0131\u011f\u0131 ya\u015fanabilir.<\/li>\n<li><strong>Mesaj Kuyruklar\u0131 \/ Pub\/Sub Sistemleri:<\/strong> Birden fazla SSE sunucusuna sahip oldu\u011funuzda, olaylar\u0131n tutarl\u0131 bir \u015fekilde t\u00fcm ilgili istemcilere ula\u015fmas\u0131n\u0131 sa\u011flamak i\u00e7in RabbitMQ, Kafka, Redis Pub\/Sub veya bir bulut mesajla\u015fma hizmeti (AWS SNS, Google Pub\/Sub) gibi bir mesaj kuyru\u011fu sistemi kullanabilirsiniz. Bu sayede, olaylar merkezi bir noktadan yay\u0131nlan\u0131r ve t\u00fcm SSE sunucular\u0131 bu olaylar\u0131 dinleyerek kendi ba\u011fl\u0131 istemcilerine iletir. Bu mimari, sunucular aras\u0131nda olay senkronizasyonunu sa\u011flar, tek bir sunucunun ar\u0131zalanmas\u0131 durumunda bile sistemi daha diren\u00e7li hale getirir ve y\u00fcksek hacimli olay ak\u0131\u015flar\u0131n\u0131 y\u00f6netmek i\u00e7in idealdir.<\/li>\n<li><strong>HTTP\/2 Kullan\u0131m\u0131:<\/strong> Daha \u00f6nce de bahsedildi\u011fi gibi, HTTP\/2'nin \u00e7oklama yetenekleri, SSE ba\u011flant\u0131lar\u0131n\u0131n daha verimli kullan\u0131lmas\u0131n\u0131 sa\u011flar. Tek bir TCP ba\u011flant\u0131s\u0131 \u00fczerinden birden fazla ak\u0131\u015f\u0131n y\u00f6netilmesi, ba\u011flant\u0131 kurulumu ve ba\u015fl\u0131k y\u00fck\u00fcn\u00fc azaltarak performans\u0131 art\u0131r\u0131r. E\u011fer altyap\u0131n\u0131z HTTP\/2'yi destekliyorsa, SSE'yi bu protokol \u00fczerinde \u00e7al\u0131\u015ft\u0131rmak her zaman tercih edilmelidir.<\/li>\n<li><strong>Heartbeat Mekanizmalar\u0131:<\/strong> Ba\u011flant\u0131n\u0131n hala aktif oldu\u011funu kontrol etmek ve arac\u0131 proxy'lerin veya g\u00fcvenlik duvarlar\u0131n\u0131n zaman a\u015f\u0131m\u0131 nedeniyle ba\u011flant\u0131y\u0131 kapatmas\u0131n\u0131 \u00f6nlemek i\u00e7in d\u00fczenli aral\u0131klarla bo\u015f olaylar (heartbeat mesajlar\u0131) g\u00f6ndermek faydal\u0131 olabilir. Bu, hem sunucunun hem de istemcinin ba\u011flant\u0131n\u0131n durumunu daha iyi anlamas\u0131na yard\u0131mc\u0131 olur.<\/li>\n<\/ul>\n<p>Bu geli\u015fmi\u015f stratejileri uygulayarak, SSE tabanl\u0131 uygulamalar\u0131n\u0131z\u0131 daha g\u00fcvenli, hata toleransl\u0131 ve y\u00fcksek \u00f6l\u00e7eklenebilir hale getirebilirsiniz. Unutmay\u0131n ki her uygulaman\u0131n kendine \u00f6zg\u00fc ihtiya\u00e7lar\u0131 vard\u0131r, bu nedenle bu ipu\u00e7lar\u0131n\u0131 kendi projenizin gereksinimlerine g\u00f6re uyarlaman\u0131z ve test etmeniz \u00f6nemlidir.<\/p>\n<h2>Sonu\u00e7: Do\u011fru Arac\u0131 Se\u00e7menin \u00d6nemi<\/h2>\n<p>Bu makale boyunca, Server-Sent Events (SSE) teknolojisini derinlemesine inceledik ve WebSockets'\u0131n her zaman tek ve do\u011fru \u00e7\u00f6z\u00fcm olmad\u0131\u011f\u0131n\u0131 g\u00f6stermeyi ama\u00e7lad\u0131k. Ger\u00e7ek zamanl\u0131 web uygulamalar\u0131 geli\u015ftirirken, do\u011fru arac\u0131 se\u00e7mek, projenizin ba\u015far\u0131s\u0131 i\u00e7in kritik \u00f6neme sahiptir. SSE, \u00f6zellikle sunucudan istemciye tek y\u00f6nl\u00fc veri ak\u0131\u015f\u0131n\u0131n yeterli oldu\u011fu senaryolarda, WebSockets'a g\u00f6re \u00f6nemli avantajlar sunar: daha basit bir API, mevcut HTTP altyap\u0131s\u0131yla daha iyi entegrasyon, otomatik yeniden ba\u011flanma \u00f6zelli\u011fi ve genellikle daha d\u00fc\u015f\u00fck geli\u015ftirme karma\u015f\u0131kl\u0131\u011f\u0131. Hisse senedi takibi, canl\u0131 skorlar, anl\u0131k bildirim sistemleri, i\u015flem ilerlemesini g\u00f6steren ilerleme \u00e7ubuklar\u0131 veya log ak\u0131\u015flar\u0131 gibi bir\u00e7ok yayg\u0131n kullan\u0131m durumu i\u00e7in SSE, gereksiz karma\u015f\u0131kl\u0131ktan ka\u00e7\u0131narak etkili ve verimli bir \u00e7\u00f6z\u00fcm sunar. Basitli\u011fi sayesinde geli\u015ftirme s\u00fcresini k\u0131salt\u0131r ve mevcut HTTP altyap\u0131s\u0131yla sorunsuz bir \u015fekilde \u00e7al\u0131\u015f\u0131r, bu da onu bir\u00e7ok projede cazip bir se\u00e7enek haline getirir.<\/p>\n<p>Elbette, WebSockets da kendine \u00f6zg\u00fc g\u00fc\u00e7l\u00fc y\u00f6nlere sahiptir ve tam \u00e7ift y\u00f6nl\u00fc, d\u00fc\u015f\u00fck gecikmeli ve y\u00fcksek performansl\u0131 ileti\u015fim gerektiren sohbet uygulamalar\u0131, \u00e7ok oyunculu oyunlar veya ger\u00e7ek zamanl\u0131 i\u015fbirli\u011fi ara\u00e7lar\u0131 gibi durumlarda hala vazge\u00e7ilmezdir. Ancak, uygulaman\u0131z\u0131n do\u011fas\u0131n\u0131 do\u011fru analiz etmek, \"acaba WebSockets'a ger\u00e7ekten ihtiyac\u0131m var m\u0131?\" sorusunu sormak ve SSE gibi daha basit alternatifleri de\u011ferlendirmek, geli\u015ftirme s\u00fcrecinizi h\u0131zland\u0131rabilir, sunucu kaynaklar\u0131n\u0131 daha verimli kullanman\u0131z\u0131 sa\u011flayabilir ve genel sistem mimarinizi basitle\u015ftirebilir. Unutmay\u0131n, en iyi teknoloji, i\u015finize en uygun olan\u0131d\u0131r. Bu karar\u0131 verirken, uygulaman\u0131z\u0131n temel ileti\u015fim modelini, veri hacmini, g\u00fcvenlik gereksinimlerini ve geli\u015ftirme ekibinizin uzmanl\u0131\u011f\u0131n\u0131 g\u00f6z \u00f6n\u00fcnde bulundurmak, uzun vadede daha s\u00fcrd\u00fcr\u00fclebilir ve ba\u015far\u0131l\u0131 bir sonu\u00e7 elde etmenizi sa\u011flayacakt\u0131r.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular<\/h3>\n<ul>\n<li>\n<h4>SSE'nin taray\u0131c\u0131 deste\u011fi nas\u0131ld\u0131r?<\/h4>\n<p>Modern taray\u0131c\u0131lar\u0131n \u00e7o\u011fu (Google Chrome, Mozilla Firefox, Apple Safari, Microsoft Edge gibi) <code>EventSource<\/code> API'yi ve dolay\u0131s\u0131yla Server-Sent Events'\u0131 geni\u015f \u00f6l\u00e7\u00fcde desteklemektedir. \u0130nternet Explorer ve baz\u0131 eski taray\u0131c\u0131lar i\u00e7in do\u011frudan destek bulunmasa da, polyfill k\u00fct\u00fcphaneleri (\u00f6rne\u011fin <code>event-source-polyfill<\/code>) kullanarak bu taray\u0131c\u0131larda da SSE i\u015flevselli\u011fi sa\u011flanabilir. Mobil taray\u0131c\u0131larda da genellikle iyi bir deste\u011fe sahiptir, bu da geni\u015f bir kullan\u0131c\u0131 kitlesine ula\u015fman\u0131z\u0131 sa\u011flar.<\/p>\n<\/li>\n<li>\n<h4>SSE ile ikili (binary) veri g\u00f6nderebilir miyim?<\/h4>\n<p>Hay\u0131r, Server-Sent Events yaln\u0131zca UTF-8 metin tabanl\u0131 veri g\u00f6nderebilir. SSE protokol\u00fc, veri alanlar\u0131n\u0131 metin dizileri olarak tan\u0131mlar. E\u011fer uygulaman\u0131z\u0131n resim, video ak\u0131\u015f\u0131 veya di\u011fer ikili formatta veri g\u00f6ndermesi gerekiyorsa, WebSockets (hem metin hem de ikili veri deste\u011fi sunar) veya farkl\u0131 bir HTTP tabanl\u0131 dosya aktar\u0131m\u0131 mekanizmas\u0131 (\u00f6rne\u011fin REST API \u00fczerinden dosya indirme) kullanman\u0131z gerekir. Genellikle SSE ile JSON format\u0131nda metin verileri g\u00f6nderilir ve bu veriler istemcide JavaScript arac\u0131l\u0131\u011f\u0131yla i\u015flenir.<\/p>\n<\/li>\n<li>\n<h4>SSE ba\u011flant\u0131s\u0131 koptu\u011funda ne olur?<\/h4>\n<p><code>EventSource<\/code> API'si, ba\u011flant\u0131 koptu\u011funda (\u00f6rne\u011fin a\u011f hatas\u0131, sunucu kesintisi veya sunucu taraf\u0131ndan ba\u011flant\u0131n\u0131n kapat\u0131lmas\u0131 gibi nedenlerle) otomatik olarak yeniden ba\u011flanmay\u0131 deneme mekanizmas\u0131na sahiptir. Varsay\u0131lan olarak, artan bir gecikme (exponential backoff) ile yeniden ba\u011flant\u0131 kurmaya \u00e7al\u0131\u015f\u0131r. Sunucu ayr\u0131ca <code>retry: [milisaniye]\\n<\/code> ba\u015fl\u0131\u011f\u0131n\u0131 g\u00f6ndererek istemcinin yeniden ba\u011flanma gecikmesini kontrol edebilir ve a\u011f ko\u015fullar\u0131na g\u00f6re bu s\u00fcreyi dinamik olarak ayarlayabilir. Bu yerle\u015fik yeniden ba\u011flanma \u00f6zelli\u011fi, SSE'nin dayan\u0131kl\u0131l\u0131\u011f\u0131n\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131r\u0131r ve geli\u015ftiricilere daha az manuel hata y\u00f6netimi y\u00fck\u00fc b\u0131rak\u0131r.<\/p>\n<\/li>\n<li>\n<h4>SSE'nin g\u00fcvenlik a\u00e7\u0131klar\u0131 var m\u0131d\u0131r?<\/h4>\n<p>SSE, temel HTTP protokol\u00fc \u00fczerinde \u00e7al\u0131\u015ft\u0131\u011f\u0131 i\u00e7in, HTTP'nin do\u011fal g\u00fcvenlik \u00f6nlemleri (HTTPS, CORS politikalar\u0131) do\u011frudan ge\u00e7erlidir. Dolay\u0131s\u0131yla, SSE ba\u011flant\u0131lar\u0131n\u0131n HTTPS \u00fczerinden yap\u0131lmas\u0131, verilerin \u015fifrelenmesini ve siber sald\u0131r\u0131lara kar\u015f\u0131 korunmas\u0131n\u0131 sa\u011flar. Kimlik do\u011frulama (authentication) ve yetkilendirme (authorization), SSE endpoint'inize eri\u015fim kontrol\u00fcn\u00fc sa\u011flamak i\u00e7in kritik \u00f6neme sahiptir. Kullan\u0131c\u0131ya \u00f6zel veri ak\u0131\u015flar\u0131 i\u00e7in, bir kimlik do\u011frulama token\u0131 (JWT gibi) URL parametresi olarak veya session \u00e7erezleri arac\u0131l\u0131\u011f\u0131yla sunucuya g\u00f6nderilerek kullan\u0131c\u0131 kimli\u011fi do\u011frulanmal\u0131 ve yetkisi kontrol edilmelidir. Uygun CORS ba\u015fl\u0131klar\u0131 belirlemek de \u00e7apraz kaynak isteklerinde g\u00fcvenlik sa\u011flamak i\u00e7in \u00f6nemlidir.<\/p>\n<\/li>\n<li>\n<h4>SSE ne kadar \u00f6l\u00e7eklenebilir?<\/h4>\n<p>SSE, her a\u00e7\u0131k ba\u011flant\u0131 i\u00e7in sunucuda bir HTTP ba\u011flant\u0131s\u0131 tuttu\u011fu i\u00e7in, \u00e7ok y\u00fcksek say\u0131da e\u015fzamanl\u0131 ba\u011flant\u0131da sunucu kaynaklar\u0131 \u00fczerinde bir bask\u0131 olu\u015fturabilir (\u00f6zellikle dosya tan\u0131mlay\u0131c\u0131lar\u0131). Ancak, uygun mimari yakla\u015f\u0131mlarla (\u00f6rne\u011fin HTTP\/2 kullan\u0131m\u0131, \u00e7ok \u00e7ekirdekli CPU'lar\u0131 kullanma, y\u00fck dengeleyiciler ve \"sticky sessions\" yap\u0131land\u0131rmas\u0131, Redis Pub\/Sub veya Kafka gibi mesaj kuyruklar\u0131 kullanarak olay da\u011f\u0131t\u0131m\u0131) SSE uygulamalar\u0131 olduk\u00e7a \u00f6l\u00e7eklenebilir hale getirilebilir. Bir\u00e7ok uygulama i\u00e7in, WebSockets'\u0131n getirece\u011fi ek karma\u015f\u0131kl\u0131ktan ka\u00e7\u0131n\u0131rken yeterli \u00f6l\u00e7eklenebilirlik sa\u011flar. Temel prensip, her ba\u011flant\u0131n\u0131n m\u00fcmk\u00fcn oldu\u011funca hafif olmas\u0131n\u0131 ve olaylar\u0131n verimli bir \u015fekilde da\u011f\u0131t\u0131lmas\u0131n\u0131 sa\u011flamakt\u0131r.<\/p>\n<\/li>\n<\/ul>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"G\u00fcn\u00fcm\u00fcz web uygulamalar\u0131, ger\u00e7ek zamanl\u0131 veri ak\u0131\u015f\u0131 ihtiyac\u0131n\u0131 her ge\u00e7en g\u00fcn daha fazla hissediyor. \u00c7o\u011fu geli\u015ftirici bu noktada&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-30920","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 Ger\u00e7ekten \u0130htiyac\u0131n\u0131z Var M\u0131? Sunucu Taraf\u0131ndan G\u00f6nderilen Olaylar\u0131n G\u00fcc\u00fc<\/title>\n<meta name=\"description\" content=\"G\u00fcn\u00fcm\u00fcz web uygulamalar\u0131, ger\u00e7ek zamanl\u0131 veri ak\u0131\u015f\u0131 ihtiyac\u0131n\u0131 her ge\u00e7en g\u00fcn daha fazla hissediyor. \u00c7o\u011fu geli\u015ftirici bu noktada hemen WebSockets&#039;a y\u00f6nelse de, asl\u0131nda tek y\u00f6nl\u00fc ileti\u015fim gerektiren senaryolarda Server-Sent Events (SSE) \u00e7ok daha basit ve etkili bir alternatif sunabilir. Bu makale, WebSockets&#039;a olan ihtiyac\u0131n\u0131z\u0131 sorgulaman\u0131za yard\u0131mc\u0131 olacak ve SSE&#039;nin g\u00fcc\u00fcn\u00fc ke\u015ffetmenizi sa\u011flayacak.\" \/>\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-gercekten-ihtiyaciniz-var-mi-sunucu-tarafindan-gonderilen-olaylarin-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 Ger\u00e7ekten \u0130htiyac\u0131n\u0131z Var M\u0131? Sunucu Taraf\u0131ndan G\u00f6nderilen Olaylar\u0131n G\u00fcc\u00fc\" \/>\n<meta property=\"og:description\" content=\"G\u00fcn\u00fcm\u00fcz web uygulamalar\u0131, ger\u00e7ek zamanl\u0131 veri ak\u0131\u015f\u0131 ihtiyac\u0131n\u0131 her ge\u00e7en g\u00fcn daha fazla hissediyor. \u00c7o\u011fu geli\u015ftirici bu noktada hemen WebSockets&#039;a y\u00f6nelse de, asl\u0131nda tek y\u00f6nl\u00fc ileti\u015fim gerektiren senaryolarda Server-Sent Events (SSE) \u00e7ok daha basit ve etkili bir alternatif sunabilir. Bu makale, WebSockets&#039;a olan ihtiyac\u0131n\u0131z\u0131 sorgulaman\u0131za yard\u0131mc\u0131 olacak ve SSE&#039;nin g\u00fcc\u00fcn\u00fc ke\u015ffetmenizi sa\u011flayacak.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/websocketsa-gercekten-ihtiyaciniz-var-mi-sunucu-tarafindan-gonderilen-olaylarin-gucu\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-03T09:05:27+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=\"34 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/websocketsa-gercekten-ihtiyaciniz-var-mi-sunucu-tarafindan-gonderilen-olaylarin-gucu\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/websocketsa-gercekten-ihtiyaciniz-var-mi-sunucu-tarafindan-gonderilen-olaylarin-gucu\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"WebSockets&#8217;a Ger\u00e7ekten \u0130htiyac\u0131n\u0131z Var M\u0131? Sunucu Taraf\u0131ndan G\u00f6nderilen Olaylar\u0131n G\u00fcc\u00fc\",\"datePublished\":\"2025-10-03T09:05:27+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/websocketsa-gercekten-ihtiyaciniz-var-mi-sunucu-tarafindan-gonderilen-olaylarin-gucu\/\"},\"wordCount\":6189,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/websocketsa-gercekten-ihtiyaciniz-var-mi-sunucu-tarafindan-gonderilen-olaylarin-gucu\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/websocketsa-gercekten-ihtiyaciniz-var-mi-sunucu-tarafindan-gonderilen-olaylarin-gucu\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/websocketsa-gercekten-ihtiyaciniz-var-mi-sunucu-tarafindan-gonderilen-olaylarin-gucu\/\",\"name\":\"WebSockets'a Ger\u00e7ekten \u0130htiyac\u0131n\u0131z Var M\u0131? Sunucu Taraf\u0131ndan G\u00f6nderilen Olaylar\u0131n G\u00fcc\u00fc\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-03T09:05:27+00:00\",\"description\":\"G\u00fcn\u00fcm\u00fcz web uygulamalar\u0131, ger\u00e7ek zamanl\u0131 veri ak\u0131\u015f\u0131 ihtiyac\u0131n\u0131 her ge\u00e7en g\u00fcn daha fazla hissediyor. \u00c7o\u011fu geli\u015ftirici bu noktada hemen WebSockets'a y\u00f6nelse de, asl\u0131nda tek y\u00f6nl\u00fc ileti\u015fim gerektiren senaryolarda Server-Sent Events (SSE) \u00e7ok daha basit ve etkili bir alternatif sunabilir. Bu makale, WebSockets'a olan ihtiyac\u0131n\u0131z\u0131 sorgulaman\u0131za yard\u0131mc\u0131 olacak ve SSE'nin g\u00fcc\u00fcn\u00fc ke\u015ffetmenizi sa\u011flayacak.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/websocketsa-gercekten-ihtiyaciniz-var-mi-sunucu-tarafindan-gonderilen-olaylarin-gucu\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/websocketsa-gercekten-ihtiyaciniz-var-mi-sunucu-tarafindan-gonderilen-olaylarin-gucu\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/websocketsa-gercekten-ihtiyaciniz-var-mi-sunucu-tarafindan-gonderilen-olaylarin-gucu\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"WebSockets&#8217;a Ger\u00e7ekten \u0130htiyac\u0131n\u0131z Var M\u0131? Sunucu Taraf\u0131ndan G\u00f6nderilen Olaylar\u0131n 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 Ger\u00e7ekten \u0130htiyac\u0131n\u0131z Var M\u0131? Sunucu Taraf\u0131ndan G\u00f6nderilen Olaylar\u0131n G\u00fcc\u00fc","description":"G\u00fcn\u00fcm\u00fcz web uygulamalar\u0131, ger\u00e7ek zamanl\u0131 veri ak\u0131\u015f\u0131 ihtiyac\u0131n\u0131 her ge\u00e7en g\u00fcn daha fazla hissediyor. \u00c7o\u011fu geli\u015ftirici bu noktada hemen WebSockets'a y\u00f6nelse de, asl\u0131nda tek y\u00f6nl\u00fc ileti\u015fim gerektiren senaryolarda Server-Sent Events (SSE) \u00e7ok daha basit ve etkili bir alternatif sunabilir. Bu makale, WebSockets'a olan ihtiyac\u0131n\u0131z\u0131 sorgulaman\u0131za yard\u0131mc\u0131 olacak ve SSE'nin g\u00fcc\u00fcn\u00fc ke\u015ffetmenizi sa\u011flayacak.","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-gercekten-ihtiyaciniz-var-mi-sunucu-tarafindan-gonderilen-olaylarin-gucu\/","og_locale":"tr_TR","og_type":"article","og_title":"WebSockets'a Ger\u00e7ekten \u0130htiyac\u0131n\u0131z Var M\u0131? Sunucu Taraf\u0131ndan G\u00f6nderilen Olaylar\u0131n G\u00fcc\u00fc","og_description":"G\u00fcn\u00fcm\u00fcz web uygulamalar\u0131, ger\u00e7ek zamanl\u0131 veri ak\u0131\u015f\u0131 ihtiyac\u0131n\u0131 her ge\u00e7en g\u00fcn daha fazla hissediyor. \u00c7o\u011fu geli\u015ftirici bu noktada hemen WebSockets'a y\u00f6nelse de, asl\u0131nda tek y\u00f6nl\u00fc ileti\u015fim gerektiren senaryolarda Server-Sent Events (SSE) \u00e7ok daha basit ve etkili bir alternatif sunabilir. Bu makale, WebSockets'a olan ihtiyac\u0131n\u0131z\u0131 sorgulaman\u0131za yard\u0131mc\u0131 olacak ve SSE'nin g\u00fcc\u00fcn\u00fc ke\u015ffetmenizi sa\u011flayacak.","og_url":"https:\/\/fatihsoysal.com\/blog\/websocketsa-gercekten-ihtiyaciniz-var-mi-sunucu-tarafindan-gonderilen-olaylarin-gucu\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-03T09:05:27+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"34 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/websocketsa-gercekten-ihtiyaciniz-var-mi-sunucu-tarafindan-gonderilen-olaylarin-gucu\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/websocketsa-gercekten-ihtiyaciniz-var-mi-sunucu-tarafindan-gonderilen-olaylarin-gucu\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"WebSockets&#8217;a Ger\u00e7ekten \u0130htiyac\u0131n\u0131z Var M\u0131? Sunucu Taraf\u0131ndan G\u00f6nderilen Olaylar\u0131n G\u00fcc\u00fc","datePublished":"2025-10-03T09:05:27+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/websocketsa-gercekten-ihtiyaciniz-var-mi-sunucu-tarafindan-gonderilen-olaylarin-gucu\/"},"wordCount":6189,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/websocketsa-gercekten-ihtiyaciniz-var-mi-sunucu-tarafindan-gonderilen-olaylarin-gucu\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/websocketsa-gercekten-ihtiyaciniz-var-mi-sunucu-tarafindan-gonderilen-olaylarin-gucu\/","url":"https:\/\/fatihsoysal.com\/blog\/websocketsa-gercekten-ihtiyaciniz-var-mi-sunucu-tarafindan-gonderilen-olaylarin-gucu\/","name":"WebSockets'a Ger\u00e7ekten \u0130htiyac\u0131n\u0131z Var M\u0131? Sunucu Taraf\u0131ndan G\u00f6nderilen Olaylar\u0131n G\u00fcc\u00fc","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-03T09:05:27+00:00","description":"G\u00fcn\u00fcm\u00fcz web uygulamalar\u0131, ger\u00e7ek zamanl\u0131 veri ak\u0131\u015f\u0131 ihtiyac\u0131n\u0131 her ge\u00e7en g\u00fcn daha fazla hissediyor. \u00c7o\u011fu geli\u015ftirici bu noktada hemen WebSockets'a y\u00f6nelse de, asl\u0131nda tek y\u00f6nl\u00fc ileti\u015fim gerektiren senaryolarda Server-Sent Events (SSE) \u00e7ok daha basit ve etkili bir alternatif sunabilir. Bu makale, WebSockets'a olan ihtiyac\u0131n\u0131z\u0131 sorgulaman\u0131za yard\u0131mc\u0131 olacak ve SSE'nin g\u00fcc\u00fcn\u00fc ke\u015ffetmenizi sa\u011flayacak.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/websocketsa-gercekten-ihtiyaciniz-var-mi-sunucu-tarafindan-gonderilen-olaylarin-gucu\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/websocketsa-gercekten-ihtiyaciniz-var-mi-sunucu-tarafindan-gonderilen-olaylarin-gucu\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/websocketsa-gercekten-ihtiyaciniz-var-mi-sunucu-tarafindan-gonderilen-olaylarin-gucu\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"WebSockets&#8217;a Ger\u00e7ekten \u0130htiyac\u0131n\u0131z Var M\u0131? Sunucu Taraf\u0131ndan G\u00f6nderilen Olaylar\u0131n 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\/30920","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=30920"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/30920\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=30920"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=30920"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=30920"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}