Uzantınızın yaşam döngüsü etkinliklerini yönetin

Uzantınız Cloud Tasks işlev içerebilir bir uzantı örneği aşağıdakilerden herhangi birine geçtiğinde tetiklenen yaşam döngüsü olayları:

  • Uzantının bir örneği yüklendi
  • Uzantının bir örneği yeni bir sürüme güncellendi
  • Bir uzantı örneğinin yapılandırması değiştirildiğinde

Bu özelliğin en önemli kullanım alanlarından biri verilerin doldurulmasıdır. Örneğin, Örneğin, küçük resim önizlemeleri oluşturan bir uzantı oluşturduğunuzu varsayalım Cloud Storage paketine yüklenen resim. Uzantınızın ana amacı sorgusu, onFinalize Cloud Storage etkinliği tarafından tetiklenen bir işlevde yapılır. Ancak, yalnızca uzantı yüklendikten sonra yüklenen resimler işlendi. Uzantınıza onInstall yaşam döngüsü olayını izlemek için Uzantı yüklendiğinde mevcut resimler.

Yaşam döngüsü etkinliği tetikleyicilerinin diğer kullanım alanlarından bazıları şunlardır:

  • Yükleme sonrası kurulumu otomatikleştirme (veritabanı kayıtları oluşturma, dizine ekleme vb.)
  • Geriye dönük olarak uyumsuz değişiklikler yayınlamanız gerekiyorsa otomatik olarak taşıma işlemini gerçekleştirin güncellemeyle ilgili veriler

Kısa süreli yaşam döngüsü etkinlik işleyicileri

Göreviniz tamamen maksimum Cloud Functions süre (9 dakika) kullanarak yaşam döngüsü etkinliğinizi yazabilirsiniz işleyicisini, görev sırası onDispatch etkinliğinde tetiklenen tek bir işlev olarak görür:

export const myTaskFunction = functions.tasks.taskQueue()
  .onDispatch(async () => {
    // Complete your lifecycle event handling task.
    // ...

    // When processing is complete, report status to the user (see below).
  });

Ardından uzantınızın extension.yaml dosyasında aşağıdakileri yapın:

  1. İşlevinizi taskQueueTrigger ile uzantı kaynağı olarak kaydedin özellik ayarlanmış olmalıdır. taskQueueTrigger değerini boş haritaya ({}) ayarlarsanız, uzantısı, varsayılan değeri kullanarak bir Cloud Tasks sırası sağlar. ayarlar; isteğe bağlı olarak bu ayarları düzenleyebilirsiniz.

    resources:
      - name: myTaskFunction
        type: firebaseextensions.v1beta.function
        description: >-
          Describe the task performed when the function is triggered by a lifecycle
          event
        properties:
          location: ${LOCATION}
          taskQueueTrigger: {}
    
  2. İşlevinizi bir veya daha fazla yaşam döngüsü olayı için işleyici olarak kaydedin:

    resources:
      - ...
    lifecycleEvents:
      onInstall:
        function: myTaskFunction
        processingMessage: Resizing your existing images
      onUpdate:
        function: myOtherTaskFunction
        processingMessage: Setting up your extension
      onConfigure:
        function: myOtherTaskFunction
        processingMessage: Setting up your extension
    
    

    Şu etkinlikler için işlevleri kaydedebilirsiniz: onInstall, onUpdate ve onConfigure. Bu etkinliklerin tümü isteğe bağlıdır.

  3. Önerilen: Uzantınızın kullanıcı tarafından yapılandırılmış bir parametre ekleyin Kullanıcıların bu özelliğin etkinleştirilip etkinleştirilmeyeceğini seçmesine olanak tanır.

    Örneğin, aşağıdaki gibi bir parametre ekleyin:

    params:
      - param: DO_BACKFILL
        label: Backfill existing images
        description: >
          Should existing, unresized images in the Storage bucket be resized as well?
        type: select
        options:
          - label: Yes
            value: true
          - label: No
            value: false
    

    İşlevinizde, parametre false değerine ayarlanırsa erken çıkış yapın:

    export const myTaskFunction = functions.tasks.taskQueue()
      .onDispatch(async () => {
        if (!process.env.DO_BACKFILL) {
          await runtime.setProcessingState(
            "PROCESSING_COMPLETE",
            "Existing images were not resized."
          );
          return;
        }
        // Complete your lifecycle event handling task.
        // ...
      });
    

