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:
- Cloud Functions için Firebase SDK'sını kullanarak bir görev kuyruğu işlevi yazın.
- İşlevinizi bir HTTP isteğiyle tetikleyerek test edin.
- İş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.
- 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:
Görevleri Bulut Görevleri'nde sıraya koymak için kullanılan kimlik,
cloudtasks.tasks.create
IAM iznine ihtiyaç duyar.Örnekte bu, App Engine varsayılan hizmet hesabıdır
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.
Görev kuyruğu işlevini tetiklemek için kullanılan kimliğin
cloudfunctions.functions.invoke
iznine ihtiyacı var.Örnekte bu, App Engine varsayılan hizmet hesabıdır
gcloud functions add-iam-policy-binding $FUNCTION_NAME \
--region=us-central1 \
--member=serviceAccount:${PROJECT_ID}@appspot.gserviceaccount.com \
--role=roles/cloudfunctions.invoker