---
title: "Radni proces je pao. Sinkronizacija nije."
description: "Zaustavite radni proces usred serije i pratite jedan kontakt: koji je kursor spremljen, zašto ponovljeni upis ne stiže dvaput i kome pripada sinkronizacija dok se ponovno pokreće. Zatim dva incidenta koja su pokazala da je oporavak samo pola posla."
url: https://tajo.io/hr/blog/worker-died-sync-didnt/
markdown: https://tajo.io/hr/blog/worker-died-sync-didnt.md
lang: hr-HR
author: "Set Noa"
author_url: https://tajo.io/hr/set-noa/
published: 2026-11-05
updated: 2026-11-05
alternates: {en-US: /blog/worker-died-sync-didnt.md, bg-BG: /bg/blog/worker-died-sync-didnt.md, cs-CZ: /cz/blog/worker-died-sync-didnt.md, de-DE: /de/blog/worker-died-sync-didnt.md, da-DK: /dk/blog/worker-died-sync-didnt.md, es-ES: /es/blog/worker-died-sync-didnt.md, fr-FR: /fr/blog/worker-died-sync-didnt.md, el-GR: /gr/blog/worker-died-sync-didnt.md, hi-IN: /hi/blog/worker-died-sync-didnt.md, id-ID: /in/blog/worker-died-sync-didnt.md, hu-HU: /hu/blog/worker-died-sync-didnt.md, it-IT: /it/blog/worker-died-sync-didnt.md, ja-JP: /jp/blog/worker-died-sync-didnt.md, ko-KR: /kr/blog/worker-died-sync-didnt.md, ar-SA: /ar/blog/worker-died-sync-didnt.md, nl-NL: /nl/blog/worker-died-sync-didnt.md, no-NO: /no/blog/worker-died-sync-didnt.md, pl-PL: /pl/blog/worker-died-sync-didnt.md, pt-BR: /pt/blog/worker-died-sync-didnt.md, ro-RO: /ro/blog/worker-died-sync-didnt.md, ru-RU: /ru/blog/worker-died-sync-didnt.md, sv-SE: /se/blog/worker-died-sync-didnt.md, zh-CN: /zh-cn/blog/worker-died-sync-didnt.md, sl-SI: /sl/blog/worker-died-sync-didnt.md, sr-Latn-RS: /sr/blog/worker-died-sync-didnt.md, th-TH: /th/blog/worker-died-sync-didnt.md, tr-TR: /tr/blog/worker-died-sync-didnt.md, ur-PK: /ur/blog/worker-died-sync-didnt.md, vi-VN: /vi/blog/worker-died-sync-didnt.md, sk-SK: /sk/blog/worker-died-sync-didnt.md}
---

