Google Cloud Kullanarak Sunucusuz Node.js İşlevlerini Uygulama

Yayınlanan: 2022-03-11

Yazılım oluşturmak iyi kod yazmakla bitmez. Yazılım dağıtıldığında ve istekleri düzgün bir şekilde işleyebildiğinde ve performansı ve çalıştırma maliyetini engellemeden ölçeklendirebildiğimiz zaman tamamlanır.

Muhtemelen tüm bunları halletmek için bulut bilişime nasıl sahip olduğunuzu düşünüyorsunuz. "Peki bu yeni sunucusuz şey nedir, Vignes?"

Google Cloud Kullanan Sunucusuz Node.js İşlevleri

Sunucusuz bilgi işlem, kodun bir bulut platformunda yürütüldüğü ve donanım ve yazılım kurulumu, güvenlik, performans ve CPU boşta kalma süresi maliyetleri hakkında endişelenmemize gerek olmayan bir mimari tarzıdır. Yazılım ortamını da soyutlayan altyapının ötesine geçen bir bulut bilişim ilerlemesidir. Bu, kodu çalıştırmak için herhangi bir yapılandırma gerekmediği anlamına gelir.

Sunucusuz ile çalışma tarzınız aşağıdakiler olacaktır:

  1. Kodu geliştirin.

  2. Kodu servis sağlayıcıya yükleyin.

  3. Tetikleyiciyi yapılandırın (bizim durumumuzda bir HTTP isteği).

İşimiz bitti! Artık platform sağlayıcı, gelen isteklerle ve ölçeklendirmeyle ilgilenecek.

Sunucusuz Mikro Hizmetlere Giriş

Sunucusuz mimari, genellikle bir mikro hizmet tarzı tasarımla birleştirilir. Bir mikro hizmet, belirli bir modül için istekleri işleyen büyük yazılımın bağımsız bir parçasıdır. Sunucusuz bir ortamda çalışabilen mikro hizmetler oluşturarak, kodun bakımını yapmak ve dağıtımları hızlandırmak kolaylaşır.

AWS Lambda ve GCF'ye Giriş, Bir Karşılaştırma

Sunucusuz bir özelliğe genellikle "hizmet olarak arka uç" veya "hizmet olarak işlev" adı verilir. Sunucusuz bilgi işlem sağlayıcılarının sayısı artmaya başlıyor. Bununla birlikte, geleneksel büyük oyuncuların bazıları, Amazon Web Services'in AWS Lambda Functions ve Google Cloud'un Google Cloud Functions (GCF) gibi sunucusuz seçenekler de sunar; bunlardan ikincisi, şu anda beta sürümündeyken kullanıyorum. Benzer şekilde çalışmasına rağmen, aralarında birkaç önemli fark vardır.

AWS Lambda Google Bulut İşlevleri
Dil desteği Node.js, Python, C#, Java Node.js
tetikleyiciler DynamoDB, Kinesis, S3, SNS, API ağ geçidi (HTTP), CloudFront, + daha fazlası HTTP, Cloud PubSub, Bulut depolama paketi
Maksimum yürütme süresi 300 saniye 540 saniye

Bu makalede, GCF kullanarak sunucusuz kod dağıtımı uygulama sürecini inceleyeceğiz. Google Cloud Functions, bir sunucuyu veya çalışma zamanı ortamını yönetmeye gerek kalmadan bulut olaylarına yanıt veren küçük, tek amaçlı işlevler oluşturmanıza olanak tanıyan hafif, olay tabanlı, eşzamansız bir bilgi işlem çözümüdür.

GCF'nin tetikleyicilere göre ayrılmış üç olası uygulaması vardır.

  1. HTTP tetikleyici HTTP isteklerini bulut işlevlerine yönlendirir

  2. Dahili Google pub/sub tetikleyici Rotalar, bulut işlevlerine yayın ve abonelik istekleri

  3. Bulut depolama paketi tetikleyicisi Depolama paketinde yapılan tüm değişiklikleri bulut işlevine yönlendirir

Google Cloud Functions'ı kullanarak bir HTTP tetikleyici tabanlı kurulum oluşturalım

