Skip to main content
Bir mantık fonksiyonu çalıştırması, timeoutSeconds değeriyle sınırlandırılır (en fazla 900 saniye). Bu sürede tamamlanamayan her şey — tam bir yeniden eşitleme, kayıt başına dağıtım, sizi hız sınırına takan üçüncü taraf bir API — daha küçük çalıştırmalara bölünmek zorundadır. enqueueJobs tam olarak bunu yapar: Twenty işleyicilerinden, uygulamanızın mantık fonksiyonlarından birini daha sonra, her veri yükü için bir kez, her çalıştırma kendi işleminde ve kendi zaman aşımı bütçesiyle çalıştırmasını ister. Çağıran hemen döner.

Çalıştırmaları kuyruğa al

enqueueJobs fonksiyonunu twenty-sdk/logic-function içinden içe aktarın, çalıştırılacak mantık fonksiyonunun universalIdentifier değerini belirtin ve kuyruğa almak üzere her çalıştırma için bir veri yükü iletin.
src/logic-functions/sync-all-contacts.ts
Her çalıştırma, tıpkı diğer tetikleyicilerde olduğu gibi, veri yükünü işleyici argümanı olarak alır. Hedef, çağrıyı yapanla aynı uygulamaya ait olmalıdır — başka bir uygulamanın fonksiyonunu kuyruğa alma girişimi Logic function not found hatasıyla reddedilir ve hiçbir şey kuyruğa alınmaz. Tek bir çağrı en fazla 200 veri yükünü kabul eder.
enqueueJobs, işler kabul edilir edilmez döner; işler çalıştığında değil. Hedeflerin sonuçlarını döndürmez — bunları daha sonra okumanız gerekiyorsa, her hedefin ürettiği veriyi anahtar-değer deposuna veya bir çalışma alanı kaydına yazmasını sağlayın.
Her çağrıda tek bir işi kuyruğa alan eski enqueueJob yardımcısı kullanım dışı bırakılmıştır. Bunun yerine tek öğeli bir payloads listesiyle enqueueJobs kullanın.

İş seçenekleri

Seçenekler, toplu işlemdeki her çalıştırma için geçerlidir.
Öncelik henüz yapılandırılamıyor. Kuyruğa alınan işler her zaman en düşük öncelikte çalışır, bu nedenle platform işleri asla uygulama işlerinin arkasında gecikmez. Öncelik üzerinde denetim yakında geliyor.
Kuyruğa alınan çalıştırma, onu kuyruğa alan fonksiyonun etkin kullanıcı bilgisini devralır; böylece aynı izinlerle hareket eder.

Geçici bir hatayı yeniden dene.

Twenty, uygulama kodundan kaynaklanan her özel durumu yeniden denemez. Normal şekilde fırlatılan bir hata kalıcı hata olarak değerlendirilir. Geçici bir hata için, kuyruktaki bir mantık işlevi RetryableLogicFunctionError fırlatarak en fazla üç yeniden deneme isteyebilir.
Mümkün olduğunda doğrudan RetryableLogicFunctionError fırlatın. Bunu genişletirseniz name değerini değiştirmeyin: Twenty, serileştirilmiş RetryableLogicFunctionError adını yürütme çalışma zamanları arasında tanır. retryCount, ilk yürütme için 0 değerindedir ve yalnızca uygulama kodu yeniden deneme istediğinde artar. maxRetries en fazla 3 değerindedir ve kuyruktaki işin genel yeniden deneme sınırı daha düşük olduğunda daha düşük olabilir. Platform hataları, kuyruğun genel güvenlik bütçesini tüketmeye devam etse de retryCount değerini artırmaz. Kuyruk, yeniden deneme girişimlerini üstel geri çekilme ve titreşimle geciktirir. Kesin gecikme kasıtlı olarak garanti edilmez; bu nedenle uygulama kodu, yeniden denemenin kesin bir zamanda gerçekleşmesine bağlı olmamalıdır. maxRetries değerine ulaşıldığında, başka bir yürütme olmadan başka bir RetryableLogicFunctionError nihai uygulama hatası olarak kaydedilir.
Yeniden denemeler tüm işleyiciyi yeniden çalıştırır ve bazı yan etkiler başarılı olduktan sonra gerçekleşebilir. Yeniden deneme istemeden önce işleyiciyi idempotent hale getirin.

Kullanım örneği: uzun bir eşitleme boyunca sayfalama yapma

Klasik biçim, bir sonraki imleçle kendini kuyruğa alan bir fonksiyondur. Her çalıştırma, kendi zaman aşımı süresinin oldukça altında bir sayfa işi tamamlar ve hiçbir şey kalmadığında zincir durur.
src/logic-functions/sync-contacts-page.ts

Kayıt başına fan-out

İş doğal olarak öğe bazındaysa, tek bir çağrıda her öğe için bir işi kuyruğa alın ve döngüyü satır içi çalıştırmak yerine çalışanların bunları paralel olarak işlemesine izin verin.

Uzun süre çalışan işler için iyi uygulamalar

Hemen hemen tüm uzun işleri kapsayan iki kural: döngü kurmak yerine özyineleme (recurse) kullanın ve her çalıştırmada sınırlı büyüklükte bir parçayı işleyin. Her şeyi tek seferde yapmaya çalışan bir çalıştırma, hata senaryosudur — zaman aşımına takılır ve yeniden denemede her şeyi baştan başlatır. Bunun yerine, bir parçayı timeoutSeconds süresinin içinde rahatça bitecek şekilde boyutlandırın, konumunuzu kalıcı hale getirin ve sonraki çalıştırmayı kuyruğa alın.
src/logic-functions/enrich-companies-batch.ts
Bunu işe yarar kılanlar:
  • Parça boyutunu ortalamaya değil, en yavaş öğeye göre belirleyin. CHUNK_SIZE × en kötü durum öğe süresi değeri, pay bırakacak şekilde timeoutSeconds içine sığmalıdır, yoksa parça kuyruğunun sonundakiler çalıştırma kesildiğinde kaybolur.
  • Sonlandırma koşulunu açık hale getirin. Yalnızca tam dolu bir parça döndüğü sürece özyineleme yapın. Yalnızca “sonuç yok” durumunda duran bir zincir, kaynak ortada bir yerde kısa bir sayfa döndürürse sonsuza dek devam eder.
  • Sonraki çalıştırmayı kuyruğa almadan önce ilerlemeyi kalıcı hale getirin, böylece başarısız olan bir halka baştan başlamak yerine son tamamlanan parçadan yeniden başlar.
  • Her parçayı idempotent tutun. Bir yeniden denemeden sonra aynı parçanın yeniden işlenmesi, iki kez yazma yapmamalıdır — yazma işlemlerini, işlediğiniz kayıt veya harici kimlik üzerinde anahtarlandırın.
  • Oran sınırlamalı bir üçüncü tarafla çalışırken, tek bir dev fan-out yerine parçalara bölünmüş bir zinciri tercih edin; delayMs içeren bir zincir kendi hızını ayarlar, oysa binlerce işi bir kerede kuyruğa almak, hepsinin aynı anda uygun hale gelmesine neden olur.