Cloud Tasks ile işlevleri sıraya alma


Görev sırası işlevleri, uygulamanızın zaman alan, kaynak yoğun veya bant genişliği sınırlı görevleri ana uygulama akışınızın dışında eşzamansız olarak çalıştırmasına yardımcı olmak için Google Cloud Tasks'dan yararlanır.

Örneğin, şu anda hız sınırı olan bir API'de barındırılan büyük bir resim dosyası grubunun yedeklerini oluşturmak istediğinizi varsayalım. Söz konusu API'nin sorumlu bir tüketicisi olmak için hız sınırlarına uymanız gerekir. Ayrıca, bu tür uzun süreli işler zaman aşımları ve bellek sınırları nedeniyle başarısızlığa uğrayabilir.

Bu karmaşıklığı azaltmak için scheduleTime ve dispatchDeadline gibi temel görev seçeneklerini belirleyen bir görev sırası işlevi yazabilir ve ardından işlevi Cloud Tasks içindeki bir sıraya alabilirsiniz. Cloud Tasks ortamı, bu tür işlemler için etkili tıkanıklık kontrolü ve yeniden deneme politikaları sağlamak üzere özel olarak tasarlanmıştır.

Cloud Functions for Firebase v3.20.1 ve sonraki sürümler için Firebase SDK'sı, görev sırası işlevlerini desteklemek amacıyla Firebase Admin SDK v10.2.0 ve sonraki sürümlerle birlikte çalışır.

Görev kuyruğu işlevlerini Firebase ile kullanmak, işleme ücretlerine yol açabilir. Daha fazla bilgi için Cloud Tasks fiyatlandırmasına göz atın.

Görev sırası işlevleri oluşturma

Görev sırası işlevlerini kullanmak için aşağıdaki iş akışını uygulayın:

  1. Cloud Functions için Firebase SDK'sını kullanarak bir görev sırası işlevi yazın.
  2. İşlevinizi bir HTTP isteği ile tetikleyerek test edin.
  3. İşlevinizi Firebase KSA ile dağıtın. Görev sırası işlevinizi ilk kez dağıtıyorsanız CLI, kaynak kodunuzda belirtilen seçeneklerle (hız sınırlama ve yeniden deneme) Cloud Tasks içinde bir görev sırası oluşturur.
  4. Gerekirse bir yürütme planı oluşturmak için parametreleri ileterek yeni oluşturulan görev sırasına görevler ekleyin. Bunun için kodu Admin SDK kullanarak yazıp Cloud Functions for Firebase adresine dağıtabilirsiniz.

Görev sırası işlevleri yazma

Görev kuyruğu işlevleri yazmaya başlamak için onDispatch simgesini kullanın. Görev sırası işlevi yazmanın önemli bir parçası, sıra başına yeniden deneme ve hız sınırlayıcı yapılandırma ayarlamaktır. Bu sayfadaki kod örnekleri, NASA'nın Günün Astronomi Resmi'ndeki tüm görüntüleri yedekleyen bir hizmeti kuran bir uygulamaya dayanır:

Görev sırası işlevlerini yapılandırma

Görev sırası işlevleri, hız sınırlarını hassas bir şekilde kontrol etmek ve görev sırasının yeniden deneme davranışını hassas bir şekilde denetlemek için bir dizi güçlü yapılandırma ayarıyla birlikte gelir:

