Worker'lar
Bir worker sizin kendi sürecinizdir ve adım gövdelerini daemon'a sunar. Bu sayfa, onun konuştuğu protokolü ve her çağrının neden orada olduğunu anlatır.
Worker nedir
Bir worker, talep edilebilir adımların gövdelerini tutar ve daemon'dan iş ister. Kodunuzun çalıştığı yerde, sizin import'larınız, bağlantı havuzunuz ve kimlik bilgilerinizle çalışır; daemon bunların hiçbirini görmez. Daemon ona işlenmiş girdiyi ve önceki adımları taşıyan bir lease verir; worker gövdeyi çalıştırır ve nasıl gittiğini bildirir. İlişkinin tamamı budur.
Her SDK'nın kendi worker'ı vardır. Tuttuğu iş akışlarını kaydeder, lease için uzun yoklama yapar, bir gövde çalışırken heartbeat gönderir ve her reddi sebebine göre yanıtlar. Aşağıdaki örnek, İş akışları sayfasındakiyle aynı programdır; burası onu sunan kısmıdır.
gövdeleri sunma
// Serve step bodies for as long as this process lives. The worker registers
// the definition, long-polls for leases, heartbeats while a body runs, and
// answers every 409 by its reason.
const worker = new Worker(mcpd, { concurrency: 8 }).register(support)
void worker.serve() # Serve step bodies for as long as this process lives. serve() blocks, so it
# runs on a thread of its own when the process does other work too.
worker = Worker(mcpd, concurrency=8).register(support)
threading.Thread(target=worker.serve, daemon=True).start() // Serve step bodies for as long as this process lives: register, long-poll
// for leases, heartbeat while a body runs, answer every 409 by its reason.
let worker = Worker::builder(&mcpd).concurrency(8).register(support).build();
let serving = {
let worker = worker.clone();
tokio::spawn(async move { worker.serve().await })
}; // Serve step bodies for as long as this process lives: register, long-poll
// for leases, heartbeat while a body runs, answer every 409 by its reason.
worker := mcpd.NewWorker(m, mcpd.WorkerConcurrency(8)).Register(support)
go func() { _ = worker.Serve(ctx) }() // Serve step bodies for as long as this process lives: register, long-poll
// for leases, heartbeat while a body runs, answer every 409 by its reason.
val worker = Worker(mcpd, concurrency = 8).register(support)
launch { worker.serve() } # Serve step bodies for as long as this node lives: register, long-poll for
# leases, heartbeat while a body runs, answer every 409 by its reason.
{:ok, worker} = StepWorker.start_link(mcpd, workflows: [support], concurrency: 8)
:ok = StepWorker.serve(worker) Protokol
Beş çağrı; bunları konuşan bir worker, SDK olmadan doğrudan HTTP API'ye karşı yazılabilir. Her SDK'nın worker'ı bunların bir istemcisidir, fazlası değil.
One lease
The daemon learns that a body is running from started, that the worker is alive from the heartbeats, and how the step ended from complete or fail. Miss the heartbeats and the lease is reclaimed; a later call about it is refused with a reason, never lost.
| Çağrı | Ne yaptığı |
|---|---|
POST /v1/api/workers/register | Worker'ı duyurur ve tuttuğu tanımları saklar. Yanıt, protokolün geri kalanının üzerinde döndüğü iki sayıyı, lease_ttl_ms ve heartbeat_ms değerlerini taşır. |
POST /v1/api/steps/claim | Çalıştırılabilir adımlardan en çok max tanesini sunar, hiç yoksa isteği wait_ms kadar açık tutar. Daemon bir talebi en çok istek zaman aşımının beşte dördü kadar, varsayılanda 24 saniye, tutar ve durduğunda hemen yanıt verir; bu yüzden bir talep wait_ms dolmadan boş dönebilir: yeniden talep edin. Bir talep tek bir çalıştırmayla sınırlanabilir; bir betiğin kendi çalıştırmasını sonuna kadar yürütmesi böyle olur. |
POST /v1/api/steps/{lease}/started | Gövdenin çalıştığını bildirir. Her zaman gövdeden önce: daemon'a sunulmuş ile çalışıyor arasındaki farkı söyleyen budur. |
POST /v1/api/steps/{lease}/heartbeat | Lease'i uzatır. Daemon'un bir worker'ın hayatta olduğuna dair elindeki tek kanıt. |
POST /v1/api/steps/{lease}/complete, /fail | Adımı bitirir: çıktı, çalıştırmanın durum verisine bir yama ve daemon'un fiyatladığı kullanım; ya da yeniden denenip denenmeyeceğine karar veren sınıfıyla bir hata. |
Lease'ler
Bir lease, tek bir worker'ın sınırlı bir süre boyunca tuttuğu tek bir denemedir. İşlenmiş girdiyi, kimliğine göre anahtarlanmış önceki adımları, çalıştırmanın durum verisini ve ilişkilendirmesini, bu adımın yeniden denemeleri boyunca sabit kalan bir anahtarı ve daemon'un açtığı adım span'inin trace ve span kimliklerini taşır. Kendi span'lerini adım bağlamı üzerinden kaydeden bir gövde onları o span'in altına koyar, böylece bir adımın içindeki model çağrısı çalıştırmanın trace'ine doğru derinlikte iner.
Worker'ın heartbeat göndermeyi bıraktığı bir lease sona erer. Daemon denemeyi
sahipsiz olarak işaretler ve bir geri alma penceresinden sonra
at_least_once altında kuyruğa geri koyar,
at_most_once altında ise başarısız sayar. Bir duraklamadan dönüp
geri alınmış bir lease'e gönderim yapan worker yok sayılmaz: kendisine
söylenir.
Dört ret
Daemon'un kabul edemediği bir worker çağrısı, dört sebepten birini taşıyan bir 409 ile reddedilir. Bu küme kapalıdır ve her SDK'nın worker'ı her sebebi adıyla ele alır; çünkü hepsini tek bir dala indiren bir worker, bitirdiği adımları terk eder ya da bir başarıyı başarısızlık olarak bildirir.
| Sebep | Anlamı | Worker'ın yaptığı |
|---|---|---|
already_applied | Bu lease'in kendi önceki complete ya da fail çağrısı ulaşmış, yanıtı kaybolmuştur. | Başarı sayar ve başka bir şey göndermez. |
fenced | Daha yeni bir deneme vardır, ya da başka bir lease bunu sonlandırmıştır. | İşi bırakır ve bu lease için başka bir şey göndermez. Fence'e takılan bir heartbeat, çalışan gövdeyi de bağlamı üzerinden iptal eder. |
run_terminal | Çalıştırma; biterek, başarısız olarak, zaman aşımına uğrayarak ya da iptal edilerek sona ermiştir. | Durur ve o çalıştırma için talepte bulunmayı bırakır. |
not_started | started çağrısı hiç gelmemiş bir at_most_once denemesi için complete ya da fail gelmiştir. | Bunu worker'daki bir hata olarak açıkça bildirir. SDK worker'ları bunu üretemez; elle yazılmış bir worker üretebilir. |
Gövde
Bir gövde; bir bağlam, işlenmiş girdisi ve önceki adımları alır. Daemon'un
neyi saklaması gerektiğini bildirdiği yer bağlamdır: complete
sırasında birleştirilen ve üst düzey anahtarları değiştiren, çalıştırmanın
durum verisine bir yama; harcadığı ve daemon'un span'lerle aynı kitaptan
fiyatladığı token'lar; ve lease kaybedildiğinde ya da çalıştırma sona
erdiğinde tetiklenen bir iptal sinyali, böylece bu sinyali kendi I/O'suna
veren bir gövde durması gerektiğinde durur. Token'lar kendiliğinden toplanır:
gövdenin bağlam üzerinden kaydettiği bir span ve onun altındaki her span,
bittiğinde kullanımını adımınkine ekler; yani model çağrılarını span olarak
kaydeden bir gövde elle toplama yapmaz, set_usage da hiç
kaydetmeyen bir gövde için açık geçersiz kılmadır.
Bir gövde ya çıktısını döndürerek ya da hata fırlatarak biter. Adımın bütçesi içinde yeniden denenmek için SDK'nın yeniden denenebilir hatasını fırlatın; başka bir sınıfı adlandırmak için türü belli bir adım hatası fırlatın; geri kalan her şey ölümcüldür. Mesaj daemon'a gönderilir ve günlükte gösterilir. Yığın izi gösterilmez.
Worker'ın tutmadığı bir tanım, sürüm ya da adım için gelen bir lease
unservable ile başarısız sayılır ve gövde hiç çalışmaz. Deneme,
yeniden deneme bütçesini harcamadan, onu tutan bir worker için kuyruğa geri
döner; bir dağıtım boyunca bir worker'ın iki sürümünün yan yana çalışmasını
sağlayan da budur.
Yatay büyüme
Tek bir daemon'a karşı istediğiniz kadar worker çalıştırın. Her biri kendi eşzamanlılığı kadar talep eder, daemon her denemeyi tam olarak birine verir ve bir şekilde iki worker'ın birden tuttuğu bir lease, fence sayesinde tek bir kazananla sonuçlanır. Bir worker'ın kimliği aldığı her denemeye yazılır, böylece günlük bir adımı hangi sürecin çalıştırdığını söyler. Her sürece bir ad verin, ya da SDK'nın adı makineden türetmesine bırakın.
Bir talep uzun yoklamadır, yani boştaki bir filonun daemon'a maliyeti worker başına bir açık istektir, trafik değil. Beklerken bir talep; bir çalıştırma başladığında, bir adım bittiğinde, bir süre sonu tetiklendiğinde ya da bir olay bir beklemeyi devam ettirdiğinde iş arar, bunların dışında da saniyede en çok iki kez. Meşgul bir filo worker'ların kendi eşzamanlılığıyla sınırlıdır ve bir saat süren bir gövdenin maliyeti on saniyede bir heartbeat'tir, başka bir şey değil.
Anahtarlar
Worker çağrıları worker kapsamını ister; çalıştırma başlatmak,
sinyal göndermek ve iptal etmek execute kapsamını ister. İkisi de
tanımlı değilken yazma anahtarları kullanılır ve bir admin anahtarı ikisini
de içerir. Yalnızca adım sunan bir worker'ın çalıştırma başlatabilen bir
anahtara ihtiyacı yoktur; yalnızca olay yayımlayan bir webhook'un da adım talep
edebilen bir anahtara ihtiyacı yoktur. Seçenekler için
Yapılandırma sayfasına
bakın.
Worker çağrıları denetim günlüğüne kaydedilmez, oysa bir lease adımın girdisini ve önceki adımların çıktılarını taşır. Bunlar dakikada birçok kez talep eden bir makine döngüsüdür ve talep başına bir satır, bir kişinin yaptığı okumaları gömerdi. Bir çalıştırmayı çalıştırma endpoint'leri üzerinden geri okumak kaydedilir; Güvenlik sayfasına bakın.
Sonraki
- Bir çalıştırmayı başlatmak, izlemek ve bir beklemeyi yanıtlamak: Çalıştırmalar.
- Worker'ın sunduğu tanım: İş akışları.
- Belirtimden üretilen, worker protokolünün her endpoint'i: HTTP API, Workers.