欢迎参加我们将于 2022 年 10 月 18 日举办的 Firebase 峰会(线上线下同时进行),了解 Firebase 如何帮助您加快应用开发速度、满怀信心地发布应用并在之后需要时轻松地扩大应用规模。立即报名

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

Görev kuyruğu işlevleri, uygulamanızın ana uygulama akışınızın dışında zaman alan, yoğun kaynak kullanan veya bant genişliği sınırlı görevleri 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'de barındırılan çok sayıda görüntü dosyasının bir hız sınırıyla yedeklerini oluşturmak istediğinizi düşünün. Bu API'nin sorumlu bir tüketicisi olmak için, onların oran sınırlarına uymanız gerekir. Ayrıca, bu tür uzun süredir devam eden işler, zaman aşımları ve bellek sınırları nedeniyle hataya açık olabilir.

Bu karmaşıklığı azaltmak için, scheduleTime ve DistributionDeadline gibi temel görev seçeneklerini ayarlayan bir görev kuyruğu işlevi yazabilir ve ardından işlevi Cloud dispatchDeadline bir kuyruğa devredebilirsiniz. Bulut Görevleri ortamı, bu tür işlemler için etkin tıkanıklık denetimi ve yeniden deneme ilkeleri sağlamak üzere özel olarak tasarlanmıştır.

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

Firebase ile görev kuyruğu işlevlerinin kullanılması, Bulut Görevleri işleme ücreti 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. Firebase Local Emulator Suite'i kullanarak işlevlerinizi test edin.
  3. Firebase CLI ile işlevinizi devreye alın. Görev kuyruğu işlevinizi ilk kez dağıtırken, CLI, kaynak kodunuzda belirtilen seçeneklerle (hız sınırlama ve yeniden deneme) Cloud Tasks'ta bir görev kuyruğu oluşturur.
  4. Gerekirse bir yürütme zamanlaması ayarlamak için parametreleri ileterek yeni oluşturulan görev kuyruğuna görevler ekleyin. Bunu, Yönetici SDK'sını kullanarak kodu yazıp Firebase için Cloud Functions'a dağıtarak başarabilirsiniz.

Görev kuyruğu işlevlerini yazma

Görev kuyruğu işlevlerini yazmaya başlamak için onTaskDispatched kullanın. Görev kuyruğu işlevi yazmanın önemli bir parçası, sıra başına yeniden deneme ve hız sınırlama yapılandırması ayarlamaktır. Bu sayfadaki kod örnekleri, NASA'nın Günün Astronomi Resmi'ndeki tüm görüntüleri yedekleyen bir hizmet oluşturan bir uygulamaya dayanmaktadır:

Görev kuyruğu yapılandırması

Görev kuyruğu işlevleri, hız sınırlarını tam olarak kontrol etmek ve bir görev kuyruğunun yeniden deneme davranışını kontrol etmek için güçlü bir dizi yapılandırma ayarıyla birlikte gelir:

exports.backupapod = onTaskDispatched(
    {
      retryConfig: {
        maxAttempts: 5,
        minBackoffSeconds: 60,
      },
      rateLimits: {
        maxConcurrentDispatches: 6,
      },
    }, async (req) => {
  • 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 sonra yeniden denenir. Bu, her deneme arasında büyük bir arabellek sağlar, böylece 5 yeniden deneme denemesini çok hızlı bir şekilde tüketmek için acele etmiyoruz.
  • rateLimits.maxConcurrentDispatch=6 : Belirli bir zamanda en fazla 6 görev gönderilir. Bu, temel işleve sürekli bir istek akışı sağlamaya yardımcı olur ve etkin örneklerin ve soğuk başlatmaların sayısını azaltmaya yardımcı olur.

Firebase Local Emulator Suite kullanarak görev kuyruğu işlevlerini test etme

Firebase Local Emulator Suite'teki görev kuyruğu işlevleri, basit HTTP işlevleri olarak sunulur. Bir json veri yüküyle bir HTTP POST isteği göndererek öykünülmüş bir görev işlevini test edebilirsiniz:

 # start the Local Emulator Suite
 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şlevini 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, kaynak kodunuzda belirtilen seçeneklerle (hız sınırlama ve yeniden deneme) Cloud Tasks'ta 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.

İşlevi kuyruğa al

Görev kuyruğu işlevleri, Node.js için Firebase Admin SDK'sı kullanılarak Cloud Functions for Firebase gibi güvenilir bir sunucu ortamından Cloud Tasks'ta sıraya 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, onu {cloudtasks_name}} içinde kuyruğa alır ve görevin yapılandırmasını ayarlar:

exports.enqueueBackuptasks = 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 day. 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, Nth görevi için Nth dakikalık bir gecikme ilişkilendirerek görevlerin yürütülmesini yaymaya çalışır. Bu, ~ 1 görev/dakika tetikleme anlamına gelir. Cloud Tasks'ın belirli bir zamanda bir görevi tetiklemesini istiyorsanız scheduleTime da kullanabileceğinizi unutmayın.
  • dispatchDeadlineSeconds : Cloud Tasks'in bir görevin tamamlanmasını 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 deneyecek. Örnekte, kuyruk, görevi 5 defaya kadar yeniden deneyecek şekilde yapılandırılmıştır, ancak tüm işlem (yeniden deneme girişimleri dahil) 5 dakikadan fazla sürerse görev otomatik olarak iptal edilir.

Hedef URI'yi alın ve ekleyin

Cloud Functions for Firebase v2, belirleyici HTTP URL'lerini desteklemediğinden, sıraya alınan her göreve hedef URI'yi manuel olarak almanız ve dahil etmeniz gerekir. Ayrıca, işlevinizin URL'sini aşağıda gösterildiği gibi programlı olarak alabilirsiniz:

/**
 * Get the URL of a given v2 cloud function.
 *
 * @param {string} name the function's name
 * @param {string} location the function's location
 * @return {Promise<string>} The URL of the function
 */
async function getFunctionUrl(name, location="us-central1") {
  if (!auth) {
    auth = new GoogleAuth({
      scopes: "https://www.googleapis.com/auth/cloud-platform",
    });
  }
  const projectId = await auth.getProjectId();
  const url = "https://cloudfunctions.googleapis.com/v2beta/" +
    `projects/${projectId}/locations/${location}/functions/${name}`;

  const client = await auth.getClient();
  const res = await client.request({url});
  const uri = res.data?.serviceConfig?.uri;
  if (!uri) {
    throw new Error(`Unable to retreive uri for function at ${url}`);
  }
  return uri;
}

Sorun giderme

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

Bulut Görevlerinden alınan günlükler, bir görevle ilişkili isteğin durumu gibi yararlı tanılama bilgilerini içerir. Varsayılan olarak, projenizde oluşturabileceği çok sayıda günlük nedeniyle Bulut Görevlerinden gelen günlükler kapatılı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. Günlüğe kaydetmeyi açma konusuna bakın.

IAM izinleri

Görevleri kuyruğa alırken veya Cloud Tasks, görev kuyruğu işlevlerinizi başlatmaya çalıştığında PERMISSION DENIED REDDİ 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örevlerine yerleştirmek için kullanılan kimliğin, Bulut Görevleri'ndeki bir görevle ilişkili hizmet hesabını kullanmak için izne ihtiyacı var.

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

App Engine varsayılan hizmet hesabının bir kullanıcısı olarak App Engine varsayılan hizmet hesabının 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