Google Cloud Functions, herhangi bir ek özel kurulum veya kurulum gerektirmez. GCF, varsayılan düğüm ortamının kurulmasını ve yürütmeye hazır olmasını sağlar. Tetikleyici olarak HTTP ile bir bulut işlevi oluşturulduğunda, işlevi tetiklemek için bir URL sağlar. API ağ geçidini kendisiyle iletişim kurmak için bir araç olarak kullanan AWS Lambda ile karşılaştırıldığında, Google Cloud Functions, proje projectID ve bölgeye göre hemen URL'yi sağlar.

Google Cloud Platform Şeması - Bulut İşlevleri ve AWS Lambda

Sunucusuz Node.js Uygulaması Oluşturma

Kodumuzu GCF'de çalıştırılabilir hale getirmek için kodu tek bir fonksiyon içine sarmalıyız. GCF, tetikleyici oluştuğunda bu belirli işlevi çağırır. Bunu yapmanın olası yolları yükleme,

  1. Tek dosya: İsteğe göre diğer işlevleri çağıracak varsayılan bir işlevi dışa aktarın.

  2. Birden çok dosya: Diğer tüm dosyaları gerektiren ve başlangıç ​​noktası olarak varsayılan işlevi dışa aktaran bir index.js dosyasına sahip olun.

  3. Birden çok dosya: Başlangıç ​​noktası olarak "main": "main.js" kullanılarak package.json yapılandırılmış bir ana dosyaya sahip olun.

Yukarıdaki yöntemlerden herhangi biri işe yarayacaktır.

GCF, desteklenen belirli bir Düğüm çalışma zamanı sürümüne sahiptir. Kodun söz konusu sürümü desteklemek için yazıldığından emin olun. Bu gönderiyi oluştururken GCF, Düğüm v6.11.1 sürümünü desteklemektedir.

Bir işlev oluşturmak için, dikkate alınması gereken birkaç seçenek vardır.

  1. Bellek Bu, bir çalışma süresi için isteği işlemek için ne kadar belleğe ihtiyaç olduğunu söyler. MB olarak tanımlanmıştır. Küçük bir uygulama için 128MB oldukça yeterli olmalı, ancak 2GB'a kadar artırılabilir.

  2. Timeout Timeout, adından da anlaşılacağı gibi, beklenen kod yürütme zaman aşımını tanımlar. Bundan sonra kod öldürülecek ve durdurulacaktır. Bu noktadan sonra herhangi bir yürütme aniden duracaktır. Maksimum zaman aşımı 540 saniyedir.

  3. Yürütülecek işlev Ana işleyici dosyasından birden fazla işlev dışa aktarılabilse de, isteği işlemek için tetiklenmesi gereken bir işlevi yapılandırmamız gerekir. Bu, geliştiricinin HTTP yöntemine/URL'ye dayalı olarak birden çok giriş noktasına sahip olmasını sağlar.

Kodu yüklemek için, bir işlev portalı oluşturmak üzere kodun bir kopyala yapıştırını yapmanız yeterlidir. Birden fazla dosya için içeriği sıkıştırın ve dosyayı yükleyin. Bir ZIP dosyası söz konusu olduğunda, ana dosyanın belirtildiği bir index.js dosyası veya bir package.json dosyası olması gerektiğinden emin olun.

Herhangi bir NPM modülü bağımlılığı package.json içinde belirtilmelidir. GCF, ilk kurulum sırasında package.json dosyasında belirtilen modülleri yüklemeye çalışır.

200 durumu ve bir miktar mesaj döndürmek için basit bir işleyici oluşturalım. Bir fonksiyon oluşturun ve aşağıdaki kodu kaynağa ekleyin.

 exports.httpServer = function httpServer(req, res) { console.log(req); res.status(200).send('Server is working'); } 

Oluşturulan işlevin ekran görüntüsü

İşlev oluşturulduktan sonra, işlevi tetiklemek için sağlanan URL'yi açın. Aşağıdaki gibi yanıt vermelidir.

Tarayıcı çıktısının ekran görüntüsü "Sunucu çalışıyor"

Şimdi req nesnesini inceleyelim. Günlükleri görüntülemek için GCF, doğrudan konsoldan seçenekler sunar. Dikey noktalara tıklayın ve günlükler seçeneğini açın.

Günlükler seçeneğini açmanın ekran görüntüsü

Şimdi, /users için basit yolları işlemek için kodu güncelleyelim.

