Görev sırası işlevleri, uygulamanızın zaman alıcı, 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'den yararlanır.
Örneğin, şu anda hız sınırı olan bir API'de barındırılan büyük bir resim dosyası grubunun yedeklerini oluşturmak istediğinizi varsayalım. Bu API'nin sorumlu bir kullanıcısı olmak için hız sınırlamaları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 uğrayabilir.
Bu karmaşıklığı azaltmak için scheduleTime
ve dispatchDeadline
gibi temel görev seçeneklerini ayarlayan ve ardından işlevi Cloud Tasks'deki bir kuyruğa aktaran bir görev kuyruğu işlevi yazabilirsiniz. Cloud Tasks 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.
Cloud Functions for Firebase v3.20.1 ve sonraki sürümler için Firebase SDK'sı, görev sırası işlevlerini desteklemek amacıyla Firebase Admin SDK v10.2.0 ve sonraki sürümlerle birlikte çalışır.
Görev kuyruğu işlevlerini Firebase ile kullanmak, işleme ücretlerine yol açabilir.Cloud Tasks Daha fazla bilgi için Cloud Tasks fiyatlandırmasına göz atın.
Görev sırası işlevleri oluşturma
Görev sırası işlevlerini kullanmak için aşağıdaki iş akışını uygulayın:
- Cloud Functions için Firebase SDK'sını kullanarak bir görev sırası 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, kaynak kodunuzda belirtilen seçenekleri (hız sınırlaması ve yeniden deneme) içeren bir görev kuyruğu oluşturur.Cloud Tasks
- Gerekirse yürütme planı oluşturmak için parametreleri iletmek üzere yeni oluşturulan görev kuyruğuna görev ekleyin. Bunu, Admin SDK'ü kullanarak kodu yazıp Cloud Functions for Firebase'e dağıtarak yapabilirsiniz.
Görev sırası işlevleri yazma
Görev kuyruğu işlevleri yazmaya başlamak için onDispatch
simgesini 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ırlama yapılandırmasını ayarlamaktır. Bu sayfadaki kod örnekleri, NASA'nın Günün Astronomi Fotoğrafı'ndaki tüm resimleri yedekleyen bir hizmet oluşturan bir uygulamaya dayanır:
Görev sırası işlevlerini yapılandırma
Görev sırası işlevleri, bir görev sırasının hız sınırlarını ve yeniden deneme davranışını hassas bir şekilde kontrol etmek için güçlü bir yapılandırma ayarları grubuyla 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 en fazla 5 kez yeniden denenir. Bu, ağ hataları veya bağımlı bir harici hizmetin geçici olarak kesintiye uğraması gibi geçici hataları azaltmaya yardımcı olur.retryConfig.minBackoffSeconds=60
: Her görev, her deneme arasında en az 60 saniye bekledikten sonra tekrar denenir. Bu sayede, 5 yeniden deneme denemesini çok hızlı bir şekilde tüketmemek için her deneme arasında büyük bir tampon sağlanır.rateLimits.maxConcurrentDispatch=6
: Belirli bir zamanda en fazla 6 görev gönderilir. Bu, temel işleve sabit bir istek akışı sağlamaya ve etkin örneklerin ve baştan başlatma işlemlerinin sayısını azaltmaya yardımcı olur.
Görev sırası işlevlerini test etme
Çoğu durumda, görev kuyruğu işlevlerini test etmenin en iyi yolu Cloud Functions emülatörüdür. Uygulamanızı görev sırası işlevleri emülasyonu için nasıl donatacağınızı öğrenmek üzere Emulator Suite dokümanlarını inceleyin.
Ayrıca, görev sırası işlevleri Firebase Local Emulator Suite içinde basit HTTP işlevleri olarak gösterilir. Bir emülasyonlu görev işlevini, json veri yükü içeren 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 sırası işlevlerini dağıtma
Görev kuyruğu işlevini Firebase CLI'yi kullanarak dağıtma:
$ firebase deploy --only functions:backupApod
CLI, bir görev kuyruğu işlevini ilk kez dağıtırken kaynak kodunuzda belirtilen seçenekleri (hız sınırlaması ve yeniden deneme) kullanarak Cloud Tasks içinde 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 sırası işlevlerini sıraya ekleme
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'e eklenebilir. Admin SDK'lerde yeniyseniz başlamak için Firebase'i bir sunucuya ekleme başlıklı makaleyi inceleyin.
Tipik bir akışta Admin SDK yeni bir görev oluşturur, Cloud Tasks'a ekler 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 gecikme ilişkilendirerek görevlerin yürütülmesini dağıtmaya çalışır. Bu, dakika başına yaklaşık 1 görev tetiklenmesi anlamına gelir. Cloud Tasks'un belirli bir zamanda bir görevi tetiklemesini istiyorsanızscheduleTime
'ü de kullanabileceğinizi unutmayın.dispatchDeadlineSeconds
: Cloud Tasks'ın bir görevin tamamlanmasını beklediği maksimum süre. Cloud Tasks, sıranın yeniden deneme yapılandırmasından sonra veya bu son tarihe kadar görevi yeniden dener. Örnekte, sıra, görevi 5 defaya kadar yeniden deneyecek şekilde yapılandırılmıştır ancak tüm işlem (yeniden deneme denemeleri dahil) 5 dakikadan uzun sürerse görev otomatik olarak iptal edilir.
Sorun giderme
Cloud Tasks">Cloud Tasks günlük kaydını etkinleştir
Cloud Tasks kaynaklı günlükler, bir görevle ilişkili isteğin durumu gibi yararlı teşhis bilgilerini içerir. Cloud Tasks kaynaklı günlükler, projenizde oluşturabileceği büyük miktardaki günlükler nedeniyle varsayılan olarak devre dışıdır. Görev kuyruğu işlevlerinizi aktif olarak geliştirip hata ayıklıyorken hata ayıklama günlüklerini etkinleştirmenizi öneririz. Günlüğe kaydetmeyi etkinleştirme başlıklı makaleyi inceleyin.
IAM İzinleri
Görevleri sıraya eklerken veya Cloud Tasks görev sırası işlevlerinizi çağırmaya çalışırken PERMISSION DENIED
hataları görebilirsiniz. Projenizde aşağıdaki IAM bağlamalarının bulunduğundan emin olun:
Cloud Tasks'e görev eklemek için kullanılan kimliğin
cloudtasks.tasks.create
IAM iznine sahip olması gerekir.Ö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
Cloud Tasks'te görev sıraya eklemek için kullanılan kimliğin, Cloud Tasks'teki bir görevle ilişkili hizmet hesabını kullanması gerekir.
Ö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 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 sahip olması gerekir.Ö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