exports.backupApod = functions
    .runWith( {secrets: ["NASA_API_KEY"]})
    .tasks.taskQueue({
      retryConfig: {
        maxAttempts: 5,
        minBackoffSeconds: 60,
      },
      rateLimits: {
        maxConcurrentDispatches: 6,
      },
    }).onDispatch(async (data) => {
  • retryConfig.maxAttempts=5: Görev sırasındaki her görev en fazla 5 kez otomatik olarak yeniden denenir. Bu sayede ağ hataları veya bağımlı, harici bir hizmetin geçici hizmet kesintisi gibi geçici hataları en aza indirebilirsiniz.
  • retryConfig.minBackoffSeconds=60: Her görev, her denemeden sonra en az 60 saniye sonra yeniden denenir. Bu sayede, 5 yeniden deneme denemesini çok hızlı bir şekilde tüketmemek için her deneme arasında büyük bir tampon sağlanır.
  • rateLimits.maxConcurrentDispatch=6: Belirli bir zamanda en fazla 6 görev gönderilir. Bu, temel işleve istikrarlı bir istek akışının sağlanmasına ve etkin örneklerin ve baştan başlatmaların sayısının azaltılmasına yardımcı olur.

Görev sırası işlevlerini test etme

Çoğu durumda, görev sırası işlevlerini test etmenin en iyi yolu Cloud Functions emülatörüdür. Uygulamanızı görev sırası işlevleri emülasyonu için nasıl donatacağınızı öğrenmek üzere Emulator Suite dokümanlarını inceleyin.

Ayrıca, görev sırası işlevleri, Firebase Local Emulator Suite içinde basit HTTP işlevleri olarak gösterilir. Bir emülasyonlu görev işlevini, json veri yükü içeren bir HTTP POST isteği göndererek test edebilirsiniz:

 # start the Firebase Emulators
 firebase emulators:start

 # trigger the emulated task queue function
 curl \
  -X POST                                            # An HTTP POST request...
  -H "content-type: application/json" \              # ... with a JSON body
  http://localhost:$PORT/$PROJECT_ID/$REGION/$NAME \ # ... to function url
  -d '{"data": { ... some data .... }}'              # ... with JSON encoded data

Görev sırası işlevlerini dağıtma

Görev kuyruğu işlevini Firebase CLI'yi kullanarak dağıtma:

$ firebase deploy --only functions:backupApod

CLI, bir görev kuyruğu işlevini ilk kez dağıtırken kaynak kodunuzda belirtilen seçenekleri (hız sınırlaması ve yeniden deneme) kullanarak Cloud Tasks içinde bir görev kuyruğu oluşturur.

İşlevleri dağıtırken izin hatalarıyla karşılaşırsanız dağıtım komutlarını çalıştıran kullanıcıya uygun IAM rollerinin atandığından emin olun.

Görev sırası işlevlerini sıraya ekleme

Görev sırası işlevleri, Node.js için Firebase Admin SDK kullanılarak Cloud Functions for Firebase gibi güvenilir bir sunucu ortamından Cloud Tasks'e eklenebilir. Admin SDK konusunda bilginiz yoksa başlamak için Firebase'i sunucuya ekleme bölümüne göz atın.

Tipik bir akışta Admin SDK yeni bir görev oluşturur, Cloud Tasks'a ekler ve görevin yapılandırmasını ayarlar:

exports.enqueueBackupTasks = functions.https.onRequest(
async (_request, response) => {
  const queue = getFunctions().taskQueue("backupApod");
  const enqueues = [];
  for (let i = 0; i <= 10; i += 1) {
    // Enqueue each task with i*60 seconds delay. Our task queue function
    // should process ~1 task/min.
    const scheduleDelaySeconds = i * 60 
    enqueues.push(
        queue.enqueue(
          { id: `task-${i}` },
          {
            scheduleDelaySeconds,
            dispatchDeadlineSeconds: 60 * 5 // 5 minutes
          },
        ),
    );
  }
  await Promise.all(enqueues);
  response.sendStatus(200);

});
  • scheduleDelaySeconds: Örnek kod, N. görev için N. dakikalık bir gecikme ilişkilendirerek görevlerin yürütülmesini dağıtmaya çalışır. Bu, dakika başına yaklaşık 1 görev tetiklenmesi anlamına gelir. Cloud Tasks'un belirli bir zamanda bir görevi tetiklemesini istiyorsanız scheduleTime'ü de kullanabileceğinizi unutmayın.
  • dispatchDeadlineSeconds: Cloud Tasks bir görevin tamamlanmasını bekleyeceği maksimum süre. Cloud Tasks, sıranın yeniden deneme yapılandırmasını takip ederek veya bu son tarihe kadar görevi yeniden dener. Örnekte, sıra, görevi 5 defaya kadar yeniden deneyecek şekilde yapılandırılmıştır ancak tüm işlem (yeniden deneme denemeleri dahil) 5 dakikadan uzun sürerse görev otomatik olarak iptal edilir.

Sorun giderme

Cloud Tasks">Cloud Tasks günlük kaydını aç

Cloud Tasks günlükleri, bir görevle ilişkili isteğin durumu gibi yararlı teşhis bilgileri içerir. Cloud Tasks kaynaklı günlükler, projenizde oluşturabileceği büyük miktardaki günlükler nedeniyle varsayılan olarak devre dışıdır. Görev sırası işlevlerinizi aktif olarak geliştirirken ve hata ayıklarken hata ayıklama günlüklerini açmanızı öneririz. Günlüğe kaydetmeyi etkinleştirme başlıklı makaleyi inceleyin.

IAM İzinleri

Görevleri sıraya eklerken veya Cloud Tasks görev sırası işlevlerinizi çağırmaya çalışırken PERMISSION DENIED hataları görebilirsiniz. Projenizde aşağıdaki IAM bağlamalarının bulunduğundan emin olun:

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member=serviceAccount:${PROJECT_ID}@appspot.gserviceaccount.com \
  --role=roles/cloudtasks.enqueuer
  • Görevleri Cloud Tasks hizmetine sıraya koymak için kullanılan kimliğin, Cloud Tasks öğesindeki bir görevle ilişkilendirilmiş hizmet hesabını kullanabilmesi amacıyla izne ihtiyacı var.

    Örnekte bu, App Engine varsayılan hizmet hesabıdır.

App Engine varsayılan hizmet hesabını, App Engine varsayılan hizmet hesabının kullanıcısı olarak ekleme ile ilgili talimatlar için Google Cloud IAM belgelerine bakın.

gcloud functions add-iam-policy-binding $FUNCTION_NAME \
  --region=us-central1 \
  --member=serviceAccount:${PROJECT_ID}@appspot.gserviceaccount.com \
  --role=roles/cloudfunctions.invoker