Uzun süreli görevleri gerçekleştirme

Göreviniz maksimum Cloud Functions süre içinde tamamlanamazsa görevi alt görevlere ayırın ve Yönetici SDK'sı TaskQueue.enqueue() ile işler yöntemidir.

Örneğin, Cloud Firestore verilerini doldurmak istediğinizi varsayalım. Şunları yapabilirsiniz: sorgu imleçleri kullanarak belge koleksiyonunu parçalara bölebilirsiniz. Bir parçayı işledikten sonra başlangıç ofsetini ilerletin ve başka bir parçayı sıraya alın işlev çağrısı aşağıda gösterildiği gibidir:

import { getFirestore } from "firebase-admin/firestore";
import { getFunctions } from "firebase-admin/functions";

exports.backfilldata = functions.tasks.taskQueue().onDispatch(async (data) => {
  // When a lifecycle event triggers this function, it doesn't pass any data,
  // so an undefined offset indicates we're on our first invocation and should
  // start at offset 0. On subsequent invocations, we'll pass an explicit
  // offset.
  const offset = data["offset"] ?? 0;

  // Get a batch of documents, beginning at the offset.
  const snapshot = await getFirestore()
    .collection(process.env.COLLECTION_PATH)
    .startAt(offset)
    .limit(DOCS_PER_BACKFILL)
    .get();
  // Process each document in the batch.
  const processed = await Promise.allSettled(
    snapshot.docs.map(async (documentSnapshot) => {
      // Perform the processing.
    })
  );

  // If we processed a full batch, there are probably more documents to
  // process, so enqueue another invocation of this function, specifying
  // the offset to start with.
  //
  // If we processed less than a full batch, we're done.
  if (processed.length == DOCS_PER_BACKFILL) {
    const queue = getFunctions().taskQueue(
      "backfilldata",
      process.env.EXT_INSTANCE_ID
    );
    await queue.enqueue({
      offset: offset + DOCS_PER_BACKFILL,
    });
  } else {
      // Processing is complete. Report status to the user (see below).
  }
});

İşlevi extension.yaml cihazınıza şu şekilde ekleyin: önceki bölümü inceleyin.

Raporlama durumu

Tüm işleme fonksiyonlarınız başarılı bir şekilde ya da bir hatası, Yönetici SDK'sının uzantı çalışma zamanını kullanarak görevin durumunu bildirin yöntemlerine göz atın. Kullanıcılar bu durumu Firebase konsolu.

Başarılı tamamlama ve önemli olmayan hatalar

Başarılı tamamlamayı ve önemli olmayan hataları ( uzantınızı işlevsel olmayan bir duruma getirene kadar) Yönetici SDK'sinin setProcessingState() uzantısı çalışma zamanı yöntemi:

import { getExtensions } from "firebase-admin/extensions";

// ...

getExtensions().runtime().setProcessingState(processingState, message);

Aşağıdaki durumları ayarlayabilirsiniz:

Önemli olmayan durumlar
PROCESSING_COMPLETE

Görevin başarıyla tamamlandığını bildirmek için kullanın. Örnek:

getExtensions().runtime().setProcessingState(
  "PROCESSING_COMPLETE",
  `Backfill complete. Successfully processed ${numSuccess} documents.`
);
PROCESSING_WARNING

Kısmi başarıyı bildirmek için kullanın. Örnek:

