Właśnie zacząłem używać pakietu Ruby SDK AWS do zarządzania tak prostym przepływem pracy. Od razu zauważyłem, że przed złożeniem nowego przepływu pracy musi być uruchomiony co najmniej jeden odpowiedni pracownik i jeden odpowiedni decydent.Amazon SWF: co najmniej jeden pracownik musi być uruchomiony, dlaczego?
Jeśli przed uruchomieniem mojego pracownika i decydenta złożę nowe zlecenie, zadania nigdy nie zostaną odebrane, nawet jeśli nadal znajduję się w granicach limitu czasu. Dlaczego to? Opierając się na opisie działania długich sondowań HTTP, oczekiwałbym, że każda aplikacja otrzyma odpowiednie zadania po osiągnięciu połączenia z odpytaniem().
Występują inne sytuacje zakleszczenia po niepowodzeniu zadania (np. Z powodu błędu pracownika lub sprawcy lub z powodu rozwiązania). Czasami ponowne uruchomienie lub nawet rozpoczęcie całkowicie nowego przepływu pracy spowoduje zablokowanie przepływu pracy. Początkowe zadania decyzyjne są wyświetlane w historii wykonania przepływu pracy w konsoli AWS, ale decydent nigdy ich nie otrzymuje. Wprawdzie mam problem z potwierdzeniem/zredukowaniem tego problemu do przypadku testowego, ale podejrzewam, że jest on związany z powyższym problemem. Dzieje się to w przybliżeniu od 10 do 20% czasu; przez resztę czasu wszystko działa.
Kilka innych rzeczy, o których warto wspomnieć: Używam pojedynczej listy zadań dla dwóch osobnych zadań, które są uruchamiane kolejno. Zarówno pracownik, jak i decydent odpytują tę samą listę zadań.
Oto mój pracownik:
require 'yaml'
require 'aws'
config_file_path = File.join(File.dirname(File.expand_path(__FILE__)), 'config.yaml')
config = YAML::load_file(config_file_path)
swf = AWS::SimpleWorkflow.new(config)
domain = swf.domains['test-domain']
puts("waiting for an activity")
domain.activity_tasks.poll('hello-tasklist') do |activity_task|
puts activity_task.activity_type.name
activity_task.complete! :result => name
puts("waiting for an activity")
end
EDIT
Inny użytkownik na forum AWS komentuje:
Myślę, że przyczyna jest w SWF nie od razu rozpoznając długą ankietę zamknięcie połączenia. Po zabiciu pracownika jego połączenie może zostać uznane za otwarte przez serwis. Więc nadal może wysłać zadanie do niego. Dla ciebie wygląda na to, że nowy pracownik nigdy tego nie dostanie. Aby to sprawdzić, sprawdź historię przepływu pracy. Zobaczysz zdarzenie uruchamiania zadania z polem identyfikacyjnym zawierającym host i pid zwłok pracownika. W końcu takie zadanie zostanie przerwane i może zostać ponownie sprawdzone przez decydenta.
Należy zauważyć, że taki stan występuje często podczas testów jednostkowych, które często kończą połączenia i tak naprawdę nie stanowią problemu dla jakichkolwiek aplikacji produkcyjnych. Typowym rozwiązaniem jest użycie innej listy zadań dla każdego testu jednostkowego.
To wydaje się być całkiem rozsądnym wyjaśnieniem. Spróbuję to potwierdzić.
Dzięki za dokładne wyjaśnienie. Pomyślałem, że przez cały czas robiłem coś nie tak, ale wygląda na to, że wszystko działa mniej więcej tak, jak powinno. Sam nie napisałem testu. – Tom
Przyjemność jest moja, robiłam to świetnie i skończyłam, ucząc się czegoś. – oozie
To pomaga. Dzięki – Tzu