Tôi vừa mới bắt đầu sử dụng AWS Ruby SDK để quản lý quy trình làm việc đơn giản. Một hành vi mà tôi nhận thấy ngay lập tức là ít nhất một nhân viên có liên quan và một người quyết định có liên quan phải đang chạy trước khi gửi thực thi quy trình làm việc mới.Amazon SWF: ít nhất một nhân viên phải chạy, tại sao?
Nếu tôi gửi một quy trình làm việc mới trước khi bắt đầu công nhân và người quyết định thì nhiệm vụ sẽ không bao giờ được nhận, ngay cả khi tôi vẫn còn trong giới hạn thời gian chờ. Tại sao điều này? Dựa trên mô tả về cách hoạt động của cuộc thăm dò dài HTTP, tôi sẽ mong đợi một trong hai ứng dụng nhận nhiệm vụ có liên quan khi cuộc gọi đến cuộc thăm dò ý kiến () đạt được.
Tôi gặp phải các tình huống bế tắc khác sau khi công việc không thành công (ví dụ: do lỗi của người lao động hoặc người quyết định hoặc do bị chấm dứt). Đôi khi, chạy lại hoặc thậm chí chỉ bắt đầu thực hiện quy trình làm việc hoàn toàn mới sẽ dẫn đến việc thực thi luồng công việc bị khóa. Các nhiệm vụ quyết định ban đầu được hiển thị trong lịch sử thực hiện quy trình làm việc trong bảng điều khiển AWS, nhưng người quyết định không bao giờ nhận được chúng. Phải thừa nhận rằng, tôi đang gặp sự cố khi xác nhận/giảm sự cố này cho một trường hợp kiểm tra, nhưng tôi nghi ngờ nó có liên quan đến vấn đề trên. Điều này xảy ra khoảng 10 đến 20% thời gian; phần còn lại của thời gian, mọi thứ hoạt động.
Một số điều khác cần đề cập: Tôi đang sử dụng một danh sách nhiệm vụ duy nhất cho hai tác vụ hoạt động riêng biệt chạy theo thứ tự. Cả nhân viên và người quyết định đều đang bỏ phiếu cùng một danh sách nhiệm vụ.
Đây là công nhân của tôi:
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
Một người dùng trên các diễn đàn AWS nhận xét:
Tôi nghĩ rằng nguyên nhân là trong SWF không ngay lập tức nhận ra một cuộc thăm dò dài tắt kết nối. Khi bạn giết một nhân viên, kết nối của nó trong một thời gian có thể được coi là mở bởi dịch vụ. Vì vậy, nó vẫn có thể gửi một nhiệm vụ cho nó. Đối với bạn có vẻ như công nhân mới không bao giờ nhận được nó. Cách xác minh nó là kiểm tra lịch sử luồng công việc. Bạn sẽ thấy sự kiện hoạt động bắt đầu sự kiện với trường xác định có chứa máy chủ lưu trữ và pid của người chết. Cuối cùng nhiệm vụ như vậy sẽ hết thời gian và có thể được thử lại bởi người quyết định.
Lưu ý rằng điều kiện như vậy là phổ biến trong các thử nghiệm đơn vị thường xuyên chấm dứt kết nối và không thực sự là vấn đề đối với bất kỳ ứng dụng sản xuất nào. Cách giải quyết chung là sử dụng danh sách nhiệm vụ khác nhau cho mỗi bài kiểm tra đơn vị.
Điều này có vẻ là một lời giải thích khá hợp lý. Tôi sẽ cố gắng xác nhận điều này.
Cảm ơn bạn đã giải thích kỹ lưỡng. Tôi nghĩ rằng tôi đã làm điều gì đó sai trái toàn bộ thời gian, nhưng có vẻ như tất cả mọi thứ là nhiều hơn hoặc ít hơn làm việc như mong đợi. Tôi đã không tự mình viết một bài kiểm tra. – Tom
Niềm vui là của tôi, tôi đã có một vụ nổ làm việc đó và cuối cùng đã học được điều gì đó. – oozie
Điều này giúp ích. Cảm ơn – Tzu