Cloud Tasks ile işlevleri sıraya ekleme


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'tan yararlanır.

Örneğin, hız sınırı olan bir API'de barındırılan ve büyük bir resim dosyası grubunun yedeklerini oluşturmak istediğinizi düşünün. 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 açık olabilir.

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'taki 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 amacıyla özel olarak tasarlanmıştır.

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

Görev sırası işlevlerinin Firebase ile kullanılması, Cloud Tasks'ı işleme için ücret alınmasına neden olabilir. Daha fazla bilgi için Cloud Tasks fiyatlandırmasını inceleyin.

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

Görev sırası işlevlerini kullanmak için şu iş akışını izleyin:

  1. Cloud Functions için Firebase SDK'sını kullanarak görev sırası işlevi yazın.
  2. İşlevinizi bir HTTP isteği ile tetikleyerek test edin.
  3. İşlevinizi Firebase CLI 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'ta 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. Bunu, Admin SDK'yı kullanarak kodu yazıp Cloud Functions for Firebase'e dağıtarak yapabilirsiniz.

Görev sırası işlevlerini yazma

Görev sırası işlevlerini yazmaya başlamak için onDispatch 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 yöntem, her deneme arasında geniş bir tampon sağlar. Böylece, 5 yeniden deneme denemesini çok hızlı bir şekilde bitirmiyoruz.
  • 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

Firebase Local Emulator Suite'teki görev sırası işlevleri, basit HTTP işlevleri olarak gösterilir. json veri yüküyle bir HTTP POST isteği göndererek emüle edilmiş bir görev işlevini 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 sırası işlevini Firebase CLI kullanarak dağıtın:

$ firebase deploy --only functions:backupApod

Bir görev sırası işlevini ilk kez dağıtırken CLI, Cloud Tasks'ta kaynak kodunuzda belirtilen seçeneklerle (hız sınırlama ve yeniden deneme) bir görev sırası 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 koyma

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'ta sıraya alınabilir. Yönetici SDK'larını kullanmaya yeni başladıysanız başlamak için Firebase'i sunucuya ekleme bölümüne bakın.

Tipik bir akışta Admin SDK yeni bir görev oluşturur, bu görevi Cloud Tasks'ta 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. görev için N. dakikalık bir gecikmeyi ilişkilendirerek görevlerin yürütülmesini yaymaya çalışır. Bu, dakikada yaklaşık 1 görev tetikleme anlamına gelir. Cloud Tasks'ın belirli bir zamanda bir görevi tetiklemesini istiyorsanız scheduleTime uygulamasını da kullanabilirsiniz.
  • dispatchDeadlineSeconds: Cloud Tasks'ın bir görevin tamamlanmasını bekleyeceği maksimum süre. Cloud Tasks, sıranın yeniden yapılandırma işlemini takiben veya bu son tarihe ulaşılana kadar görevi yeniden dener. Örnekte sıra, görevi en fazla 5 kez yeniden deneyecek şekilde yapılandırılmıştır ancak tüm süreç (yeniden deneme denemeleri dahil) 5 dakikadan uzun sürerse görev otomatik olarak iptal edilir.

Sorun giderme

Cloud Tasks günlük kaydını etkinleştir

Cloud Tasks'taki günlükler, bir görevle ilişkili isteğin durumu gibi yararlı teşhis bilgileri içerir. Projenizde oluşturabileceği büyük günlük hacmi nedeniyle Cloud Tasks'taki günlükler varsayılan olarak kapalı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ük kaydını açma bölümüne bakın.

IAM İzinleri

Görevleri sıraya alırken veya Cloud Tasks, görev sırası işlevlerinizi çağırmaya çalışırken PERMISSION DENIED hatalarıyla karşılaşabilirsiniz. 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 Cloud Tasks'ta sıraya almakta kullanılan kimliğin, Cloud Tasks'taki bir görevle ilişkili hizmet hesabını kullanmak için izne ihtiyacı vardır.

    Ö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 hakkındaki 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