Power Automate bez awarii: jak zbudować retry, timeout i kolejkę dla plików
Jak zbudować niezawodne flow do obsługi plików w Power Automate? Praktycznie pokazujemy retry, exponential backoff, timeouty, kolejkę, idempotencję, dead-letter, reprocess oraz monitoring awarii.
Jakie błędy w Power Automate powodują, że przetwarzanie plików jest losowo zawodnie?
Najczęściej nie chodzi o „losowość”, tylko o niestabilny model przetwarzania. Flow działa poprawnie dla części plików, a zawodzi dla innych, bo opiera się na założeniach, które nie zawsze są prawdziwe: że plik jest już w pełni zapisany, że konektor odpowie w stałym czasie, że dwa uruchomienia nie wejdą sobie w drogę albo że identyfikator pliku nie zmieni się między krokami. W praktyce właśnie te ukryte założenia powodują pozornie przypadkowe błędy.
Bardzo częsty problem to próba odczytu lub przeniesienia pliku zbyt wcześnie, gdy zdarzenie wykryło jego pojawienie się, ale sam zapis jeszcze trwa albo metadane nie są gotowe. Wtedy jeden przebieg kończy się sukcesem, a inny zwraca błąd typu „plik nie istnieje”, „zasób nie został znaleziony” albo pobiera niepełną zawartość. Podobny efekt daje używanie ścieżek i nazw zamiast stabilnych identyfikatorów w miejscach, gdzie plik może zostać równolegle zmieniony, przeniesiony lub nadpisany.
Drugą grupą są błędy związane z współbieżnością. Jeśli kilka uruchomień flow przetwarza ten sam folder bez kontroli kolejności, mogą jednocześnie pobrać ten sam plik, próbować go przenieść do różnych lokalizacji albo zapisać wynik pod tą samą nazwą. Taki wyścig nie musi występować zawsze, dlatego sprawia wrażenie awarii „od czasu do czasu”. To samo dotyczy pętli działających równolegle wewnątrz jednego przepływu.
Kolejna przyczyna to brak rozróżnienia błędów przejściowych od trwałych. Czasowe problemy z konektorem, limity API, chwilowe blokady pliku czy opóźniona odpowiedź usługi są normalne w systemach integracyjnych. Jeżeli flow traktuje każdy wyjątek tak samo i kończy się po pierwszym niepowodzeniu, przetwarzanie będzie wyglądało na niestabilne. Odwrotny błąd też jest częsty: bezwarunkowe ponawianie operacji, która z definicji nie może się udać, na przykład gdy wskazano złą lokalizację lub błędny format danych.
Losową zawodność powoduje również niepełna obsługa limitów i timeoutów. Duże pliki, wolniejsze odpowiedzi konektorów, długie operacje konwersji lub skanowania oraz limity liczby wywołań sprawiają, że ten sam scenariusz raz mieści się w czasie, a innym razem nie. Jeśli projekt flow zakłada, że każde pobranie, zapis czy aktualizacja zakończy się szybko, to przy większym obciążeniu pojawiają się błędy trudne do odtworzenia.
Istotny jest też sposób identyfikacji pliku i stanów pośrednich. Błędy pojawiają się, gdy logika opiera się wyłącznie na nazwie pliku, bez sprawdzenia wersji, rozmiaru, czasu modyfikacji albo znacznika „gotowy do przetwarzania”. Wtedy łatwo przetworzyć plik nie ten, który trzeba, ten sam plik dwa razy albo plik częściowo zaktualizowany. Tego typu problem często bywa mylony z awarią platformy, choć wynika z braku jednoznacznego modelu stanu.
W praktyce za „losowo zawodny” przepływ odpowiada zwykle kombinacja tych błędów: brak oczekiwania na gotowość pliku, równoległe wykonania bez kontroli, używanie niestabilnych odwołań do plików, nieuwzględnienie błędów przejściowych oraz ignorowanie limitów czasowych i wydajnościowych. Jeśli te obszary nie są jawnie zaprojektowane, nawet poprawnie zbudowany na pierwszy rzut oka flow będzie działał nieregularnie.
Jak ustawić retry z exponential backoff, żeby nie dobijać źródła i nie gubić plików?
Retry z exponential backoff trzeba ustawić tak, aby kolejne próby były coraz rzadsze, a nie wykonywane natychmiast po błędzie. Chodzi o dwa cele jednocześnie: po pierwsze nie przeciążać systemu źródłowego, który może chwilowo odrzucać żądania z powodu limitów, blokad lub krótkiej niedostępności, a po drugie nie uznać pliku za utracony tylko dlatego, że pierwszy odczyt się nie udał. W praktyce oznacza to ograniczoną liczbę ponowień, rosnące odstępy między nimi i jasne rozróżnienie błędów przejściowych od trwałych.
W Power Automate retry należy stosować głównie do operacji odczytu, pobrania lub zapisu, które mogą chwilowo zwracać błędy typu timeout, 429 albo 5xx. Dla takich przypadków sensowne jest kilka prób z opóźnieniem rosnącym wykładniczo, na przykład druga próba po kilkunastu sekundach, kolejna po dłuższym czasie, a ostatnia po jeszcze większym odstępie. Nie należy ustawiać zbyt dużej liczby ponowień ani bardzo krótkich interwałów, bo wtedy mechanizm retry zamienia się w serię agresywnych uderzeń w to samo źródło. Równie niebezpieczne jest ustawienie zbyt małej liczby prób, bo krótkotrwała awaria może wtedy zakończyć się niepotrzebną utratą przetwarzania pliku.
Kluczowe jest to, że sam retry nie może być jedynym zabezpieczeniem przed zgubieniem pliku. Jeśli po wyczerpaniu prób przepływ kończy się błędem i nie ma stanu pośredniego, plik może zniknąć z procesu operacyjnie, nawet jeśli fizycznie nadal istnieje w źródle. Dlatego przed wykonaniem operacji warto mieć trwały identyfikator pliku i status przetwarzania, tak aby po nieudanych próbach można było oznaczyć element jako oczekujący na ponowne podejście, a nie jako zakończony. Wtedy exponential backoff chroni źródło, a jednocześnie nie powoduje utraty informacji o tym, co jeszcze wymaga obsługi.
Trzeba też unikać retry dla błędów trwałych, takich jak brak uprawnień, nieprawidłowa ścieżka, usunięty zasób czy błędny format danych. W takich przypadkach kolejne próby niczego nie poprawią, tylko wydłużą czas i zwiększą obciążenie. Poprawna konfiguracja polega więc na tym, że retry działa wyłącznie dla błędów przejściowych, ma ograniczony maksymalny czas oczekiwania i po przekroczeniu tego limitu przekazuje plik do dalszej obsługi błędu, zamiast próbować bez końca.
Najbezpieczniejsze ustawienie to takie, w którym liczba prób jest mała do umiarkowanej, odstępy między nimi wyraźnie rosną, a po ostatniej nieudanej próbie plik nie przepada, tylko dostaje status wymagający ponownego uruchomienia albo trafia do kontrolowanej kolejki błędów. Dzięki temu nie dochodzi ani do bombardowania źródła kolejnymi wywołaniami, ani do sytuacji, w której plik został pominięty tylko dlatego, że system był chwilowo niedostępny.
Jak sensownie ustawić timeouty i limity, żeby flow nie wisiał godzinami?
Najważniejsza zasada jest prosta: czas oczekiwania musi być krótszy niż biznesowo akceptowalny czas przetwarzania. Jeśli pojedynczy krok standardowo trwa sekundy lub kilka minut, nie powinien mieć timeoutu ustawionego na wiele godzin tylko dlatego, że „może kiedyś się uda”. Zbyt długie timeouty powodują blokowanie uruchomień, utrudniają diagnozę i zwiększają ryzyko narastania zaległości.
Timeout warto ustawiać na podstawie realnego czasu wykonania z zapasem, a nie intuicyjnie. Dobra praktyka to przyjąć typowy czas działania danego kroku i dodać rozsądny margines, na przykład 2–3 razy więcej niż normalnie, ale nadal na tyle mało, by błąd został wykryty szybko. Jeżeli akcja zwykle kończy się w 10–30 sekund, timeout rzędu kilku minut jest zwykle wystarczający. Jeśli operacja integracyjna trwa zwykle kilka minut, limit kilkunastu minut ma sens, ale nie kilku godzin.
Trzeba też rozdzielić timeout pojedynczej akcji od maksymalnego czasu życia całego flow. Nawet jeśli każda akcja ma własny limit, całość może wisieć długo przez pętle, oczekiwanie na odpowiedź systemu zewnętrznego albo wielokrotne ponowienia. Dlatego sensowne limity ustawia się na trzech poziomach: dla pojedynczych wywołań, dla liczby retry oraz dla liczby elementów przetwarzanych w jednej instancji.
Jeżeli flow przetwarza pliki, szczególnie ważne jest ograniczenie skali jednego uruchomienia. Zamiast pozwalać jednej instancji obsłużyć bardzo dużą paczkę, lepiej przetwarzać mniejsze partie albo jeden plik na jedno uruchomienie. Wtedy nawet jeśli pojedynczy przypadek się zatnie, nie blokuje całej kolejki na wiele godzin. To samo dotyczy pętli: jeśli pętla może przejść przez setki lub tysiące rekordów, powinna mieć jasno określony limit i warunek przerwania.
Retry również muszą być ograniczone. Bez tego krótki timeout akcji nie rozwiązuje problemu, bo flow może po prostu wielokrotnie ponawiać to samo wywołanie. W praktyce lepiej mieć mniej prób, ale szybciej zakończyć nieudane przetwarzanie i oznaczyć element do ponownej obsługi osobno, niż trzymać jedną instancję przez bardzo długi czas. Jeśli system zewnętrzny bywa chwilowo niedostępny, retry mają sens, ale powinny mieć małą, kontrolowaną liczbę podejść i sensowne odstępy.
Dobry punkt odniesienia to pytanie: po jakim czasie brak wyniku oznacza już problem operacyjny, a nie normalne opóźnienie? Właśnie tam powinien kończyć się timeout lub limit prób. Jeśli po 10–15 minutach brak odpowiedzi oznacza, że operator i tak będzie musiał sprawdzić sprawę ręcznie albo uruchomić ponownie zadanie, trzymanie flow przez godzinę zwykle nie daje wartości.
W praktyce sensowne ustawienie oznacza, że flow ma zakończyć się szybko w jednym z dwóch stanów: sukces albo kontrolowana porażka. Lepiej świadomie przerwać przetwarzanie, zapisać status błędu i oddać element do kolejki lub ponownej obróbki, niż utrzymywać uruchomienie bez końca. Dzięki temu nie marnujesz limitów platformy, łatwiej wykrywasz awarie i nie dopuszczasz do sytuacji, w której kilka zablokowanych instancji paraliżuje dalsze przetwarzanie.
Jak zbudować kolejkę zadań w Power Automate bez pisania kodu?
Najprostszy model kolejki w Power Automate bez kodu polega na tym, że zamiast przetwarzać pliki od razu po wykryciu, zapisujesz je najpierw jako rekordy oczekujące w źródle danych, a osobny przepływ pobiera je do realizacji według ustalonej kolejności. Dzięki temu unikasz równoczesnego chaosu, łatwiej kontrolujesz obciążenie i możesz bezpiecznie ponawiać nieudane próby.
W praktyce kolejkę buduje się na liście SharePoint, tabeli Excel, Dataverse albo innym źródle, które pozwala przechowywać status zadania. Każdy rekord powinien zawierać co najmniej: identyfikator pliku lub ścieżkę, status, datę dodania, liczbę prób oraz znacznik czasu blokady lub rozpoczęcia przetwarzania. Typowe statusy to: Nowe, W trakcie, Zakończone, Błąd.
Najbezpieczniejszy układ to dwa przepływy. Pierwszy działa jako producent: po pojawieniu się pliku dodaje rekord do kolejki. Drugi działa jako konsument: cyklicznie pobiera rekordy ze statusem Nowe, wybiera jeden lub małą partię, zmienia status na W trakcie, wykonuje operację na pliku, a potem zapisuje wynik jako Zakończone albo Błąd. Taki podział jest prostszy do utrzymania niż jeden rozbudowany przepływ reagujący bezpośrednio na każde zdarzenie.
- Krok 1: utwórz tabelę lub listę kolejki z polami: ID zadania, identyfikator pliku, status, priorytet lub data dodania, liczba prób, komunikat błędu.
- Krok 2: przepływ wejściowy dopisuje nowe zadania do kolejki zamiast wykonywać całą logikę od razu.
- Krok 3: przepływ harmonogramowany pobiera zadania
Nowe, sortuje je według daty dodania lub priorytetu i oznacza wybrane rekordy jakoW trakcie. - Krok 4: po przetworzeniu aktualizuje status oraz licznik prób, a błędne zadania pozostawia do ponownego uruchomienia albo oznacza jako końcowo nieudane.
Kluczowe jest, aby nie dopuścić do podwójnego pobrania tego samego zadania. W Power Automate osiąga się to najczęściej przez ograniczenie współbieżności przepływu konsumenta do 1 albo przez natychmiastową zmianę statusu rekordu na W trakcie zaraz po jego odczycie. Bez tego dwa uruchomienia mogą równolegle przetwarzać ten sam plik.
Jeżeli kolejka ma działać stabilnie, warto traktować rekord zadania jako jedyne źródło prawdy o stanie pracy. Oznacza to, że każdy etap aktualizuje status w kolejce, a nie opiera się wyłącznie na historii uruchomień przepływu. Dzięki temu łatwo odfiltrować zadania oczekujące, nieudane i zakończone, a także wznowić pracę po błędzie bez ręcznego szukania, co zostało już wykonane.
Bez kodu da się więc zbudować pełnoprawną kolejkę, jeśli rozdzielisz przyjęcie zadania od jego wykonania, zapiszesz stan w trwałym źródle danych i wymusisz kontrolę nad kolejnością oraz współbieżnością przetwarzania.
Jak zapewnić idempotencję, żeby ten sam plik nie był przetwarzany dwa razy?
Idempotencja w tym kontekście oznacza, że wielokrotne uruchomienie procesu dla tego samego pliku daje ten sam efekt biznesowy co jedno uruchomienie: plik zostaje obsłużony raz, a kolejne próby nie tworzą duplikatów danych, wpisów ani operacji. W Power Automate nie osiąga się tego samym triggerem, tylko przez wprowadzenie jednoznacznego klucza pliku i sprawdzanie, czy taki klucz został już wcześniej zarejestrowany jako przetworzony.
Najważniejsze jest dobranie stabilnego identyfikatora. Najbezpieczniej użyć takiej wartości, która nie zmienia się między ponownymi odczytami tego samego obiektu, na przykład identyfikatora pliku z systemu źródłowego. Jeśli proces ma rozróżniać również nowe wersje tego samego pliku, klucz powinien uwzględniać także wersję, znacznik modyfikacji albo skrót zawartości. Sama nazwa pliku zwykle nie wystarcza, bo może się powtarzać albo zmieniać.
Praktyczny wzorzec jest prosty: na początku przepływu zapisujesz klucz pliku w trwałym rejestrze, na przykład w tabeli, liście lub innym magazynie danych, gdzie dla tego klucza istnieje wymuszenie unikalności. Jeśli zapis się powiedzie, dany plik przechodzi do przetwarzania. Jeśli zapis się nie powiedzie, bo taki klucz już istnieje, przepływ powinien zakończyć pracę dla tego elementu bez wykonywania dalszych kroków. Dzięki temu nawet równoległe uruchomienia nie przetworzą tego samego pliku dwa razy, bo tylko jedno z nich „wygra” rejestrację.
Kluczowa zasada brzmi: najpierw rejestracja prawa do przetwarzania, potem właściwe operacje. Jeżeli najpierw zapiszesz dane docelowe, a dopiero później oznaczysz plik jako obsłużony, to przy błędzie lub retrach możesz wytworzyć duplikaty. Rejestr powinien też przechowywać status, na przykład „w trakcie”, „zakończono”, „błąd”, aby odróżnić przypadek już przetworzony od przypadku przerwanego w połowie.
Jeżeli plik może wrócić do kolejki po błędzie, nie usuwaj śladu po pierwszej próbie. Zamiast tego aktualizuj status rekordu i pilnuj, by ponowne uruchomienie dotyczyło tylko pozycji w stanie pozwalającym na wznowienie. To rozdziela dwa różne scenariusze: blokadę duplikatu dla tego samego pliku oraz kontrolowane ponowienie dla tego samego rekordu procesu.
W skrócie, idempotencję zapewnia połączenie trzech elementów: stabilnego klucza identyfikującego plik, trwałego rejestru przetworzeń oraz atomowej zasady „zarejestruj albo odrzuć”. Dopiero taki mechanizm daje pewność, że ten sam plik nie zostanie obsłużony dwa razy, nawet gdy trigger uruchomi się ponownie, przepływ zostanie wznowiony albo wystąpią retry.
Jak obsłużyć „dead-letter” i ręczną reprocess, żeby operacje były kontrolowane?
Dead-letter to kontrolowane miejsce dla elementów, których przepływ nie potrafi poprawnie przetworzyć po wyczerpaniu ustalonych prób. W praktyce nie chodzi o „zgubienie” pliku lub komunikatu, tylko o świadome odseparowanie przypadku błędnego od normalnej kolejki roboczej. Dzięki temu główny proces nie blokuje się na jednym problemie, a operacje dostają jasną listę spraw wymagających decyzji.
Żeby to działało poprawnie w Power Automate, każdy element przekazywany do dead-letter powinien mieć komplet danych operacyjnych: unikalny identyfikator, nazwę lub ścieżkę pliku, czas błędu, kod lub typ błędu, liczbę wykonanych prób, identyfikator uruchomienia flow oraz krótki opis przyczyny. Kluczowe jest też zapisanie statusu końcowego, na przykład DeadLettered, aby ten sam element nie wrócił samoczynnie do zwykłej kolejki i nie był przetwarzany równolegle.
Ręczna reprocess nie powinna polegać na ponownym uruchomieniu całego przepływu „na oko”. Kontrolowany model zakłada osobny mechanizm wznowienia tylko dla elementów oznaczonych jako dead-letter. Operator wybiera konkretny rekord, zmienia jego stan na techniczny, na przykład Requeued albo PendingRetry, a system tworzy nową próbę przetworzenia. Oryginalny wpis błędny powinien pozostać w historii, żeby zachować pełny audyt i móc odtworzyć, co wydarzyło się wcześniej.
Najważniejsze zasady kontroli są proste:
- Jawne statusy — element przechodzi przez stany typu
Queued,Processing,Completed,DeadLettered,Requeued; bez tego trudno odróżnić awarię od elementu nadal obsługiwanego. - Idempotencja — reprocess musi być bezpieczny przy ponownym uruchomieniu, czyli nie może tworzyć duplikatów plików, wpisów ani skutków ubocznych, jeśli ten sam element zostanie wznowiony drugi raz.
- Ograniczone uprawnienia i ślad audytowy — ręczne wznowienie powinno być możliwe tylko dla uprawnionych osób, z zapisem kto, kiedy i dlaczego wznowił przetwarzanie.
- Rozdzielenie błędów trwałych i chwilowych — do dead-letter trafiają przypadki po wyczerpaniu polityki retry albo błędy nienaprawialne; nie należy używać tego mechanizmu jako zamiennika zwykłych ponowień.
W praktyce kontrola operacyjna oznacza też, że reprocess uruchamia się na podstawie decyzji, a nie automatycznie bez końca. Jeśli przyczyna błędu była zewnętrzna i już usunięta, element można ponownie zakolejkować. Jeśli problem wynika z wadliwych danych lub nieobsługiwanego formatu pliku, rekord powinien pozostać w dead-letter do czasu korekty źródła albo zamknięcia incydentu. Tylko wtedy dead-letter jest narzędziem porządkowym, a nie miejscem odkładania nierozwiązanych błędów.
Jak monitorować i alertować awarie, żeby problem nie wyszedł dopiero od użytkowników?
Trzeba monitorować nie tylko sam fakt uruchomienia przepływu, ale cały jego stan operacyjny: czy nowy plik został podjęty do przetworzenia, ile trwa przetwarzanie, ile prób zakończyło się błędem, ile elementów czeka w kolejce i czy któryś z nich nie przekroczył dopuszczalnego czasu oczekiwania. Jeśli kontrolujesz tylko końcowy status pojedynczego uruchomienia, bardzo łatwo przeoczyć sytuację, w której proces formalnie działa, ale realnie stoi, zapętla retry albo narasta backlog.
W praktyce warto rozdzielić monitoring na dwa poziomy. Pierwszy to błędy techniczne, czyli zakończenie runa statusem failed, timeout, błąd konektora, brak odpowiedzi usługi lub przekroczenie limitu. Drugi to sygnały degradacji, czyli przypadki, w których przepływ jeszcze się nie wywrócił, ale zaczyna działać niepoprawnie: rośnie liczba ponowień, wydłuża się czas przetwarzania, kolejka nie maleje albo pojawiają się pliki w stanie pośrednim bez finalizacji. To właśnie drugi poziom najczęściej pozwala zareagować zanim użytkownik zauważy problem.
Alerty powinny być oparte na jasno zdefiniowanych progach, a nie na pojedynczym incydencie bez kontekstu. Jednorazowy błąd po automatycznym retry nie zawsze wymaga eskalacji, ale już kilka błędów w krótkim czasie, zbyt długi brak sukcesów albo element zalegający ponad ustalony limit to sygnał operacyjny. Dobrze działa zasada, że alert uruchamia się wtedy, gdy problem jest albo trwały, albo wpływa na terminowość procesu. Dzięki temu zespół nie tonie w fałszywych powiadomieniach i nie przestaje ich czytać.
Żeby alert miał wartość, musi zawierać dane potrzebne do diagnozy: identyfikator przepływu lub pliku, etap, na którym wystąpił problem, komunikat błędu, liczbę retry, czas rozpoczęcia i wpływ na kolejkę. Powiadomienie w stylu flow failed jest zwykle za mało użyteczne, bo i tak wymaga ręcznego dochodzenia od zera. Celem alertu nie jest tylko poinformowanie, że coś się stało, ale skrócenie czasu od wykrycia do reakcji.
Kluczowe jest też monitorowanie braku zdarzeń, a nie wyłącznie błędów. Jeśli proces powinien przetwarzać pliki regularnie, to brak nowych sukcesów przez określony czas sam w sobie jest anomalią. Taki mechanizm wykrywa awarie ciche: zablokowany trigger, problem z dostępem do źródła, zatrzymanie kolejki albo przypadek, w którym przepływ nie zgłasza błędu, ale przestał wykonywać pracę.
Najbezpieczniejszy model to połączenie rejestru stanu przetwarzanych elementów z osobnym przepływem kontrolnym lub harmonogramem sprawdzającym wskaźniki zdrowia procesu. Taki nadzór nie zależy wyłącznie od pojedynczego runa i pozwala wykryć zarówno twarde awarie, jak i narastające opóźnienia. Jeśli użytkownik ma być ostatnią, a nie pierwszą osobą informującą o problemie, musisz mierzyć: liczbę błędów, czas przetwarzania, wiek najstarszego elementu w kolejce i czas od ostatniego poprawnego zakończenia.
Majczęściej zadawane pytania i odpowiedzi odnośnie Power Automate bez awarii: jak zbudować retry, timeout i kolejkę dla plików
Kolejkę warto zastosować wtedy, gdy pliki pojawiają się nieregularnie, równolegle albo wymagają kontrolowanego ponawiania. Taki model oddziela wykrycie pliku od jego właściwego przetwarzania, dzięki czemu łatwiej ograniczyć współbieżność, zapisać status zadania i uniknąć sytuacji, w której pojedynczy błąd lub opóźnienie blokuje cały proces.
Błąd przejściowy zwykle wynika z chwilowej niedostępności, opóźnienia albo limitu, a trwały z błędnej konfiguracji lub danych. W praktyce przejściowe problemy dotyczą timeoutów, limitów wywołań i krótkich awarii usług, natomiast trwałe obejmują złą ścieżkę, brak uprawnień, usunięty zasób lub nieobsługiwany format. To rozróżnienie decyduje, czy retry ma sens.
Najbardziej przydatne są pola opisujące identyfikację pliku, status i historię prób. Dzięki nim można wznowić pracę bez zgadywania, co wydarzyło się wcześniej. W praktyce warto przechowywać:
- stabilny identyfikator pliku,
- status zadania,
- liczbę prób,
- czas dodania lub blokady,
- komunikat błędu,
- informację o uruchomieniu, które przetwarzało rekord.
Sama nazwa pliku zwykle nie wystarcza do zapewnienia idempotencji. Nazwa może się powtarzać, zmieniać albo nie odróżniać kolejnych wersji tego samego dokumentu. Bezpieczniej oprzeć logikę na stabilnym identyfikatorze źródłowym, a jeśli trzeba rozróżniać wersje, uwzględnić także znacznik modyfikacji, wersję lub inny trwały element stanu.
Najskuteczniej ogranicza to kontrola współbieżności i szybka zmiana statusu zadania na etap przetwarzania. Jeśli rekord kolejki staje się od razu oznaczony jako „W trakcie”, inne uruchomienie nie powinno go już podjąć. Dodatkowo pomaga ograniczenie współbieżności konsumenta, aby uniknąć wyścigów między równoległymi instancjami.
Najlepszym sygnałem degradacji są rosnące opóźnienia i zaległości mimo braku całkowitej awarii. Taki stan widać wcześniej niż błąd końcowy. Typowe objawy to:
- wydłużający się czas przetwarzania,
- coraz więcej retry,
- rosnący backlog w kolejce,
- elementy długo pozostające w stanie pośrednim,
- brak sukcesów przez nietypowo długi czas.
Bezpieczne wznowienie wymaga oparcia się na istniejącym rekordzie procesu, a nie na uruchamianiu wszystkiego od nowa. Najlepiej zmienić status elementu na stan pozwalający na ponowne podjęcie i zachować historię poprzedniej próby. Taki model działa poprawnie tylko wtedy, gdy proces jest idempotentny i rozpoznaje, że chodzi o ten sam plik, a nie nowy przypadek.
Najlepiej zacząć od uproszczenia modelu i jawnego zapisania stanu każdego pliku. W pierwszej kolejności warto rozdzielić wykrycie pliku od przetwarzania, ograniczyć współbieżność, ustawić kontrolowane retry tylko dla błędów przejściowych oraz wprowadzić statusy i rejestr identyfikatorów. Dopiero taki fundament pozwala sensownie diagnozować timeouty, duplikaty i błędy kolejki.