getExtensions().runtime().setProcessingState(
  "PROCESSING_WARNING",
  `Backfill complete. ${numSuccess} documents processed successfully.`
    + ` ${numFailed} documents failed to process. ${listOfErrors}.`
    + ` ${instructionsToFixTheProblem}`
);
PROCESSING_FAILED

Görevin tamamlanmasını engelleyen ancak gösterilmeyen hataları bildirmek için kullanın uzantıyı kullanılamaz durumda bırakır. Örnek:

getExtensions().runtime().setProcessingState(
  "PROCESSING_FAILED",
  `Backfill failed. ${errorMsg} ${optionalInstructionsToFixTheProblem}.`
);

Uzantıyı kullanılmaz bırakan hataları bildirmek için şu numarayı arayın: setFatalError().

NONE

Görevin durumunu temizlemek için kullanın. İsteğe bağlı olarak bunu kullanarak durumu mesajı (örneğin, belirli bir süre PROCESSING_COMPLETE ayarının üzerinden zaman geçti). Örnek:

getExtensions().runtime().setProcessingState("NONE");

Önemli hatalar

Uzantının çalışmasını engelleyen bir hata oluşursa Örneğin, gerekli bir kurulum görevi başarısız oluyor. Önemli hatayı setFatalError():

import { getExtensions } from "firebase-admin/extensions";

// ...

getExtensions().runtime().setFatalError(`Post-installation setup failed. ${errorMessage}`);

Görev sırasını ayarlama

taskQueueTrigger özelliğini {} olarak ayarlarsanız uzantınız bir uzantı etkinken, Cloud Tasks sırası için varsayılan ayarlarla örneği yüklendi. Alternatif olarak görev sırasının eşzamanlılığını ayarlayabilirsiniz sınırları ve yeniden deneme davranışını görebilirsiniz:

resources:
  - name: myTaskFunction
    type: firebaseextensions.v1beta.function
    description: >-
      Perform a task when triggered by a lifecycle event
    properties:
      location: ${LOCATION}
      taskQueueTrigger:
        rateLimits:
          maxConcurrentDispatches: 1000
          maxDispatchesPerSecond: 500
        retryConfig:
          maxAttempts: 100  # Warning: setting this too low can prevent the function from running
          minBackoffSeconds: 0.1
          maxBackoffSeconds: 3600
          maxDoublings: 16
lifecycleEvents:
  onInstall: 
    function: myTaskFunction
    processingMessage: Resizing your existing images
  onUpdate:
    function: myTaskFunction
    processingMessage: Setting up your extension
  onConfigure:
    function: myOtherTaskFunction
    processingMessage: Setting up your extension

Cloud Tasks sıralarını yapılandırma başlıklı makaleyi inceleyin. Google Cloud dokümanlarına göz atın.

Görev sırası parametrelerini taskQueue() işlevine ileterek belirtmeye çalışmayın. extension.yaml içindeki yapılandırmanın yerini alması için bu ayarlar yok sayılır ve varsayılan yapılandırma ayarlarını kullanır.

Örneğin, şu komut işe yaramaz:

export const myBrokenTaskFunction = functions.tasks
  // DON'T DO THIS IN AN EXTENSION! THESE SETTINGS ARE IGNORED.
  .taskQueue({
    retryConfig: {
      maxAttempts: 5,
      minBackoffSeconds: 60,
    },
    rateLimits: {
      maxConcurrentDispatches: 1000,
      maxDispatchesPerSecond: 10,
    },
  })
  .onDispatch(
    // ...
  );

extension.yaml tablosundaki taskQueueTrigger özelliği yapılandırmanın tek yoludur bir uzantının görev sıralarına yerleştirilmelidir.

Örnekler

Resmi storage-resize-images, firestore-bigquery-export, ve firestore-translate-text Uzantıların tümü verileri doldurmak için yaşam döngüsü etkinlik işleyicileri kullanır.