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şzamanlı olarak çalıştırmasına yardımcı olmak için Google Cloud Tasks'dan yararlanır.
Örneğin, şu anda bir hız sınırına sahip 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 tüketicisi olmak için hız sınırlarına uymanız gerekir. Ayrıca, bu tür uzun süren işler, zaman aşımları ve bellek sınırları nedeniyle başarısızlığa karşı savunmasız olabilir.
Bu karmaşıklığı azaltmak için scheduleTime
ve dispatchDeadline
gibi temel görev seçeneklerini ayarlayan bir görev sırası işlevi yazabilir, ardından işlevi Cloud Tasks içindeki bir sıraya aktarabilirsiniz. Cloud Tasks
ortamı, özellikle bu tür işlemler için etkili tıkanıklık kontrolü ve yeniden deneme politikaları sağlamak üzere tasarlanmıştır.
Cloud Functions for Firebase v3.20.1 ve üzeri sürümler için Firebase SDK, görev sırası işlevlerini desteklemek üzere Firebase Admin SDK v10.2.0 ve üzeri sürümlerle birlikte çalışır.
Firebase ile görev sırası işlevlerini kullanmak, işleme için ücret alınmasına neden olabilir.Cloud Tasks Daha fazla bilgi için Cloud Tasks fiyatlandırması bölümüne bakın.
Görev sırası işlevleri oluşturma
Görev sırası işlevlerini kullanmak için şu iş akışını izleyin:
- Firebase SDK'sını kullanarak Cloud Functions için bir görev sırası işlevi yazın.
- HTTP isteğiyle tetikleyerek işlevinizi test edin.
- İşlevinizi Firebase CLI ile dağıtın. Görev sırası işlevinizi ilk kez dağıtırken CLI, kaynak kodunuzda belirtilen seçeneklerle (hız sınırlama ve yeniden deneme) Cloud Tasks içinde bir görev sırası oluşturur.
- Yeni oluşturulan görev sırasına görevler ekleyin. Gerekirse yürütme planı ayarlamak için parametreleri iletin. Bunu, Admin SDK kullanarak kodu yazıp Cloud Functions for Firebase'ye dağıtarak yapabilirsiniz.
Görev sırası işlevlerini yazma
Görev sırası işlevleri 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 sıklık 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 uygulamaya dayanmaktadır:
Görev sırası işlevlerini yapılandırma
Görev sırası işlevleri, 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 sırasındaki 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ın azaltılmasına yardımcı olur.retryConfig.minBackoffSeconds=60
: Her görev, her denemeden en az 60 saniye sonra yeniden denenir. Bu sayede, 5 yeniden deneme hakkını çok hızlı bir şekilde tüketmemek için her deneme arasında büyük bir arabellek sağlanır.rateLimits.maxConcurrentDispatch=6
: Belirli bir zamanda en fazla 6 görev gönderilir. Bu, temel işlevlere yönelik istek akışının sabit olmasını sağlar ve etkin örneklerin sayısını ve baştan başlatma işlemlerini azaltır.
Görev sırası işlevlerini test etme
Çoğu durumda, görev sırası 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 ayarlayacağınızı öğrenmek üzere Emulator Suite dokümanlarına bakın.
Ayrıca, görev sırası işlevleri Firebase Local Emulator Suite içinde basit HTTP işlevleri olarak sunulur. Bir JSON veri yüküyle 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
Firebase CLI'yı kullanarak görev sırası işlevini dağıtın:
$ firebase deploy --only functions:backupApod
Bir görev sırası işlevini ilk kez dağıtırken CLI, kaynak kodunuzda belirtilen seçeneklerle (hız sınırlama ve yeniden deneme) Cloud Tasks içinde 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 alma
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'ya sıraya alınabilir. Admin SDK kullanmaya yeni başladıysanız başlamak için Sunucuya Firebase ekleme başlıklı makaleyi inceleyin.
Tipik bir akışta Admin SDK, yeni bir görev oluşturur, bunu Cloud Tasks'ye 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, görevlerin yürütülmesini yaymaya çalışır. Bunun için N. görev için N. dakikalık bir gecikme ilişkilendirilir. Bu, dakikada yaklaşık 1 görevin tetiklenmesi anlamına gelir. Cloud Tasks öğesinin belirli bir zamanda bir görevi tetiklemesini istiyorsanızscheduleTime
öğesini de kullanabileceğinizi unutmayın.dispatchDeadlineSeconds
: Bir görevin tamamlanması için Cloud Tasks bekleyeceği maksimum süre. Cloud Tasks, kuyruğun yeniden deneme yapılandırmasına göre 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 girişimleri dahil) 5 dakikadan uzun sürerse görev otomatik olarak iptal edilir.
Sorun giderme
Cloud Tasks günlük kaydını etkinleştirme
Cloud Tasks günlükleri, bir görevle ilişkili isteğin durumu gibi faydalı teşhis bilgileri içerir. Cloud Tasks, projenizde çok sayıda günlük oluşturabileceğinden bu hizmetin günlükleri varsayılan olarak devre dışıdır. Görev sırası işlevlerinizi aktif olarak geliştirip hatalarını ayıklarken 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 alırken veya PERMISSION DENIED
görev kuyruğu işlevlerinizi çağırmaya çalışırken Cloud Tasks hataları görebilirsiniz. Projenizin aşağıdaki IAM bağlamalarına sahip olduğundan emin olun:
Görevleri Cloud Tasks'ya sıraya almak için kullanılan kimliğin
cloudtasks.tasks.create
IAM izni olmalıdır.Ö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 Cloud Tasks'ya sıraya almak için kullanılan kimliğin, Cloud Tasks'daki bir görevle ilişkili hizmet hesabını kullanma izni olmalıdı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 talimatları için Google Cloud IAM belgelerine bakın.
Görev sırası 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