/users yolu için basit bir GET & POST isteğini işlemek için aşağıdaki kod kullanılır:

 exports.httpServer = function httpServer(req, res) { const path = req.path; switch(path) { case '/users': handleUsers(req, res); break; default: res.status(200).send('Server is working'); } }; const handleUsers = (req, res) => { if (req.method === 'GET') { res.status(200).send('Listing users...'); } else if (req.method === 'POST') { res.status(201).send('Creating User...') } else { res.status(404); } }

Güncellemeden sonra şimdi tarayıcıda test edelim, ancak bu sefer sonunda /users ile.

Tarayıcı çıktısının ekran görüntüsü "Kullanıcılar listeleniyor..."

Çok havalı. Yönlendirme ile temel bir HTTP sunucusu oluşturduk.

İşlemler ve Hata Ayıklama

Hikayenin bittiği yerde kod olsaydı, sunucusuz Node.js uygulamaları gibi altyapı seçeneklerini araştırmazdınız. Dağıtım ve hata ayıklama gibi genel görevlerle nasıl ilgilenileceğinin kısa bir özeti burada. Node.js geliştiricilerinin diğer uygulamalar için zaten yaptıkları şeyler.

Dağıtım:

İşlevler için kod dört şekilde dağıtılabilir.

  • Kodu konsola yapıştırarak kopyalayın

  • ZIP dosyası yükleme

  • Bulut depolama paketinden ZIP dosyası olarak dağıtma

  • Bulut kaynağı deposundan dağıtma

En uygun seçenek, açıkçası, bir kaynak deposundan dağıtmaktır.

Çağrı:

Konsol, işlevi oluştururken, işlevi tetiklemek için şu biçimdeki HTTP URL'sini sağlar: https://<region>-<project-id>.cloudfunctions.net/<function-name>

AWS Lambda'nın işlevinde, işlevin yürütülmesinin başlatılmasının ek zaman almasına neden olan soğuk başlatma sorunları vardır. Bir kez başlatıldığında, aşağıdaki yürütmeler normal şekilde yanıt verecektir. Bu ilk ek başlatma süresine soğuk başlatma denir. Bu konuyla ilgili GCF için resmi belgelere sahip olmasak da, testlerimiz sırasında soğuk başlatma sorunları ortaya çıkmadı.

Hata ayıklama:

GCF, Google Cloud'daki Stackdriver Logging hizmetiyle entegre olur. Tüm konsol günlükleri ve hataları burada günlüğe kaydedilir ve zaten dağıtılmış olan kodun hatalarının ayıklanmasına yardımcı olur.

Test yapmak:

Konsol, bir JSON'u girdi olarak ileterek işlevi test etmek için seçenekler sunar. İşlev, girdi olarak JSON ile çağrılacak ve çıktı konsolda görüntülenecektir. İstek (girdi) ve yanıt, Express.js çerçevesine benzer ve geliştirme sürecinin kendisi sırasında birim test edilebilir. Node.js testi konusunda bilgi tazelemeye ihtiyacınız varsa, Entegrasyon Testlerini Gerçekte Yapmak için Node.js Kılavuzu'na bakın.

Sınırlamalar ve Sonraki Adımlar

Sunucusuz işlevleri kullanmanın kendi avantajları vardır, ayrıca sınırlamaları vardır

  • Satıcı kilitlemesi: Yazdığımız kodu belirli bir servis sağlayıcıya sınırlar. Kodu başka bir sağlayıcıya taşımak, geçişe yönelik önemli çabalarla kodun yeniden yazılmasını gerektirir. Bu büyük bir sorun olabileceğinden, bir servis sağlayıcı seçerken çok dikkatli olmalıyız.

  • İsteklerin ve donanım kaynaklarının sayısındaki sınırlamalar: Sağlayıcılar genellikle bir işlevin aynı anda işleyebileceği paralel isteklerin sayısını sınırlar. Hafıza kısıtlamaları da var. Bu tür kısıtlamalar, sağlayıcıyla konuşarak daha yükseğe çıkarılabilir, ancak yine de var olacaktır.

Google Cloud Functions olgunlaşıyor ve çok gelişiyor. Özellikle destekleyebildiği dillerde hala geliştirilmekte ve sık sık güncellenmektedir. Google Cloud işlevlerini kullanmayı planlıyorsanız, uygulamada herhangi bir kırılma değişikliğini önlemek için değişiklik günlüklerine göz atın.


Toptal Mühendislik Blogunda Daha Fazla Okuma:

  • TypeScript ve Jest Desteğiyle Çalışmak: Bir AWS SAM Eğitimi