[Sinkronizacija podataka](https://tajo.io/hr/blog/?category=data-sync)

# Radni proces je pao. Sinkronizacija nije.

Zaustavite radni proces usred serije i pratite jedan kontakt: koji je kursor spremljen, zašto ponovljeni upis ne stiže dvaput i kome pripada sinkronizacija dok se ponovno pokreće. Zatim dva incidenta koja su pokazala da je oporavak samo pola posla.

oporavak sinkronizacije nakon pogreške

Što se događa s pokrenutom sinkronizacijom kada radni proces padne usred serije?

Kursor se pomiče tek na kraju čiste serije, pa radni proces zaustavljen usred serije ostavlja kursor na početku te serije, a sljedeće izvođenje čita istu stranicu. Ključ isporuke svakog zapisa izvodi se iz kursora stranice i njegova položaja, a sedmodnevna evidencija dovršenih upisa sprječava da ponavljanje stigne dvaput. Jedan zakup po sinkronizaciji sprječava da dva izvođenja rade istodobno. To je bila lakša polovica. Jedna sinkronizacija padala je izvođenje za izvođenjem prije nego što ju je išta pauziralo, a jedan radni prostor ostao je tih, s pogreškama i bez ijednog uspjeha, prije nego što je to išta primijetilo. Zato sada postoji osigurač koji pauzira sinkronizaciju nakon pet uzastopnih pogrešaka i upozorenje svakog sata nakon dvadeset i četiri sata bez uspjeha.

[Saznajte više](https://tajo.io/hr/blog/worker-died-sync-didnt/#pratite-jedan-kontakt)

U [predavanju koje je 3. listopada 2026. objavio AI Engineer](https://www.youtube.com/watch?v=bRGyYaE0lxI&t=701s), stručnjak za odnose s programerima iz tvrtke Crusoe pokreće PyTorch treniranje na dva čvora A100. Zatim vlastitom sustavu za nadzor iz demonstracije javlja da je jedan GPU izbacio pogrešku XID 79. Čvor je označen kao nedostupan, a posao otkazan. Proces dobiva SIGTERM i „[do dvije minute da obradite taj SIGTERM i spremite kontrolne točke ili ispraznite zapisnike](https://www.youtube.com/watch?v=bRGyYaE0lxI&t=633s)“. Uskače rezervni čvor i „[slurm posao će se ponovno pokrenuti. Učitat će kontrolnu točku i nastaviti treniranje ondje gdje je stao](https://www.youtube.com/watch?v=bRGyYaE0lxI&t=769s)“. Sve skupa nešto manje od petnaest minuta. Nikoga nije trebalo zvati na dežurstvo.

Sinkronizacija je mnogo manja zvijer od treniranja. Pitanje je ipak isto. Što izvođenju treba da bi zaustavljanje radnog procesa stajalo nekoliko minuta i nula duplikata?

Ovo je odgovor za [Tajov vlastiti izvršitelj sinkronizacija](https://tajo.io/hr/resources/help/troubleshooting/recover-a-stuck-or-failed-sync/), iščitan iz koda, a ne iz brošure. [Reverse ETL](https://tajo.io/hr/blog/what-is-reverse-etl/) opisuje oblik tog posla. Ovdje je opisano što se događa kada taj posao umre.

## Pratite jedan kontakt

Izvođenje čita izvor stranicu po stranicu, od spremljenog kursora. Nazovimo kursor stranice `c3`, a naš kontakt 212. zapisom na toj stranici. Prije nego što se išta upiše, za taj kontakt vrijede tri stvari.

Prvo, ima ključ isporuke. Ključ je hash identifikatora sinkronizacije, izvora, kursora stranice, položaja na stranici i samog zapisa. Kursor i zapis ulaze u hash i nikada nisu ugrađeni u ključ, pa ključ ne nosi [nikakvu adresu e-pošte](https://tajo.io/hr/resources/help/getting-started/understanding-data-sync/).

Drugo, upis prolazi kroz [evidenciju](https://tajo.io/hr/resources/help/troubleshooting/recover-a-stuck-or-failed-sync/#ledger), a ne ravno u odredište. Prije poziva odredišta ključ se zauzima sa statusom na čekanju. Kada upis uspije, redak se označava kao dovršen i čuva se sedam dana.

Treće, kursor se nije pomaknuo. Pomiče se samo na kraju serije, samo ako je stigao svaki zapis iz te serije, i tek nakon što je izvođenje dokazalo da je sinkronizacija i dalje njegova.

Sada zaustavite radni proces između upisa i kontrolne točke.

Na SIGTERM svaki radni proces reda čekanja dovršava tekući posao unutar jednog zajedničkog roka od petnaest sekundi, a proces izlazi nakon dvadeset i pet sekundi bez obzira na to što još radi; systemd mu daje četrdeset i pet prije nego što ga prisilno ugasi. Izvođenje koje nije završilo unutar tog prozora i dalje je označeno kao u tijeku, a sljedeći radni proces preuzima ga putem oporavka zaglavljenih poslova u redu čekanja. Kod tvrdog zaustavljanja nema nikakvog dovršavanja. U svakom slučaju vrijede iste dvije činjenice. Odredište ima naš kontakt. Naš [kursor](https://tajo.io/hr/resources/help/troubleshooting/recover-a-stuck-or-failed-sync/#cursor) i dalje pokazuje `c3`.

## Ponavljanje

Sljedeće izvođenje počinje od `c3`, čita istu stranicu, za 212. zapis izvodi isti ključ i pita evidenciju. Evidencija odgovara: dovršeno. Odredište se ne poziva; spremljeni rezultat se ponavlja i izvođenje ide dalje. Na skupnom putu, gdje Brevo krajnja točka za uvoz prima cijelu stranicu u jednom pozivu, ista se provjera izvodi za svaki ključ prije nego što se sastavi zahtjev. Stranica na kojoj je svaki ključ već dovršen ne šalje ništa.

To je cijeli trik i vrijedi reći zašto funkcionira. Ključ se izvodi iz kursora stranice na početku serije, a ne iz izvođenja koje se slučajno odvijalo. Pad, ponovni pokušaj šezdeset sekundi kasnije i zakazano izvođenje sutra za isti zapis [izvode isti ključ](https://tajo.io/hr/resources/help/troubleshooting/recover-a-stuck-or-failed-sync/#ledger). Evidenciji je svejedno koje od njih pita.

Sada cijena. [Evidencija zaboravlja nakon sedam dana](https://tajo.io/hr/resources/help/troubleshooting/recover-a-stuck-or-failed-sync/#ledger). Komentar u kodu kaže da sedam dana pokriva odgođeni ponovni pokušaj i kratak prekid rada, i ništa više ne tvrdi. Ponavljanje od kursora starijeg od toga ponovno upisuje. A izvođenje koje je tvrdo prekinuto može čekati. Zakup mrtvog izvođenja vrijedi do petnaest minuta, a kod zakazane sinkronizacije izvođenje čiji je zakup slobodan [počisti se i ponovno zakaže tek kad je počelo prije više od sat vremena](https://tajo.io/hr/resources/help/troubleshooting/recover-a-stuck-or-failed-sync/#stuck-runs). Demonstracija tvrtke Crusoe [vraća se za manje od petnaest minuta](https://www.youtube.com/watch?v=bRGyYaE0lxI&t=753s). Naše ne uvijek.

## Kome pripada sinkronizacija dok se ponovno pokreće

Sinkronizacija u jednom trenutku pripada jednom izvođenju. Izvođenje u Redisu uzima [zakup](https://tajo.io/hr/resources/help/troubleshooting/recover-a-stuck-or-failed-sync/#lease) s vlastitim tokenom, trajanjem od petnaest minuta i obnovom svakih pet minuta. Prije svake kontrolne točke provjerava drži li i dalje taj zakup. Ako ga ne drži, zaustavlja se. Izvođenje se bilježi [jednostavnom rečenicom koju će pročitati čovjek](https://tajo.io/hr/resources/help/troubleshooting/recover-a-stuck-or-failed-sync/#failures): „The run lost its slot part-way through and stopped to avoid writing twice.“ (Izvođenje je usput izgubilo svoje mjesto i zaustavilo se kako ne bi upisalo dvaput.) Drugo izvođenje koje naiđe na živog vlasnika ne pokušava se ponovno. [Završava porukom](https://tajo.io/hr/resources/help/troubleshooting/recover-a-stuck-or-failed-sync/#failures) „Another run of this sync was already in progress“ (drugo izvođenje ove sinkronizacije već je bilo u tijeku), a sljedeće zakazano izvođenje počinje normalno.

Zapisano je i tko je vlasnik popravka. Svaki [kod pogreške](https://tajo.io/hr/resources/help/troubleshooting/recover-a-stuck-or-failed-sync/#failures) ima jednu rečenicu o tome što se dogodilo, jednu o tome što učiniti dalje i vlasnika: vas ili Tajo. Odredište koje je odbilo svaki zapis jer je mapiranje pogrešno vaše je. [Izgubljeni zakup je naš](https://tajo.io/hr/resources/help/troubleshooting/recover-a-stuck-or-failed-sync/#failures). Stranica izvođenja pokazuje sljedeći korak; [vodič za oporavak sinkronizacije](https://tajo.io/hr/resources/help/troubleshooting/recover-a-stuck-or-failed-sync/#failures) navodi o čemu je riječ.

Zasad je to lakša polovica. Pad stoji jedno ponavljanje i ništa ne stiže dvaput. Drugoj polovici naučila su nas dva incidenta.

## Pogreška za pogreškom

Jedna je sinkronizacija padala iznova i iznova. Ne u uskoj petlji: jednom po intervalu planera, izvođenje za izvođenjem, svaki put s istom porukom, da prilagođeni identifikator ne smije sadržavati dvotočku. Izvođenje nikada nije stiglo do odredišta. Umrlo je već pri stavljanju u red čekanja, prije nego što ga je ijedan izvršitelj vidio, pa upozorenje vezano uz izvršitelja nikada nije imalo na što reagirati.

Taj niz nitko nije pratio. To je cijeli nalaz.

Popravak je osigurač. Nakon svake zabilježene pogreške čita posljednjih pet završenih izvođenja sinkronizacije od njezine posljednje izmjene. Ako je svih pet pogrešaka, pauzira sinkronizaciju, upisuje jedan revizijski redak s razlogom `circuit_breaker_tripped` i šalje jedno kritično upozorenje. Niz se izvodi iz spremljenih izvođenja, a ne iz brojača u radnom procesu. Računa se pogreška zabilježena bilo kojim putem, uključujući pogrešku pri stavljanju u red čekanja koja je izazvala incident. Komentar u kodu kaže da bi zaustavio taj incident na petom izvođenju. Jedan uspjeh poništava niz. Uklanjanje pauze ponovno naoružava osigurač umjesto da ga ponovno okine na starim redcima. [Vodič za Shopify konektor](https://tajo.io/hr/docs/ecommerce-platforms/shopify/) kaže isto u jednoj rečenici: nakon pet uzastopnih neuspjelih izvođenja sinkronizacija se sama pauzira, a njezina stranica prikazuje posljednju pogrešku.

Osigurač pritom ništa ne popravlja. Crusoe zamjenjuje čvor i ponovno pokreće posao bez pitanja. Tajo se zaustavlja i pita: pauzirana sinkronizacija ostaje pauzirana dok čovjek ne ukloni uzrok i [ponovno je ne objavi](https://tajo.io/hr/resources/help/troubleshooting/recover-a-stuck-or-failed-sync/#pause). Oprezna zadana postavka je namjerna: automatski ponovni pokušaj sinkronizacije koja upisuje u zapise kupaca i sam je upis.

## Tišina koju nitko nije vidio

Prigovor je pošten i glasi ovako: „Osigurač koji pauzira nakon pet pogrešaka uhvatio bi i drugi incident. Zašto graditi drugog čuvara?“ Zato što drugi incident nije izgledao kao pogreška. Dugo je jedan radni prostor imao aktivnu sinkronizaciju, sve veću hrpu redaka s pogreškama i nijedan uspjeh, nikada, i ništa nije poslalo upozorenje. Svaki postojeći signal bio je vezan uz aktivnost: izvođenje nije uspjelo, stigao je webhook, premašen je budžet. Nula uspjeha nije događaj. To je odsutnost događaja, a osigurač radi samo kada je zabilježena pogreška. Mrtav planer, zaglavljen red čekanja, radni proces koji se nikad ne pokrene: ništa od toga ništa ne bilježi i osigurač se nikad ne budi.

Uređaj budnosti u lokomotivi radi obrnuto. Strojovođa ga mora stalno pritiskati, a tišina zaustavlja vlak. Verzija za sinkronizaciju [pokreće se jednom na sat](https://tajo.io/hr/resources/help/troubleshooting/recover-a-stuck-or-failed-sync/#hourly-check), trinaest minuta iza punog sata. Za svaki radni prostor s aktivnom sinkronizacijom postavlja jedno pitanje: je li u posljednja dvadeset i četiri sata uspjelo ijedno izvođenje? Radni prostor čija je najstarija aktivna sinkronizacija uključena prije manje od jednog dana ostavlja se na miru; još nije imao dan da uspije. Stariji i tihi dobiva jedno kritično upozorenje. Upozorenje kaže o kojoj je tišini riječ: izvođenja se bilježe, ali nijedno ne uspijeva, ili uopće nije zabilježeno nijedno izvođenje. Aktivira se jednom po incidentu. Oznaka u Redisu drži ga zatvorenim do prvog uspješnog izvođenja, zatim se briše, pa sljedeći incident ponovno šalje upozorenje.

Oba čuvara stigla su u jednom commitu, naknadno. Komentar osigurača kaže da bi zaustavio prvi incident na petom izvođenju. Komentar provjere budnosti kaže da sinkronizacija uključena davno i bez ijednog izvođenja mora poslati upozorenje. Nijedan od njih nije postojao kada je bio potreban. Napisali smo ih poslije, s oba incidenta zapisana u zaglavlju datoteke, da nitko ne zaboravi zašto.

## Što je izgrađeno, a što nije

Izgrađeno u trenutku pisanja:

- Kursor se sprema na kraju svake čiste serije i ponovno pri padu.
- Ključ isporuke svakog zapisa izvodi se iz kursora stranice i njegova položaja te se prije svakog poziva odredišta provjerava u [sedmodnevnoj evidenciji](https://tajo.io/hr/resources/help/troubleshooting/recover-a-stuck-or-failed-sync/#ledger).
- Jedan [zakup](https://tajo.io/hr/resources/help/troubleshooting/recover-a-stuck-or-failed-sync/#lease) po sinkronizaciji, s trajanjem od petnaest minuta.
- Pet [pokušaja](https://tajo.io/hr/resources/help/troubleshooting/recover-a-stuck-or-failed-sync/#retries) po izvođenju, s razmakom koji počinje od šezdeset sekundi i raste.
- [Osigurač](https://tajo.io/hr/resources/help/getting-started/understanding-data-sync/) koji pauzira sinkronizaciju nakon pet uzastopnih pogrešaka i bilježi razlog.
- [Upozorenje svakog sata](https://tajo.io/hr/resources/help/troubleshooting/recover-a-stuck-or-failed-sync/#hourly-check) nakon dvadeset i četiri sata bez uspjeha.

Nije izgrađeno, a vrijedi znati prije nego što se na to oslonite:

- Provjera budnosti prati radni prostor, a ne pojedinu sinkronizaciju. Jedna zdrava sinkronizacija skriva tihu susjednu sinkronizaciju u istom radnom prostoru.
- Njezino upozorenje [stiže do Tajo operatera](https://tajo.io/hr/resources/help/troubleshooting/recover-a-stuck-or-failed-sync/#hourly-check): uvijek kao redak u zapisniku, a gdje je konfigurirano i u Sentry, putem webhooka ili e-poštom. Ne pojavljuje se na stranici sinkronizacije. Pauza osigurača pojavljuje se.
- Ništa ne pokreće pauziranu sinkronizaciju ponovno. To radi čovjek.
- Oporavak nakon tvrdog zaustavljanja nije brz. Zakup može vrijediti petnaest minuta, a [pregled za čišćenje čeka sat vremena](https://tajo.io/hr/resources/help/troubleshooting/recover-a-stuck-or-failed-sync/#stuck-runs).
- Oba praga, pet pogrešaka i dvadeset i četiri sata, [postavke su implementacije](https://tajo.io/hr/resources/help/troubleshooting/recover-a-stuck-or-failed-sync/#limits). Ne možete ih postaviti za pojedinu sinkronizaciju.

[Dugi lanac gotovo savršenih koraka ipak zakaže](https://tajo.io/hr/blog/almost-perfect-steps-unreliable-chain/); izlaz je definirati završno stanje i provjeravati ga. Ovaj je članak operativna polovica toga. Definirajte što za sobom ostavlja mrtvo izvođenje i provjeravajte ono ništa koje za sobom ostavlja tišina.

Završna rečenica tvrtke Crusoe bila je da su „[pogreške neizbježne](https://www.youtube.com/watch?v=bRGyYaE0lxI&t=955s)“. Naša ide korak dalje. Pad je bio lakša polovica jer je za sobom ostavio retke. Tišina je bila polovica koju smo morali otići potražiti.

## Često postavljana pitanja

**Što se događa s pokrenutom sinkronizacijom kada radni proces padne usred serije?**

Kursor i dalje pokazuje na početak prekinute serije jer ga Tajo pomiče tek kada serija stigne bez pogrešaka. Sljedeće izvođenje ponovno čita istu stranicu. Svaki zapis nosi ključ isporuke izveden iz kursora stranice i svog položaja, a evidencija čuva svaki dovršeni upis sedam dana, pa se već upisani zapisi ponavljaju iz evidencije umjesto da se odredištu pošalju drugi put.

**Zašto ponovljena sinkronizacija ne upisuje isti kontakt dvaput?**

Prije svakog poziva odredišta izvođenje provjerava ključ isporuke zapisa u evidenciji. Ključ je hash sinkronizacije, izvora, kursora stranice, položaja na stranici i samog zapisa, pa pad, ponovni pokušaj minutu kasnije i zakazano izvođenje sljedeći dan za isti zapis izvode isti ključ. Ključ koji je unutar sedmodnevnog prozora već označen kao dovršen ne šalje se ponovno.

**Što je upozorenje budnosti za sinkronizaciju?**

Provjera koja se aktivira na odsutnost, a ne na pogrešku. Jednom na sat Tajo pregledava svaki radni prostor s aktivnom sinkronizacijom i šalje upozorenje kada u posljednja dvadeset i četiri sata nijedno izvođenje nije uspjelo, uključujući slučaj kada uopće nije zabilježeno nijedno izvođenje. Aktivira se jednom po incidentu i ponovno se naoružava nakon prvog uspješnog izvođenja. Postoji zato što upozorenje o pogrešci vidi samo pogreške koje su zabilježene.

## Povezani članci

### [Šest pravila za sinkronizaciju koja radi dok nitko ne gleda](https://tajo.io/hr/blog/six-rules-unattended-sync/)

6\. stu 2026. · 7 min čitanja

7 odjeljaka

### [Tijek rada između dvaju okvira](https://tajo.io/hr/blog/the-workflow-between-the-boxes/)

8\. lis 2026. · 4 min čitanja

Zapis trgovine → Operaterov ispravak → Odredište za e-poštu

### [Brevo integracije: odaberite vezu koju možete provjeriti](https://tajo.io/hr/blog/brevo-connector-guide/)

19\. kol 2026. · 4 min čitanja

6 odjeljaka
