AWS Türkçe Blog

AWS AppSync Events’i Duyuruyoruz: Her ölçekte gerçek zamanlı web ve mobil deneyimleri destekleyen sunucusuz WebSocket API’leri

Orjinal makale:  Link

AWS AppSync, geliştiricilerin güvenli ve performanslı sunucusuz WebSocket API’leri kullanarak gerçek zamanlı olay verilerini birkaç veya milyonlarca aboneye kadar kolayca yayınlamasına olanak tanıyan AWS AppSync Events özelliğini duyurdu. AWS AppSync Events ile geliştiricilerin artık WebSocket altyapısı kurmak, bağlantı durumunu yönetmek ve fan-out uygulamak gibi konularda endişelenmeleri gerekmiyor. Geliştiriciler sadece API’lerini oluşturarak WebSocket bağlantısı üzerinden abone olan istemcilere yayınlanan olayları yayınlayabilirler. AWS AppSync Event API’leri sunucusuzdur, böylece kuruluma hızlıca başlayabilirsiniz, API’leriniz otomatik olarak ölçeklenir ve yalnızca kullandığınız kadar ödersiniz. Bu blog yazısında, AWS AppSync Events’i anlatacak, AWS AppSync Event API’lerinin ne olduğunu açıklayacak ve nasıl kullanabileceğinizi göstereceğiz.

Gerçek zamanlı olay güncellemeleri, günümüzdeki uygulamaların önemli bir bileşenidir ve kullanıcılara farklılaştırılmış bir deneyim sunar. Canlı spor skorlarından, grup sohbet mesajlarına, fiyat çizelgelerine veya konum güncellemelerine kadar, geliştiriciler müşterilerine saniye saniye son dakika bilgileri sağlayan uygulamalar oluşturmak isterler. Ancak bu işlevselliği uygulamak kolay değil ve ölçeklendirmesi zordur. Bu durum AWS AppSync Events ile değişiyor. AWS AppSync Event API’leri kurulumu oldukça kolay, böylece geliştiriciler hızlı bir şekilde kuruluma başlayabilir ve standart Web API’lerini kullanarak WebSocket uç noktalarına bağlanabilirler. AWS AppSync Event API’leri sunucusuzdur ve milyonlarca bağlı istemciye gerçek zamanlı güncellemeler yayınlayacak şekilde ölçeklenebilir. Olay odaklı mimarilere yatırım yapan kuruluşlar için, AWS AppSync Events bir HTTP uç noktası üzerinden yayınlamayı destekler. Bu, Amazon EventBridge gibi popüler hizmetlerle entegrasyonu basitleştirir ve arka uçta oluşturulan olayları web ve mobil uygulamalara yayınlamayı kolaylaştırır.

