{"id":37316,"date":"2025-12-30T17:40:50","date_gmt":"2025-12-30T14:40:50","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=37316"},"modified":"2025-12-30T17:40:50","modified_gmt":"2025-12-30T14:40:50","slug":"graphql-subscriptions-in-angular-using-apollo-2-0-gercek-zamanli-uygulamalar-icin-kapsamli-bir-rehber","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/graphql-subscriptions-in-angular-using-apollo-2-0-gercek-zamanli-uygulamalar-icin-kapsamli-bir-rehber\/","title":{"rendered":"GraphQL Subscriptions in Angular using Apollo 2.0: Ger\u00e7ek Zamanl\u0131 Uygulamalar \u0130\u00e7in Kapsaml\u0131 Bir Rehber"},"content":{"rendered":"<p><body><\/p>\n<h2>GraphQL Subscriptions in Angular using Apollo 2.0: Ger\u00e7ek Zamanl\u0131 Uygulamalar \u0130\u00e7in Kapsaml\u0131 Bir Rehber<\/h2>\n<p>Modern web uygulamalar\u0131, kullan\u0131c\u0131lar\u0131na dinamik ve ger\u00e7ek zamanl\u0131 deneyimler sunma ihtiyac\u0131 duymaktad\u0131r. Sohbet uygulamalar\u0131, canl\u0131 bildirimler, spor skorlar\u0131 veya finansal piyasa verileri gibi senaryolarda, sunucudaki bir veri de\u011fi\u015fikli\u011finin an\u0131nda istemciye iletilmesi kritik \u00f6neme sahiptir. Geleneksel HTTP tabanl\u0131 yakla\u015f\u0131mlar bu t\u00fcr gereksinimleri kar\u015f\u0131lamakta zorlan\u0131rken, GraphQL Subscriptions (Abonelikler) bu bo\u015flu\u011fu doldurur.<\/p>\n<p>Bu makale, Angular \u00e7er\u00e7evesi ve Apollo Client 2.0 (veya ilgili s\u00fcr\u00fcmleri) kullanarak GraphQL Subscriptions&#8217;\u0131 nas\u0131l uygulayaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m a\u00e7\u0131klamaktad\u0131r. GraphQL Subscriptions&#8217;\u0131n temellerinden ba\u015flayarak, Apollo Client ile Angular entegrasyonuna, WebSocket ba\u011flant\u0131s\u0131n\u0131n kurulmas\u0131na, aboneliklerin Angular bile\u015fenlerinde nas\u0131l kullan\u0131laca\u011f\u0131na ve son olarak geli\u015fmi\u015f konular ile en iyi uygulamalara de\u011finece\u011fiz. Amac\u0131m\u0131z, Angular uygulamalar\u0131n\u0131zda ger\u00e7ek zamanl\u0131 veri ak\u0131\u015f\u0131n\u0131 kolayca entegre etmenizi sa\u011flayacak kapsaml\u0131 bir rehber sunmakt\u0131r.<\/p>\n<h2>GraphQL Subscriptions Nedir?<\/h2>\n<p>GraphQL, API&#8217;ler i\u00e7in bir sorgu dili ve \u00e7al\u0131\u015fma zaman\u0131 olup, istemcilerin tam olarak ihtiya\u00e7 duyduklar\u0131 veriyi talep etmelerine olanak tan\u0131r. GraphQL&#8217;in \u00fc\u00e7 ana i\u015flem t\u00fcr\u00fc vard\u0131r:<\/p>\n<ul>\n<li><strong>Query (Sorgu):<\/strong> Veri okuma i\u015flemleri i\u00e7in kullan\u0131l\u0131r. Tek seferlik veri \u00e7ekme talepleridir.<\/li>\n<li><strong>Mutation (De\u011fi\u015fiklik):<\/strong> Veri yazma, g\u00fcncelleme veya silme i\u015flemleri i\u00e7in kullan\u0131l\u0131r. Sunucu taraf\u0131nda veri de\u011fi\u015fikli\u011fi yapar.<\/li>\n<li><strong>Subscription (Abonelik):<\/strong> Ger\u00e7ek zamanl\u0131 veri ak\u0131\u015f\u0131 i\u00e7in kullan\u0131l\u0131r. \u0130stemci, belirli bir olaya abone olur ve bu olay her ger\u00e7ekle\u015fti\u011finde sunucu, g\u00fcncel veriyi istemciye iter.<\/li>\n<\/ul>\n<h3>Geleneksel Yakla\u015f\u0131mlar ve K\u0131s\u0131tlamalar\u0131<\/h3>\n<p>Ger\u00e7ek zamanl\u0131 veri g\u00fcncellemeleri ihtiyac\u0131, web geli\u015ftirmenin ilk g\u00fcnlerinden beri mevcuttu. Ancak, HTTP&#8217;nin ba\u011flant\u0131s\u0131z (stateless) yap\u0131s\u0131 bu t\u00fcr senaryolar i\u00e7in do\u011fal bir \u00e7\u00f6z\u00fcm sunmaz. Geleneksel olarak kullan\u0131lan baz\u0131 yakla\u015f\u0131mlar ve bunlar\u0131n k\u0131s\u0131tlamalar\u0131 \u015funlard\u0131r:<\/p>\n<ul>\n<li><strong>Polling (Yoklama):<\/strong> \u0130stemci, belirli aral\u0131klarla sunucuya yeni veri olup olmad\u0131\u011f\u0131n\u0131 sormak i\u00e7in s\u00fcrekli HTTP istekleri g\u00f6nderir. Bu y\u00f6ntem, sunucu ve istemci kaynaklar\u0131n\u0131 verimsiz kullan\u0131r, gereksiz trafik olu\u015fturur ve g\u00fcncellemelerde gecikmelere neden olabilir.<\/li>\n<li><strong>Long Polling (Uzun Yoklama):<\/strong> \u0130stemci bir istek g\u00f6nderir ve sunucu, yeni veri olana kadar cevab\u0131 a\u00e7\u0131k tutar. Veri geldi\u011finde cevap g\u00f6nderilir ve istemci hemen yeni bir istek ba\u015flat\u0131r. Polling&#8217;e g\u00f6re daha verimlidir ancak yine de ba\u011flant\u0131 y\u00f6netimi karma\u015f\u0131kt\u0131r ve sunucu kaynaklar\u0131n\u0131 me\u015fgul edebilir.<\/li>\n<li><strong>Server-Sent Events (SSE):<\/strong> Sunucudan istemciye tek y\u00f6nl\u00fc, s\u00fcrekli bir ba\u011flant\u0131 \u00fczerinden veri ak\u0131\u015f\u0131 sa\u011flar. Taray\u0131c\u0131 deste\u011fi iyidir, ancak istemciden sunucuya veri g\u00f6nderme yetene\u011fi s\u0131n\u0131rl\u0131d\u0131r ve ikili veri aktar\u0131m\u0131 i\u00e7in uygun de\u011fildir.<\/li>\n<li><strong>Raw WebSockets:<\/strong> \u0130stemci ve sunucu aras\u0131nda \u00e7ift y\u00f6nl\u00fc, kal\u0131c\u0131 bir ba\u011flant\u0131 kurar. Ger\u00e7ek zamanl\u0131 ileti\u015fim i\u00e7in idealdir ancak ba\u011flant\u0131 y\u00f6netimi, mesaj formatlama, yeniden ba\u011flant\u0131 kurma gibi detaylar\u0131 manuel olarak ele almak gerekir, bu da geli\u015ftirme s\u00fcrecini karma\u015f\u0131kla\u015ft\u0131r\u0131r.<\/li>\n<\/ul>\n<h3>Subscriptions&#8217;\u0131n Temelleri<\/h3>\n<p>GraphQL Subscriptions, WebSockets teknolojisinin \u00fczerine in\u015fa edilmi\u015ftir ancak GraphQL&#8217;in deklaratif yap\u0131s\u0131n\u0131 kullanarak bu karma\u015f\u0131kl\u0131\u011f\u0131 soyutlar. Bir istemci bir abonelik ba\u015flatt\u0131\u011f\u0131nda:<\/p>\n<ol>\n<li>\u0130stemci, sunucuya bir WebSocket ba\u011flant\u0131s\u0131 kurar.<\/li>\n<li>\u0130stemci, GraphQL \u015femas\u0131na uygun bir abonelik sorgusu (subscription query) g\u00f6nderir.<\/li>\n<li>Sunucu, bu aboneli\u011fi kaydeder ve belirli bir olay (\u00f6rne\u011fin, yeni bir mesaj\u0131n veritaban\u0131na kaydedilmesi) ger\u00e7ekle\u015fti\u011finde, abone olan t\u00fcm istemcilere g\u00fcncel veriyi WebSocket ba\u011flant\u0131s\u0131 \u00fczerinden iter.<\/li>\n<li>\u0130stemci, gelen veriyi al\u0131r ve kullan\u0131c\u0131 aray\u00fcz\u00fcn\u00fc g\u00fcnceller.<\/li>\n<\/ol>\n<p>Bu yakla\u015f\u0131m, istemcinin sunucudan s\u00fcrekli veri \u00e7ekme ihtiyac\u0131n\u0131 ortadan kald\u0131r\u0131r ve yaln\u0131zca ilgili olaylar meydana geldi\u011finde veri almas\u0131n\u0131 sa\u011flar. Bu, hem a\u011f trafi\u011fini azalt\u0131r hem de daha duyarl\u0131 ve verimli uygulamalar geli\u015ftirilmesine olanak tan\u0131r.<\/p>\n<h2>Apollo Client ve Angular Entegrasyonu<\/h2>\n<p>Apollo Client, GraphQL API&#8217;leri ile etkile\u015fim kurmak i\u00e7in kapsaml\u0131 bir istemci k\u00fct\u00fcphanesidir. Veri \u00e7ekme, \u00f6nbellekleme, durum y\u00f6netimi ve UI g\u00fcncellemeleri gibi bir\u00e7ok karma\u015f\u0131k g\u00f6revi basitle\u015ftirir. Angular uygulamalar\u0131nda Apollo Client kullanmak i\u00e7in ise <a href=\"https:\/\/apollo-angular.com\/\">Apollo Angular<\/a> k\u00fct\u00fcphanesi kullan\u0131l\u0131r.<\/p>\n<h3>Apollo Client Nedir?<\/h3>\n<p>Apollo Client, JavaScript uygulamalar\u0131 i\u00e7in GraphQL verilerini y\u00f6netmek ve \u00f6nbelle\u011fe almak i\u00e7in tasarlanm\u0131\u015f, topluluk taraf\u0131ndan desteklenen bir k\u00fct\u00fcphanedir. Temel \u00f6zellikleri \u015funlard\u0131r:<\/p>\n<ul>\n<li><strong>Deklaratif Veri \u00c7ekme:<\/strong> GraphQL sorgular\u0131n\u0131 do\u011frudan UI bile\u015fenlerinizde tan\u0131mlaman\u0131za olanak tan\u0131r.<\/li>\n<li><strong>Ak\u0131ll\u0131 \u00d6nbellekleme:<\/strong> \u00c7ekilen veriyi otomatik olarak \u00f6nbelle\u011fe al\u0131r, b\u00f6ylece ayn\u0131 veri tekrar istendi\u011finde a\u011f iste\u011fi yapmadan h\u0131zl\u0131ca d\u00f6nebilir.<\/li>\n<li><strong>Reaktif Veri Ak\u0131\u015f\u0131:<\/strong> Veri de\u011fi\u015fikliklerini izler ve UI&#8217;yi otomatik olarak g\u00fcnceller.<\/li>\n<li><strong>Geni\u015fletilebilir Link Sistemi:<\/strong> HTTP, WebSocket, hata y\u00f6netimi, kimlik do\u011frulama gibi farkl\u0131 protokoller ve i\u015flevler i\u00e7in \u00f6zelle\u015ftirilebilir &#8220;link&#8221;ler arac\u0131l\u0131\u011f\u0131yla sunucuyla ileti\u015fim kurar.<\/li>\n<\/ul>\n<h3>Apollo Angular<\/h3>\n<p>Apollo Angular, Apollo Client&#8217;\u0131 Angular uygulamalar\u0131na sorunsuz bir \u015fekilde entegre etmek i\u00e7in tasarlanm\u0131\u015f resmi bir k\u00fct\u00fcphanedir. Angular&#8217;\u0131n reaktif programlama (RxJS) paradigmas\u0131yla uyumlu \u00e7al\u0131\u015f\u0131r ve GraphQL i\u015flemlerini Observable&#8217;lar olarak d\u00f6nd\u00fcr\u00fcr. Bu sayede, Angular&#8217;\u0131n ya\u015fam d\u00f6ng\u00fcs\u00fc ve de\u011fi\u015fiklik alg\u0131lama mekanizmalar\u0131yla kolayca entegre edilebilir.<\/p>\n<h3>Kurulum ve Temel Yap\u0131land\u0131rma<\/h3>\n<p>Angular uygulaman\u0131za Apollo Client ve Apollo Angular&#8217;\u0131 eklemek i\u00e7in a\u015fa\u011f\u0131daki ad\u0131mlar\u0131 izleyin. Bu ad\u0131mlar, Apollo Client 2.x ve <code>subscriptions-transport-ws<\/code> k\u00fct\u00fcphanesinin kullan\u0131ld\u0131\u011f\u0131 d\u00f6nemi yans\u0131tmaktad\u0131r.<\/p>\n<p>\u00d6ncelikle gerekli paketleri y\u00fckleyin:<\/p>\n<pre><code class=\"language-bash\">\nnpm install apollo-angular @apollo\/client graphql-tag graphql subscriptions-transport-ws apollo-link-ws apollo-link-http apollo-link\n<\/code><\/pre>\n<p>Bu paketlerin a\u00e7\u0131klamalar\u0131:<\/p>\n<ul>\n<li><code>apollo-angular<\/code>: Angular i\u00e7in Apollo Client entegrasyonu.<\/li>\n<li><code>@apollo\/client<\/code>: Apollo Client&#8217;\u0131n ana paketi (eski ad\u0131yla <code>apollo-client<\/code>).<\/li>\n<li><code>graphql-tag<\/code>: GraphQL sorgular\u0131n\u0131 JavaScript \u015fablon dizileriyle ayr\u0131\u015ft\u0131rmak i\u00e7in kullan\u0131l\u0131r.<\/li>\n<li><code>graphql<\/code>: GraphQL&#8217;in temel t\u00fcr tan\u0131mlar\u0131 ve yard\u0131mc\u0131 ara\u00e7lar\u0131.<\/li>\n<li><code>subscriptions-transport-ws<\/code>: WebSocket \u00fczerinden GraphQL aboneliklerini ta\u015f\u0131mak i\u00e7in kullan\u0131lan k\u00fct\u00fcphane. Apollo Client 2.x d\u00f6neminde standartt\u0131.<\/li>\n<li><code>apollo-link-ws<\/code>: <code>subscriptions-transport-ws<\/code> ile Apollo Client aras\u0131nda k\u00f6pr\u00fc kuran link.<\/li>\n<li><code>apollo-link-http<\/code>: HTTP \u00fczerinden sorgu ve de\u011fi\u015fiklik g\u00f6ndermek i\u00e7in kullan\u0131lan link.<\/li>\n<li><code>apollo-link<\/code>: Farkl\u0131 linkleri birle\u015ftirmek ve operasyonlar\u0131 y\u00f6nlendirmek i\u00e7in kullan\u0131lan ana link paketi.<\/li>\n<\/ul>\n<p>Ard\u0131ndan, Angular uygulaman\u0131z\u0131n <code>AppModule<\/code>&#8216;\u00fcnde veya \u00f6zel bir GraphQL mod\u00fcl\u00fcnde Apollo Client&#8217;\u0131 yap\u0131land\u0131rman\u0131z gerekir. Bu yap\u0131land\u0131rma, HTTP ve WebSocket ba\u011flant\u0131lar\u0131n\u0131 birle\u015ftirecektir.<\/p>\n<pre><code class=\"language-typescript\">\n\/\/ src\/app\/graphql.module.ts (veya app.module.ts)\nimport { NgModule } from '@angular\/core';\nimport { HttpClientModule } from '@angular\/common\/http';\nimport { ApolloModule, APOLLO_OPTIONS } from 'apollo-angular';\nimport { ApolloClientOptions, InMemoryCache } from '@apollo\/client\/core';\nimport { HttpLink } from 'apollo-link-http';\nimport { WebSocketLink } from 'apollo-link-ws';\nimport { split } from 'apollo-link';\nimport { getMainDefinition } from '@apollo\/client\/utilities';\n\nconst uri = 'http:\/\/localhost:4000\/graphql'; \/\/ GraphQL HTTP endpoint\nconst wsUri = 'ws:\/\/localhost:4000\/graphql'; \/\/ GraphQL WebSocket endpoint\n\nexport function createApollo(httpLink: HttpLink) {\n  \/\/ HTTP Link: Sorgu ve de\u011fi\u015fiklikler i\u00e7in\n  const http = httpLink.create({ uri });\n\n  \/\/ WebSocket Link: Abonelikler i\u00e7in\n  const ws = new WebSocketLink({\n    uri: wsUri,\n    options: {\n      reconnect: true, \/\/ Ba\u011flant\u0131 kesildi\u011finde otomatik yeniden ba\u011flan\n      connectionParams: {\n        \/\/ \u0130ste\u011fe ba\u011fl\u0131: WebSocket ba\u011flant\u0131s\u0131 kurulurken sunucuya g\u00f6nderilecek parametreler (\u00f6rn. kimlik do\u011frulama token\u0131)\n        authToken: localStorage.getItem('token'),\n      },\n    },\n  });\n\n  \/\/ 'split' fonksiyonu, operasyon t\u00fcr\u00fcne g\u00f6re do\u011fru linki se\u00e7er\n  \/\/ Abonelikler i\u00e7in WebSocket linkini, di\u011ferleri i\u00e7in HTTP linkini kullan\u0131r\n  const link = split(\n    \/\/ \u0130lk parametre: Test fonksiyonu. Operasyon bir abonelik mi?\n    ({ query }) => {\n      const definition = getMainDefinition(query);\n      return (\n        definition.kind === 'OperationDefinition' &&\n        definition.operation === 'subscription'\n      );\n    },\n    ws,   \/\/ Abonelik ise WebSocket linkini kullan\n    http  \/\/ De\u011filse HTTP linkini kullan\n  );\n\n  return {\n    link: link,\n    cache: new InMemoryCache(), \/\/ Verileri \u00f6nbelle\u011fe almak i\u00e7in\n  } as ApolloClientOptions<any>;\n}\n\n@NgModule({\n  imports: [HttpClientModule, ApolloModule],\n  providers: [\n    HttpLink,\n    {\n      provide: APOLLO_OPTIONS,\n      useFactory: createApollo,\n      deps: [HttpLink],\n    },\n  ],\n})\nexport class GraphQLModule {}\n<\/code><\/pre>\n<p>Bu <code>GraphQLModule<\/code>&#8216;\u00fc, <code>AppModule<\/code>&#8216;\u00fcn\u00fcze import etmeyi unutmay\u0131n:<\/p>\n<pre><code class=\"language-typescript\">\n\/\/ src\/app\/app.module.ts\nimport { NgModule } from '@angular\/core';\nimport { BrowserModule } from '@angular\/platform-browser';\nimport { AppComponent } from '.\/app.component';\nimport { GraphQLModule } from '.\/graphql.module'; \/\/ GraphQL mod\u00fcl\u00fcn\u00fcz\u00fc import edin\n\n@NgModule({\n  declarations: [AppComponent],\n  imports: [\n    BrowserModule,\n    GraphQLModule, \/\/ Buraya ekleyin\n  ],\n  providers: [],\n  bootstrap: [AppComponent],\n})\nexport class AppModule {}\n<\/code><\/pre>\n<h2>Subscription Ba\u011flant\u0131s\u0131n\u0131n Kurulmas\u0131<\/h2>\n<p>Yukar\u0131daki yap\u0131land\u0131rma b\u00f6l\u00fcm\u00fcnde temel olarak de\u011finilmi\u015f olsa da, Subscription ba\u011flant\u0131s\u0131n\u0131n nas\u0131l kuruldu\u011funu ve neden <code>split<\/code> fonksiyonunun kullan\u0131ld\u0131\u011f\u0131n\u0131 daha detayl\u0131 inceleyelim.<\/p>\n<h3>WebSocket Link<\/h3>\n<p>GraphQL Subscriptions, WebSockets \u00fczerinden \u00e7al\u0131\u015ft\u0131\u011f\u0131 i\u00e7in Apollo Client&#8217;\u0131n bir WebSocket ba\u011flant\u0131s\u0131 kurmas\u0131 ve y\u00f6netmesi gerekir. Bu, <code>apollo-link-ws<\/code> paketinden gelen <code>WebSocketLink<\/code> ile sa\u011flan\u0131r. <code>WebSocketLink<\/code>, <code>subscriptions-transport-ws<\/code> k\u00fct\u00fcphanesini temel al\u0131r ve bir WebSocket ba\u011flant\u0131s\u0131n\u0131 y\u00f6netmek i\u00e7in gerekli t\u00fcm mant\u0131\u011f\u0131 i\u00e7erir.<\/p>\n<pre><code class=\"language-typescript\">\nimport { WebSocketLink } from 'apollo-link-ws';\n\nconst ws = new WebSocketLink({\n  uri: 'ws:\/\/localhost:4000\/graphql', \/\/ WebSocket endpoint'inizin adresi\n  options: {\n    reconnect: true, \/\/ Ba\u011flant\u0131 koptu\u011funda otomatik yeniden ba\u011flanmay\u0131 dener\n    timeout: 30000,  \/\/ Yeniden ba\u011flant\u0131 denemeleri aras\u0131ndaki maksimum bekleme s\u00fcresi\n    connectionParams: {\n      \/\/ WebSocket ba\u011flant\u0131s\u0131 kurulurken sunucuya g\u00f6nderilecek parametreler\n      \/\/ Genellikle kimlik do\u011frulama tokenlar\u0131 veya di\u011fer ba\u015flang\u0131\u00e7 verileri buraya konulur.\n      authToken: localStorage.getItem('token'),\n    },\n  },\n});\n<\/code><\/pre>\n<p><code>options<\/code> i\u00e7indeki <code>reconnect: true<\/code> ayar\u0131 \u00e7ok \u00f6nemlidir. Bu, a\u011f kesintileri veya sunucu yeniden ba\u015flatmalar\u0131 durumunda istemcinin otomatik olarak WebSocket ba\u011flant\u0131s\u0131n\u0131 yeniden kurmaya \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flar, bu da uygulaman\u0131n dayan\u0131kl\u0131l\u0131\u011f\u0131n\u0131 art\u0131r\u0131r.<\/p>\n<h3>Apollo Client&#8217;\u0131 Yap\u0131land\u0131rma: Split Fonksiyonu<\/h3>\n<p>Bir GraphQL API genellikle hem HTTP (sorgu ve de\u011fi\u015fiklikler i\u00e7in) hem de WebSocket (abonelikler i\u00e7in) protokollerini kullan\u0131r. Apollo Client&#8217;\u0131n do\u011fru operasyon t\u00fcr\u00fc i\u00e7in do\u011fru ba\u011flant\u0131y\u0131 kullanmas\u0131n\u0131 sa\u011flamak i\u00e7in <code>apollo-link<\/code> paketinden <code>split<\/code> fonksiyonunu kullan\u0131r\u0131z.<\/p>\n<p><code>split<\/code> fonksiyonu \u00fc\u00e7 arg\u00fcman al\u0131r:<\/p>\n<ol>\n<li><strong>Test Fonksiyonu:<\/strong> Gelen GraphQL operasyonunun bir abonelik olup olmad\u0131\u011f\u0131n\u0131 kontrol eden bir fonksiyondur. Bu fonksiyon, operasyonun <code>kind<\/code> ve <code>operation<\/code> \u00f6zelliklerini kontrol ederek karar verir. <code>getMainDefinition<\/code> yard\u0131mc\u0131 fonksiyonu, bir GraphQL d\u00f6k\u00fcman\u0131ndaki ana operasyon tan\u0131m\u0131n\u0131 kolayca alman\u0131z\u0131 sa\u011flar.<\/li>\n<li><strong>True Durumu Linki:<\/strong> Test fonksiyonu <code>true<\/code> d\u00f6nd\u00fcr\u00fcrse kullan\u0131lacak link (yani WebSocket linki).<\/li>\n<li><strong>False Durumu Linki:<\/strong> Test fonksiyonu <code>false<\/code> d\u00f6nd\u00fcr\u00fcrse kullan\u0131lacak link (yani HTTP linki).<\/li>\n<\/ol>\n<pre><code class=\"language-typescript\">\nimport { split } from 'apollo-link';\nimport { getMainDefinition } from '@apollo\/client\/utilities'; \/\/ Veya 'apollo-utilities' eski versiyonlarda\n\nconst link = split(\n  ({ query }) => {\n    const definition = getMainDefinition(query);\n    return (\n      definition.kind === 'OperationDefinition' &&\n      definition.operation === 'subscription'\n    );\n  },\n  ws,   \/\/ Abonelik ise WebSocket linkini kullan\n  http  \/\/ De\u011filse HTTP linkini kullan\n);\n<\/code><\/pre>\n<p>Bu yap\u0131land\u0131rma sayesinde, Apollo Client otomatik olarak do\u011fru protokol\u00fc kullanarak GraphQL operasyonlar\u0131n\u0131 sunucuya g\u00f6nderir. Bu, geli\u015ftiricinin her operasyon i\u00e7in hangi protokol\u00fc kullanaca\u011f\u0131n\u0131 manuel olarak belirtme ihtiyac\u0131n\u0131 ortadan kald\u0131r\u0131r ve kodun temizli\u011fini art\u0131r\u0131r.<\/p>\n<h2>Angular Uygulamas\u0131nda Subscription Kullan\u0131m\u0131<\/h2>\n<p>Apollo Client yap\u0131land\u0131rmas\u0131 tamamland\u0131ktan sonra, Angular bile\u015fenlerinizde GraphQL aboneliklerini kullanmaya ba\u015flayabilirsiniz.<\/p>\n<h3>GraphQL \u015eemas\u0131<\/h3>\n<p>Sunucu taraf\u0131nda bir GraphQL aboneli\u011fi tan\u0131mlanm\u0131\u015f olmal\u0131d\u0131r. \u00d6rne\u011fin, yeni bir yorum eklendi\u011finde bildirim almak i\u00e7in a\u015fa\u011f\u0131daki gibi bir \u015fema tan\u0131m\u0131 olabilir:<\/p>\n<pre><code class=\"language-graphql\">\ntype Comment {\n  id: ID!\n  content: String!\n  author: String!\n}\n\ntype Subscription {\n  newCommentAdded: Comment!\n  commentCountUpdated: Int!\n}\n<\/code><\/pre>\n<p>Bu \u015femada, <code>newCommentAdded<\/code> aboneli\u011fi, her yeni yorum eklendi\u011finde bir <code>Comment<\/code> nesnesini istemciye g\u00f6nderecektir.<\/p>\n<h3>Angular Bile\u015feninde Subscription Olu\u015fturma<\/h3>\n<p>Bir Angular bile\u015feninde abonelik kullanmak i\u00e7in, <code>Apollo<\/code> servisini enjekte etmeniz ve <code>apollo.subscribe()<\/code> metodunu kullanman\u0131z gerekir.<\/p>\n<pre><code class=\"language-typescript\">\n\/\/ src\/app\/comment-list\/comment-list.component.ts\nimport { Component, OnInit, OnDestroy } from '@angular\/core';\nimport { Apollo, gql } from 'apollo-angular';\nimport { Subscription } from 'rxjs';\n\ninterface Comment {\n  id: string;\n  content: string;\n  author: string;\n}\n\ninterface NewCommentAddedSubscription {\n  newCommentAdded: Comment;\n}\n\n@Component({\n  selector: 'app-comment-list',\n  templateUrl: '.\/comment-list.component.html',\n  styleUrls: ['.\/comment-list.component.css'],\n})\nexport class CommentListComponent implements OnInit, OnDestroy {\n  comments: Comment[] = [];\n  private commentsSubscription: Subscription;\n\n  constructor(private apollo: Apollo) {}\n\n  ngOnInit() {\n    \/\/ Mevcut yorumlar\u0131 y\u00fcklemek i\u00e7in bir sorgu da ekleyebilirsiniz\n    this.apollo\n      .query<{ comments: Comment[] }>({\n        query: gql<code>\n          query GetComments {\n            comments {\n              id\n              content\n              author\n            }\n          }\n        <\/code>,\n      })\n      .subscribe(({ data }) => {\n        this.comments = data.comments;\n      });\n\n    \/\/ Yeni yorumlar i\u00e7in abonelik ba\u015flatma\n    const NEW_COMMENT_ADDED_SUBSCRIPTION = gql<code>\n      subscription NewCommentAdded {\n        newCommentAdded {\n          id\n          content\n          author\n        }\n      }\n    <\/code>;\n\n    this.commentsSubscription = this.apollo\n      .subscribe<NewCommentAddedSubscription>({\n        query: NEW_COMMENT_ADDED_SUBSCRIPTION,\n      })\n      .subscribe({\n        next: ({ data }) => {\n          if (data && data.newCommentAdded) {\n            this.comments = [...this.comments, data.newCommentAdded];\n            console.log('Yeni yorum eklendi:', data.newCommentAdded);\n          }\n        },\n        error: (error) => {\n          console.error('Abonelik hatas\u0131:', error);\n        },\n        complete: () => {\n          console.log('Abonelik tamamland\u0131 (genellikle hi\u00e7 olmaz).');\n        },\n      });\n  }\n\n  ngOnDestroy() {\n    \/\/ Bellek s\u0131z\u0131nt\u0131lar\u0131n\u0131 \u00f6nlemek i\u00e7in aboneli\u011fi sonland\u0131r\u0131n\n    if (this.commentsSubscription) {\n      this.commentsSubscription.unsubscribe();\n    }\n  }\n}\n<\/code><\/pre>\n<h3>Ger\u00e7ek Zamanl\u0131 Veri G\u00fcncellemesi<\/h3>\n<p>Yukar\u0131daki \u00f6rnekte, <code>apollo.subscribe()<\/code> metodundan d\u00f6nen Observable&#8217;a abone olduk. <code>next<\/code> callback fonksiyonu, sunucudan her yeni veri geldi\u011finde tetiklenir. Bu callback i\u00e7inde, gelen yeni yorumu mevcut yorumlar dizisine ekleyerek kullan\u0131c\u0131 aray\u00fcz\u00fcn\u00fc g\u00fcncelliyoruz.<\/p>\n<p>\u0130lgili HTML \u015fablonu (<code>comment-list.component.html<\/code>) \u015f\u00f6yle g\u00f6r\u00fcnebilir:<\/p>\n<pre><code class=\"language-html\">\n<h3>Yorumlar<\/h3>\n<ul>\n  <li *ngFor=\"let comment of comments\">\n    <strong>{{ comment.author }}<\/strong>: {{ comment.content }}\n  <\/li>\n<\/ul>\n<\/code><\/pre>\n<p>Bu kurulumla, sunucuda yeni bir yorum eklendi\u011finde (bir mutation tetiklendi\u011finde ve sunucu taraf\u0131nda subscription olay\u0131 yay\u0131nland\u0131\u011f\u0131nda), Angular uygulaman\u0131z an\u0131nda bu yeni yorumu alacak ve listeye ekleyecektir, herhangi bir sayfa yenilemeye veya manuel veri \u00e7ekmeye gerek kalmadan.<\/p>\n<h2>Geli\u015fmi\u015f Konular ve En \u0130yi Uygulamalar<\/h2>\n<p>GraphQL Subscriptions&#8217;\u0131 Angular uygulamalar\u0131n\u0131zda kullan\u0131rken dikkate alman\u0131z gereken baz\u0131 geli\u015fmi\u015f konular ve en iyi uygulamalar bulunmaktad\u0131r.<\/p>\n<h3>Ba\u011flant\u0131 Y\u00f6netimi ve Hata Yakalama<\/h3>\n<p>WebSocket ba\u011flant\u0131lar\u0131 karars\u0131z olabilir. A\u011f kesintileri, sunucu sorunlar\u0131 veya istemcinin \u00e7evrimd\u0131\u015f\u0131 olmas\u0131 gibi durumlar ba\u011flant\u0131n\u0131n kopmas\u0131na neden olabilir. <code>WebSocketLink<\/code>&#8216;in <code>options<\/code> i\u00e7indeki <code>reconnect: true<\/code> ayar\u0131, \u00e7o\u011fu durumda otomatik yeniden ba\u011flant\u0131y\u0131 sa\u011flar. Ancak, daha karma\u015f\u0131k hata senaryolar\u0131n\u0131 ele almak i\u00e7in <code>apollo.subscribe()<\/code> metodunun <code>error<\/code> callback&#8217;ini kullanabilirsiniz. Bu callback, abonelik s\u0131ras\u0131nda olu\u015fan hatalar\u0131 (\u00f6rne\u011fin, sunucu taraf\u0131nda bir hata) yakalaman\u0131za olanak tan\u0131r.<\/p>\n<p>Ayr\u0131ca, Apollo Client&#8217;\u0131n <code>onError<\/code> linkini kullanarak genel hata y\u00f6netimi stratejileri olu\u015fturabilirsiniz. Bu link, hem HTTP hem de WebSocket operasyonlar\u0131ndaki hatalar\u0131 merkezi bir yerden yakalamak i\u00e7in kullan\u0131labilir.<\/p>\n<pre><code class=\"language-typescript\">\nimport { onError } from 'apollo-link-error';\n\nconst errorLink = onError(({ graphQLErrors, networkError }) => {\n  if (graphQLErrors) {\n    graphQLErrors.forEach(({ message, locations, path }) =>\n      console.log(\n        <code>[GraphQL Hata]: Mesaj: ${message}, Konum: ${locations}, Yol: ${path}<\/code>\n      )\n    );\n  }\n  if (networkError) console.log(<code>[A\u011f Hatas\u0131]: ${networkError}<\/code>);\n});\n\n\/\/ Link zincirine errorLink'i ekleyin\nconst link = split(\n  \/\/ ... test fonksiyonu ...\n  ws,\n  http\n);\n\/\/ errorLink'i en ba\u015fa ekleyerek t\u00fcm hatalar\u0131 yakalayabiliriz\nconst finalLink = errorLink.concat(link);\n\/\/ ApolloClientOptions'a finalLink'i verin\n<\/code><\/pre>\n<h3>Kimlik Do\u011frulama (Authentication)<\/h3>\n<p>Ger\u00e7ek zamanl\u0131 uygulamalarda genellikle kullan\u0131c\u0131 kimlik do\u011frulamas\u0131 gerekir. WebSocket ba\u011flant\u0131s\u0131 kurulurken kimlik do\u011frulama token\u0131n\u0131 sunucuya g\u00f6ndermek i\u00e7in <code>WebSocketLink<\/code>&#8216;in <code>connectionParams<\/code> \u00f6zelli\u011fini kullanabilirsiniz:<\/p>\n<pre><code class=\"language-typescript\">\nconst ws = new WebSocketLink({\n  uri: wsUri,\n  options: {\n    reconnect: true,\n    connectionParams: () => { \/\/ Dinamik olarak token almak i\u00e7in bir fonksiyon kullan\u0131n\n      return {\n        authToken: localStorage.getItem('token'), \/\/ Token'\u0131 localStorage'dan al\u0131n\n      };\n    },\n  },\n});\n<\/code><\/pre>\n<p>Sunucu taraf\u0131nda, WebSocket ba\u011flant\u0131s\u0131 kurulurken bu <code>connectionParams<\/code>&#8216;\u0131 al\u0131p kullan\u0131c\u0131n\u0131n kimli\u011fini do\u011frulaman\u0131z ve yaln\u0131zca yetkili kullan\u0131c\u0131lar\u0131n abonelikleri ba\u015flatmas\u0131na izin vermeniz gerekir.<\/p>\n<h3>Veri Y\u00f6netimi ve \u00d6nbellekleme<\/h3>\n<p>Apollo Client&#8217;\u0131n <code>InMemoryCache<\/code>&#8216;i, sorgu ve de\u011fi\u015fiklik sonu\u00e7lar\u0131n\u0131 otomatik olarak \u00f6nbelle\u011fe al\u0131r. Aboneliklerden gelen veriler de genellikle bu \u00f6nbelle\u011fi etkiler. E\u011fer bir abonelik, mevcut bir verinin g\u00fcncellenmi\u015f halini getiriyorsa (\u00f6rne\u011fin, bir kullan\u0131c\u0131n\u0131n durumunun de\u011fi\u015fmesi), Apollo Cache bunu otomatik olarak g\u00fcncelleyebilir. Ancak, abonelik yeni bir \u00f6\u011fe ekliyorsa (\u00f6rne\u011fin, yeni bir yorum), bu \u00f6\u011feyi mevcut bir listeye eklemek i\u00e7in \u00f6nbelle\u011fi manuel olarak g\u00fcncellemeniz gerekebilir.<\/p>\n<p>Bunu yapmak i\u00e7in <code>apollo.subscribe()<\/code> i\u00e7indeki <code>update<\/code> callback&#8217;ini kullanabilirsiniz. Ancak, \u00e7o\u011fu zaman, Angular bile\u015feninde yapt\u0131\u011f\u0131m\u0131z gibi do\u011frudan bile\u015fenin veri dizisini g\u00fcncellemek yeterli ve daha basittir.<\/p>\n<h3>Performans ve \u00d6l\u00e7eklenebilirlik<\/h3>\n<p>Ger\u00e7ek zamanl\u0131 uygulamalar, \u00f6zellikle \u00e7ok say\u0131da e\u015fzamanl\u0131 abone oldu\u011funda, sunucu taraf\u0131nda performans zorluklar\u0131 yaratabilir. Sunucu taraf\u0131nda abonelikleri \u00f6l\u00e7eklendirmek i\u00e7in:<\/p>\n<ul>\n<li><strong>Pub\/Sub (Yay\u0131nla\/Abone Ol) Mekanizmalar\u0131:<\/strong> Redis Pub\/Sub veya Apache Kafka gibi mesaj kuyruklar\u0131 kullanarak olaylar\u0131 farkl\u0131 sunucu \u00f6rnekleri aras\u0131nda da\u011f\u0131tabilirsiniz. GraphQL sunucunuz, bir olay\u0131 bu mesaj kuyru\u011funa yay\u0131nlar ve t\u00fcm ilgili abonelik sunucular\u0131 bu olaylar\u0131 dinleyerek istemcilere iletir.<\/li>\n<li><strong>Verimli WebSocket Sunucular\u0131:<\/strong> Node.js tabanl\u0131 uygulamalar i\u00e7in <code>ws<\/code> veya <code>socket.io<\/code> gibi k\u00fct\u00fcphaneler, binlerce e\u015fzamanl\u0131 WebSocket ba\u011flant\u0131s\u0131n\u0131 y\u00f6netebilir.<\/li>\n<li><strong>Verimli Veritaban\u0131 \u0130zleme:<\/strong> Veritaban\u0131ndaki de\u011fi\u015fiklikleri alg\u0131lamak i\u00e7in verimli mekanizmalar kullan\u0131n (\u00f6rne\u011fin, PostgreSQL&#8217;deki <code>LISTEN\/NOTIFY<\/code> veya MongoDB&#8217;deki Change Streams).<\/li>\n<\/ul>\n<p>\u0130stemci taraf\u0131nda ise, gereksiz aboneliklerden ka\u00e7\u0131nmak ve bile\u015fenler yok edildi\u011finde abonelikleri d\u00fczg\u00fcn bir \u015fekilde sonland\u0131rmak (<code>unsubscribe()<\/code>) \u00f6nemlidir. Aksi takdirde, bellek s\u0131z\u0131nt\u0131lar\u0131 ve gereksiz a\u011f trafi\u011fi olu\u015fabilir.<\/p>\n<h2>\u00d6rnek Senaryolar<\/h2>\n<p>GraphQL Subscriptions&#8217;\u0131n kullan\u0131labilece\u011fi baz\u0131 yayg\u0131n senaryolar:<\/p>\n<ul>\n<li><strong>Sohbet Uygulamas\u0131:<\/strong> Yeni mesajlar\u0131n an\u0131nda t\u00fcm kat\u0131l\u0131mc\u0131lara iletilmesi.<\/li>\n<li><strong>Canl\u0131 Bildirimler:<\/strong> Bir kullan\u0131c\u0131n\u0131n yeni bir takip\u00e7i, be\u011feni veya yorum ald\u0131\u011f\u0131nda an\u0131nda bildirim almas\u0131.<\/li>\n<li><strong>Ger\u00e7ek Zamanl\u0131 Analitik Panolar\u0131:<\/strong> Veri ak\u0131\u015f\u0131ndaki de\u011fi\u015fikliklerin veya metriklerin an\u0131nda g\u00fcncellenmesi.<\/li>\n<li><strong>Oyun Durumu G\u00fcncellemeleri:<\/strong> \u00c7ok oyunculu oyunlarda oyuncu pozisyonlar\u0131n\u0131n veya oyun durumu de\u011fi\u015fikliklerinin an\u0131nda senkronize edilmesi.<\/li>\n<li><strong>Finansal Piyasalar:<\/strong> Hisse senedi fiyatlar\u0131 veya kripto para birimi kurlar\u0131n\u0131n ger\u00e7ek zamanl\u0131 olarak g\u00fcncellenmesi.<\/li>\n<\/ul>\n<p>Bu senaryolar, aboneliklerin kullan\u0131c\u0131 deneyimini nas\u0131l zenginle\u015ftirebilece\u011fini ve uygulamalar\u0131n daha dinamik hale gelmesini sa\u011flayabilece\u011fini g\u00f6stermektedir.<\/p>\n<h2>Sonu\u00e7<\/h2>\n<p>GraphQL Subscriptions, modern web uygulamalar\u0131nda ger\u00e7ek zamanl\u0131 veri ak\u0131\u015f\u0131n\u0131 sa\u011flamak i\u00e7in g\u00fc\u00e7l\u00fc ve zarif bir \u00e7\u00f6z\u00fcmd\u00fcr. Geleneksel HTTP tabanl\u0131 yakla\u015f\u0131mlar\u0131n s\u0131n\u0131rlamalar\u0131n\u0131 a\u015farak, istemcilerin sunucudaki olaylara abone olmas\u0131na ve bu olaylar ger\u00e7ekle\u015fti\u011finde an\u0131nda g\u00fcncel veriyi almas\u0131na olanak tan\u0131r.<\/p>\n<p>Angular ve Apollo Client 2.0 (veya ilgili s\u00fcr\u00fcmleri) ile GraphQL Subscriptions&#8217;\u0131 entegre etmek, <code>apollo-angular<\/code>, <code>apollo-link-ws<\/code> ve <code>subscriptions-transport-ws<\/code> gibi k\u00fct\u00fcphaneler sayesinde olduk\u00e7a basittir. <code>split<\/code> fonksiyonu, HTTP ve WebSocket ba\u011flant\u0131lar\u0131n\u0131 sorunsuz bir \u015fekilde birle\u015ftirerek geli\u015ftiricilerin operasyon t\u00fcr\u00fcne g\u00f6re do\u011fru protokol\u00fc kullanma karma\u015f\u0131kl\u0131\u011f\u0131ndan kurtar\u0131r.<\/p>\n<p>Bu makalede sunulan ad\u0131mlar\u0131 ve en iyi uygulamalar\u0131 takip ederek, Angular uygulamalar\u0131n\u0131za ger\u00e7ek zamanl\u0131 yetenekler ekleyebilir, kullan\u0131c\u0131 deneyimini \u00f6nemli \u00f6l\u00e7\u00fcde geli\u015ftirebilir ve daha etkile\u015fimli, dinamik uygulamalar olu\u015fturabilirsiniz. Ger\u00e7ek zamanl\u0131 veri ak\u0131\u015f\u0131, modern web geli\u015ftirmenin vazge\u00e7ilmez bir par\u00e7as\u0131 haline gelmi\u015ftir ve GraphQL Subscriptions bu alanda lider \u00e7\u00f6z\u00fcmlerden biridir.<\/p>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"GraphQL Subscriptions in Angular using Apollo 2.0: Ger\u00e7ek Zamanl\u0131 Uygulamalar \u0130\u00e7in Kapsaml\u0131 Bir Rehber\nModern web uygulamalar\u0131, kullan\u0131c\u0131lar","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":[1488],"tags":[],"class_list":{"0":"post-37316","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-angular","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>GraphQL Subscriptions in Angular using Apollo 2.0: Ger\u00e7ek Zamanl\u0131 Uygulamalar \u0130\u00e7in Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\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\/graphql-subscriptions-in-angular-using-apollo-2-0-gercek-zamanli-uygulamalar-icin-kapsamli-bir-rehber\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"GraphQL Subscriptions in Angular using Apollo 2.0: Ger\u00e7ek Zamanl\u0131 Uygulamalar \u0130\u00e7in Kapsaml\u0131 Bir Rehber\" \/>\n<meta property=\"og:description\" content=\"GraphQL Subscriptions in Angular using Apollo 2.0: Ger\u00e7ek Zamanl\u0131 Uygulamalar \u0130\u00e7in Kapsaml\u0131 Bir Rehber Modern web uygulamalar\u0131, kullan\u0131c\u0131lar\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/graphql-subscriptions-in-angular-using-apollo-2-0-gercek-zamanli-uygulamalar-icin-kapsamli-bir-rehber\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-12-30T14:40:50+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=\"16 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/graphql-subscriptions-in-angular-using-apollo-2-0-gercek-zamanli-uygulamalar-icin-kapsamli-bir-rehber\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/graphql-subscriptions-in-angular-using-apollo-2-0-gercek-zamanli-uygulamalar-icin-kapsamli-bir-rehber\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"GraphQL Subscriptions in Angular using Apollo 2.0: Ger\u00e7ek Zamanl\u0131 Uygulamalar \u0130\u00e7in Kapsaml\u0131 Bir Rehber\",\"datePublished\":\"2025-12-30T14:40:50+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/graphql-subscriptions-in-angular-using-apollo-2-0-gercek-zamanli-uygulamalar-icin-kapsamli-bir-rehber\/\"},\"wordCount\":2410,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Angular\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/graphql-subscriptions-in-angular-using-apollo-2-0-gercek-zamanli-uygulamalar-icin-kapsamli-bir-rehber\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/graphql-subscriptions-in-angular-using-apollo-2-0-gercek-zamanli-uygulamalar-icin-kapsamli-bir-rehber\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/graphql-subscriptions-in-angular-using-apollo-2-0-gercek-zamanli-uygulamalar-icin-kapsamli-bir-rehber\/\",\"name\":\"GraphQL Subscriptions in Angular using Apollo 2.0: Ger\u00e7ek Zamanl\u0131 Uygulamalar \u0130\u00e7in Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-12-30T14:40:50+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/graphql-subscriptions-in-angular-using-apollo-2-0-gercek-zamanli-uygulamalar-icin-kapsamli-bir-rehber\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/graphql-subscriptions-in-angular-using-apollo-2-0-gercek-zamanli-uygulamalar-icin-kapsamli-bir-rehber\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/graphql-subscriptions-in-angular-using-apollo-2-0-gercek-zamanli-uygulamalar-icin-kapsamli-bir-rehber\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"GraphQL Subscriptions in Angular using Apollo 2.0: Ger\u00e7ek Zamanl\u0131 Uygulamalar \u0130\u00e7in Kapsaml\u0131 Bir Rehber\"}]},{\"@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":"GraphQL Subscriptions in Angular using Apollo 2.0: Ger\u00e7ek Zamanl\u0131 Uygulamalar \u0130\u00e7in Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","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\/graphql-subscriptions-in-angular-using-apollo-2-0-gercek-zamanli-uygulamalar-icin-kapsamli-bir-rehber\/","og_locale":"tr_TR","og_type":"article","og_title":"GraphQL Subscriptions in Angular using Apollo 2.0: Ger\u00e7ek Zamanl\u0131 Uygulamalar \u0130\u00e7in Kapsaml\u0131 Bir Rehber","og_description":"GraphQL Subscriptions in Angular using Apollo 2.0: Ger\u00e7ek Zamanl\u0131 Uygulamalar \u0130\u00e7in Kapsaml\u0131 Bir Rehber Modern web uygulamalar\u0131, kullan\u0131c\u0131lar","og_url":"https:\/\/fatihsoysal.com\/blog\/graphql-subscriptions-in-angular-using-apollo-2-0-gercek-zamanli-uygulamalar-icin-kapsamli-bir-rehber\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-12-30T14:40:50+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"16 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/graphql-subscriptions-in-angular-using-apollo-2-0-gercek-zamanli-uygulamalar-icin-kapsamli-bir-rehber\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/graphql-subscriptions-in-angular-using-apollo-2-0-gercek-zamanli-uygulamalar-icin-kapsamli-bir-rehber\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"GraphQL Subscriptions in Angular using Apollo 2.0: Ger\u00e7ek Zamanl\u0131 Uygulamalar \u0130\u00e7in Kapsaml\u0131 Bir Rehber","datePublished":"2025-12-30T14:40:50+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/graphql-subscriptions-in-angular-using-apollo-2-0-gercek-zamanli-uygulamalar-icin-kapsamli-bir-rehber\/"},"wordCount":2410,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Angular"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/graphql-subscriptions-in-angular-using-apollo-2-0-gercek-zamanli-uygulamalar-icin-kapsamli-bir-rehber\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/graphql-subscriptions-in-angular-using-apollo-2-0-gercek-zamanli-uygulamalar-icin-kapsamli-bir-rehber\/","url":"https:\/\/fatihsoysal.com\/blog\/graphql-subscriptions-in-angular-using-apollo-2-0-gercek-zamanli-uygulamalar-icin-kapsamli-bir-rehber\/","name":"GraphQL Subscriptions in Angular using Apollo 2.0: Ger\u00e7ek Zamanl\u0131 Uygulamalar \u0130\u00e7in Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-12-30T14:40:50+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/graphql-subscriptions-in-angular-using-apollo-2-0-gercek-zamanli-uygulamalar-icin-kapsamli-bir-rehber\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/graphql-subscriptions-in-angular-using-apollo-2-0-gercek-zamanli-uygulamalar-icin-kapsamli-bir-rehber\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/graphql-subscriptions-in-angular-using-apollo-2-0-gercek-zamanli-uygulamalar-icin-kapsamli-bir-rehber\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"GraphQL Subscriptions in Angular using Apollo 2.0: Ger\u00e7ek Zamanl\u0131 Uygulamalar \u0130\u00e7in Kapsaml\u0131 Bir Rehber"}]},{"@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\/37316","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=37316"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/37316\/revisions"}],"predecessor-version":[{"id":37317,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/37316\/revisions\/37317"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=37316"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=37316"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=37316"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}