Cloud Tasks ile işlevleri kuyruğa alın


Görev kuyruğu işlevleri, uygulamanızın zaman alan, yoğun kaynak kullanan 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'tan yararlanır.

Örneğin, şu anda bir API üzerinde barındırılan büyük bir görüntü dosyası kümesinin hız sınırıyla yedeklerini oluşturmak istediğinizi düşünün. Söz konusu API'nin sorumlu bir tüketicisi olabilmek için oran sınırlarına uymanız gerekir. Ayrıca, bu tür uzun süreli işler, zaman aşımları ve bellek sınırlamaları nedeniyle başarısızlığa açık olabilir.

Bu karmaşıklığı azaltmak için, scheduleTime ve dispatchDeadline gibi temel görev seçeneklerini ayarlayan bir görev kuyruğu işlevi yazabilir ve ardından işlevi Bulut Görevleri'ndeki bir kuyruğa devredebilirsiniz. Bulut Görevleri 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.

Firebase v3.20.1 ve üzeri Bulut İşlevleri için Firebase SDK'sı, görev kuyruğu işlevlerini desteklemek üzere Firebase Admin SDK v10.2.0 ve üzeri ile birlikte çalışır.

Görev kuyruğu işlevlerinin Firebase ile kullanılması, Bulut Görevlerinin işlenmesi için ücret alınmasına neden olabilir. Daha fazla bilgi için Bulut Görevleri fiyatlandırmasına bakın.

Görev kuyruğu işlevleri oluşturma

Görev kuyruğu işlevlerini kullanmak için şu iş akışını izleyin:

  1. Cloud Functions için Firebase SDK'sını kullanarak bir görev kuyruğu işlevi yazın.
  2. İşlevinizi bir HTTP isteğiyle tetikleyerek test edin.
  3. İşlevinizi Firebase CLI ile dağıtın. Görev kuyruğu işlevinizi ilk kez dağıtırken CLI, Bulut Görevleri'nde kaynak kodunuzda belirtilen seçeneklerle (hız sınırlama ve yeniden deneme) bir görev kuyruğu oluşturacaktır.
  4. Gerekirse bir yürütme zamanlaması oluşturmak için parametreleri ileterek yeni oluşturulan görev kuyruğuna görevler ekleyin. Bunu, Admin SDK'yı kullanarak kodu yazıp bunu Cloud Functions for Firebase'e dağıtarak başarabilirsiniz.

Görev kuyruğu işlevlerini yaz

Görev kuyruğu işlevlerini yazmaya başlamak için onDispatch kullanın. Görev kuyruğu işlevi yazmanın önemli bir kısmı, kuyruk başına yeniden denemeyi ve hız sınırlayıcı yapılandırmayı ayarlamaktır. Bu sayfadaki kod örnekleri, NASA'nın Astronomi Günün Fotoğrafı'ndaki tüm görüntüleri yedekleyen bir hizmet kuran bir uygulamayı temel almaktadır:

Görev kuyruğu işlevlerini yapılandırma

Görev kuyruğu işlevleri, hız sınırlarını hassas bir şekilde kontrol etmek ve görev kuyruğunun davranışını yeniden denemek için güçlü bir yapılandırma ayarları seti ile 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 kuyruğundaki her görev otomatik olarak 5 defaya kadar yeniden denenir. Bu, ağ hataları veya bağımlı, harici bir hizmetin geçici hizmet kesintisi gibi geçici hataların azaltılmasına yardımcı olur.
  • retryConfig.minBackoffSeconds=60 : Her görev, her denemeden en az 60 saniye arayla yeniden denenir. Bu, her deneme arasında geniş bir ara bellek sağlar, böylece 5 yeniden deneme girişimini çok hızlı tüketmek için acele etmiyoruz.
  • 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 yardımcı olur ve etkin örneklerin ve soğuk başlatmaların sayısının azaltılmasına yardımcı olur.

Görev kuyruğu işlevlerini test edin

Firebase Local Emulator Suite'teki görev kuyruğu işlevleri, basit HTTP işlevleri olarak sunulur. Öykünülmüş bir görev işlevini, json veri yüküyle 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 kuyruğu işlevlerini dağıtma

Firebase CLI'yi kullanarak görev kuyruğu işlevini dağıtın:

$ firebase deploy --only functions:backupApod

Bir görev kuyruğu işlevini ilk kez dağıtırken CLI, Bulut Görevleri'nde kaynak kodunuzda belirtilen seçeneklerle (hız sınırlama ve yeniden deneme) 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 kuyruğu işlevlerini sıraya alma

Görev kuyruğu işlevleri, Node.js için Firebase Yönetici SDK'sı kullanılarak Cloud Functions for Firebase gibi güvenilir bir sunucu ortamından Bulut Görevleri'nde kuyruğa alınabilir. Yönetici SDK'larında yeniyseniz başlamak için Firebase'i sunucuya ekleme konusuna bakın.

Tipik bir akışta Yönetici SDK'sı yeni bir görev oluşturur, bunu Bulut Görevleri'nde sıraya alır 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'inci görev için N'inci dakikalık bir gecikmeyi ilişkilendirerek görevlerin yürütülmesini yaymaya çalışır. Bu ~ 1 görev/dakika tetikleme anlamına gelir. Bulut Görevleri'nin bir görevi belirli bir zamanda tetiklemesini istiyorsanız, scheduleTime da kullanabileceğinizi unutmayın.
  • dispatchDeadlineSeconds : Bulut Görevlerinin bir görevin tamamlanması için bekleyeceği maksimum süre. Cloud Tasks, kuyruğun yeniden deneme yapılandırmasının ardından veya bu son tarihe ulaşılana kadar görevi yeniden deneyecektir. Örnekte, kuyruk, görevi en fazla 5 kez yeniden deneyecek şekilde yapılandırılmıştır ancak tüm süreç (yeniden deneme girişimleri dahil) 5 dakikadan fazla sürerse görev otomatik olarak iptal edilir.

Sorun giderme

Bulut Görevleri günlüğünü açın

Bulut Görevlerindeki günlükler, bir görevle ilişkili isteğin durumu gibi yararlı teşhis bilgileri içerir. Bulut Görevleri'ndeki günlükler, projenizde oluşturabileceği büyük miktarda günlük nedeniyle varsayılan olarak kapalıdır. Görev kuyruğu işlevlerinizi aktif olarak geliştirirken ve hata ayıklarken hata ayıklama günlüklerini açmanızı öneririz. Bkz. Günlüğe kaydetmeyi açma .

IAM İzinleri

Görevleri kuyruğa alırken veya Cloud Tasks, görev kuyruğu işlevlerinizi çağırmaya çalıştığında PERMISSION DENIED hatalarını görebilirsiniz. Projenizin aşağıdaki IAM bağlamalarına sahip olduğundan emin olun:

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member=serviceAccount:${PROJECT_ID}@appspot.gserviceaccount.com \
  --role=roles/cloudtasks.enqueuer
  • Görevleri Bulut Görevleri'nde sıraya koymak için kullanılan kimliğin, Bulut Görevleri'ndeki bir görevle ilişkili hizmet hesabını kullanma iznine ihtiyacı vardır.

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

App Engine varsayılan hizmet hesabının, App Engine varsayılan hizmet hesabının kullanıcısı olarak nasıl ekleneceğine ilişkin 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