AWS AppSync Events ile, hangi yetkilendirme modlarının desteklendiği gibi temel yapılandırmayı tanımlayarak bir API oluşturmaya başlarsınız. Ardından, bir isim atayarak kanal ad alanınızı oluşturursunuz; bu isim aynı zamanda bu ad alanı içindeki tüm kanalların önekidir. Bir kanal ad alanı, kanallarının yeteneklerini tanımlar. Örneğin, “messages” adında bir kanal ad alanı /messages ile başlayan kanallara yayınlamanıza ve abone olmanıza izin verir. Bir ad alanındaki kanallar geçicidir ve gerektiğinde oluşturulur. Örneğin, /messages/group/admin veya /messages/user/JohnDoe kanallarına istek üzerine olaylar yayınlayabilirsiniz. /messages/user/JohnDoe gibi belirli bir kanaldaki olaylara abone olabilir veya /messages/* ya da /messages/user/* gibi bir kanal yolunun sonunda joker karakter kullanarak bir alt kümeye abone olabilirsiniz.

Konsolda başlarken

Kuruluma AWS AppSync konsolunu ziyaret ederek başlayabilirsiniz. Oradan “Create API”yi (API Oluştur) seçin ve “Event API”yi (Olay API’si) seçin. API’nize bir isim verin ve “Create”e (Oluştur) tıklayın. Birkaç saniye içinde API’niz oluşturulur ve kullanıma hazır hale gelir. Konsolda, AppSync sizin için bir Event API, varsayılan bir ad alanı ve bir API anahtarı oluşturur. Aynı sonucu AWS CLI, AWS SDK’ları, AWS CloudFormation veya AWS CDK ile de elde edebilirsiniz.

Ardından, Pub/Sub Editor‘a (Yayınlama/Abone Olma Düzenleyicisi) gidin. Bu düzenleyici, doğrudan konsoldan yayınlama ve abone olma işlemlerini kolayca yapmanızı sağlar. Fikirleri hızlıca test etmek ve işlevselliği doğrulamak için harika bir yoldur. Düzenleyiciyi HTTP üzerinden olaylar yayınlamak ve WebSocket bağlantısı üzerinden abonelikler kurmak için kullanabilirsiniz. Olayları almak için, Abone Ol bölümünde “Connect” (Bağlan) ve ardından “Subscribe” (Abone Ol) seçeneğini seçin. API’niz artık kanala yayınlanan olayları almaya hazırdır. HTTP uç noktası, en fazla 5 olaydan oluşan toplu yayınları destekler. Konsoldan yayın yapmak için, basitçe bir JSON nesneleri dizisi kullanin. Örneğin, Yayınla bölümüne şu değerleri girin:

[
  { "message": "hello world!" },
  "New WebSocket API!",
  true,
  100,
  ["L", "G", "T", "M"]
]

Abone Ol bölümünde 5 olay görürsünüz!

alınan olayların listesini gösteren bir tablo

Uygulamanızla Entegrasyon

AWS AppSync Events kullanan bir uygulama oluşturmak oldukça basittir. AppSync Events için Amplify istemcisini kullanabilir ve API’nizin yapılandırma bilgilerini konsolun Integrations (Entegrasyonlar) sekmesinde bulabilirsiniz.

API’nize bir web tarayıcısından bağlanmak için herhangi bir harici bağımlılığa ihtiyaç olmadığını unutmayın. Aşağıdaki JavaScript kod parçası, tarayıcının Web API WebSocket özelliğini kullanarak uç noktanıza nasıl bağlanabileceğinizi gösteriyor. Bu kodu kullanmak için, Event API Settings (Ayarlar) sayfanızdan HTTP ve gerçek zamanlı DNS adlarınızı alın ve API anahtarınızı kopyalayın. Ardından, sayfanızın geliştirici konsolunu açın. Değerlerinizi kod parçacığına ekleyin, kod parçacığını geliştirici konsolunun düzenleyicisine yapıştırın ve kodu çalıştırın.


const REALTIME_DOMAIN = ''
const HTTP_DOMAIN = ''
const API_KEY = ''

const authorization = { 'x-api-key': API_KEY, host: HTTP_DOMAIN }

function getAuthProtocol() {
  const header = btoa(JSON.stringify(authorization))
    .replace(/\+/g, '-') // '+' karakterini '-' ile değiştir
    .replace(/\//g, '_') // '/' karakterini '_' ile değiştir
    .replace(/=+$/, '') // Dolgu karakteri `=` kaldır
  return `header-${header}`
}

const socket = await new Promise((resolve, reject) => {
  const socket = new WebSocket(
    `wss://${REALTIME_DOMAIN}/event/realtime`,
    ['aws-appsync-event-ws', getAuthProtocol()])
  socket.onopen = () => {
    socket.send(JSON.stringify({ type: 'connection_init' }))
    resolve(socket)
  }
  socket.onclose = (evt) => reject(new Error(evt.reason))
  socket.onmessage = (event) => console.log('=>', JSON.parse(event.data))
})

socket.send(JSON.stringify({
  type: 'subscribe',
  id: crypto.randomUUID(),
  channel: '/default/*',
  authorization
}))

Tarayıcınızın Web API fetch metodunu kullanarak yeni olaylar gönderebilirsiniz. Örneğin, geliştirici konsolunda aşağıdakileri çalıştırabilirsiniz.

const event = {
  "channel": "/default/introductions",
  "events": [
    JSON.stringify({message:'Hello World! Introducing AWS AppSync Events!'})
  ]
}

const response = await fetch(`https://${HTTP_DOMAIN}/event`, {
  method: 'POST',
  headers: authorization,
  body: JSON.stringify(event)
})

console.log(response)

Bağlantı, yetkilendirme ve WebSockets kullanımı hakkında daha fazla bilgi edinmek için dokümantasyonumuza bakabilirsiniz.

Olay işleyicilerle çalışmak

AWS AppSync Events ile, yayınlanan olaylar işlenirken ve istemciler bir kanala abone olmaya çalıştığında bir iş mantığı tanımlayabilirsiniz. Bu, kanal ad alanlarınızda tanımlanan işlevler olan olay işleyicileri ile yapılır. Olay işleyicileri isteğe bağlıdır ve bir kanal ad alanıyla sınırlıdır. AWS AppSync Events 2 tür işleyiciyi destekler: onPublish (Yayınlama) işleyicileri ve onSubscribe (Abone Olma) işleyicileri. Bir onPublish işleyicisi, olaylar iletildiğinde ve bağlı istemcilere yayınlanmadan önce çağrılır. onPublish işleyicinizden, olay yüklerinizin şeklini dönüştürebilir, olayları filtreleyebilir ve yayınlanan olayları reddedebilirsiniz. İşleyiciler APPSYNC_JS çalışma zamanında çalışır, bu yüzden sadece JavaScript yazmanız yeterlidir. Örneğin, olayları dönüştürmek için, sadece olay dizinizde map fonksiyonunu olay id ve olay payload döndürdüğünüzden emin olarak çağırabilirsiniz. 

export function onPublish(ctx) {
  return ctx.events.map(event => ({
    id: event.id,
    payload: {
      ...event.payload,
      message: event.payload.message.toUpperCase()
    }
  }))
}

Olayları filtrelemek ve sessizce düşürerek abone olan istemcilere yayınlanmamasını sağlamak için, listeyi filtreleyebilir ve yayınlanmasını istediğiniz içeriği döndürebilirsiniz. Örneğin, olaylar dizisinde filter fonksiyonunu çağırabilirsiniz. Diyelim ki sadece kazanma olasılığı %90’dan fazla olan bir oyun için olayları yayınlamak istiyorsunuz:

export function onPublish(ctx) {
  return ctx.events.filter(event => event.payload.odds > 0.9)
}

Filtreleme, olayları sessizce düşürmenize olanak tanır, ancak olayı düşürürken yayıncılara hata da döndürebilirsiniz. Örneğin, olayların her zaman bir selamlama mesajı içermesi gerektiğini zorunlu kılmak ve yayıncıya bir hata döndürmek için:

export function onPublish(ctx) {
  return ctx.events.map(event => {
    if (!event.payload.message) {
      return {
        ...event,
        error: 'You should always included a greeting.'
      }
    }
    return event
  })
}

onSubscribe işleyicisi, bir istemci abonelik kurmaya çalıştığında çağrılır. util.unauthorized() çağrısı yaparak bir aboneliği reddedebilirsiniz. Amazon Cognito User Pools ile kimliği doğrulanmış kullanıcılarınızı kendi kanallarıyla sınırlamak istediğinizi düşünün:

export function onSubscribe(ctx) {
  if (ctx.info.channel.path !== `/messages/inbox/${ctx.identity.username}`) {
    console.error(`user ${ctx.identity.username} tried connecting to wrong channel: ${ctx.info.channel.path}`)
    util.unauthorized()
  }
}

Artık istemciler yalnızca /messages/inbox/<username> desenine uyan kanallara abone olabilirler.

Olay Odaklı Mimari (Event Driven Architecture – EDA)

AWS AppSync Events, EDA örüntüleri ile sorunsuz bir şekilde uyum sağlar. Amazon EventBridge ile olayları AWS AppSync Events HTTPS uç noktasına iletmek için bir API hedefi yapılandırabilirsiniz.

EventBridge konsolunda, yetkilendirme türü olarak “API Key” (API Anahtarı) ile yeni bir bağlantı oluşturun. API Key name (API Anahtarı adı) için x-api-key girin ve Value (Değer) için API anahtarınızın değerini girin. Ardından, yeni bir API hedefi oluşturun. API destination endpoint (API hedef uç noktası) için https://<HTTP_DOMAIN>/event formatını kullanın; burada <HTTP_DOMAIN>, daha önce kopyaladığınız HTTP etki alanınızdır. HTTP method (HTTP yöntemi) olarak POST ayarlayın. Connection type (Bağlantı türü) için, az önce oluşturduğunuz bağlantıyı seçin ve hedefi oluşturun. Artık hedefi bir hedef olarak kullanan bir kural oluşturabilirsiniz. Hedefinizin giriş yolu (InputPath) için "$.detail" belirtin; bu, tüm olay ayrıntılarını Event API’nize iletecektir.

Artık olayları AWS AppSync Event’e iletebilirsiniz. Örneğin, aşağıdaki event detail (olay ayrıntısı) kullanarak EventBridge’e yayınlayabilirsiniz.

{
  "channel": "/default/introductions",
  "events": [
    "{\"message\":\"Hello from EventBridge!\"}"
  ]
}

API yeteneklerini keşfetme

API’nizi birden fazla yetkilendirme moduyla yapılandırabilir ve kanal ad alanlarınızın her birinde farklı yetkilendirme davranışları yapılandırabilirsiniz. API’nize özel bir etki alanı ilişkilendirebilir ve daha fazla koruma sağlamak için bir AWS Web Application Firewall ekleyebilirsiniz. Amazon CloudWatch Metrics ve Amazon CloudWatch Logs ile entegrasyon da mevcuttur, bu da API’nizin performansı hakkında tam bir iç görü sağlar.

Sırada Ne Var

Bu makalede, AWS AppSync Events’i tanıttık ve bir AWS AppSync Event API ile nasıl başlayabileceğinizi açıkladık. Kanal ad alanlarını, kanalları, işleyicileri ve Amazon EventBridge ile nasıl entegre edileceğini anlattık.

Bu lansman, AWS AppSync Events için önemli bir kilometre taşı, ancak biz henüz yeni başlıyoruz. Yakın gelecekte, çift yönlü WebSocket’ler ve veri kaynakları için destek eklemeyi planlıyoruz. Bu, özel kaynaklar ve hedefler oluşturmanıza olanak tanıyacak ve Amazon DynamoDB veya Amazon Aurora gibi veri kaynaklarını kullanarak olaylarınızı zenginleştirmenize veya kalıcı hale getirmenize izin verecek. İşleyicilere alternatif olarak AWS Lambda fonksiyonlarını eklemeyi planlıyoruz. Ayrıca, tip şekillerini kolayca paylaşmak ve uygulamak için şema doğrulamasını desteklemeyi planlıyoruz. Takipte kalın!

Sonuç

AWS AppSync Events, AWS AppSync’ın mevcut olduğu tüm bölgelerde artık kullanılabilir durumdadır. İlk Event API’nizi oluşturmak için AWS AppSync konsolunu ziyaret edebilirsiniz. AWS AppSync Events sunucusuz bir özelliktir: yalnızca AWS AppSync Event API işlemleri ve gerçek zamanlı bağlantı dakikaları için ödeme yaparsınız. Ayda 250.000 gerçek zamanlı Event API işlemi ile ücretsiz olarak başlayın. AWS AppSync Events hakkında daha fazla bilgi edinmek için dokümantasyonumuzu ziyaret edin. Fiyatlandırma hakkında daha fazla bilgi için fiyatlandırma sayfamıza bakın.


AWS AppSync, uygulamaları olaylara, verilere ve yapay zeka modellerine bağlamayı kolaylaştırır. AWS AppSync Events ile, herhangi bir olay kaynağından güncellemeleri sunucusuz WebSocket’ler üzerinden abone olan istemcilere yayınlayarak gerçek zamanlı deneyimler oluşturabilirsiniz. AWS AppSync GraphQL ile, uygulamaları tek bir GraphQL API uç noktası aracılığıyla birden fazla veritabanına, mikroservise ve yapay zeka modeline bağlayabilirsiniz.