2013-02-20 20 views
5

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.

Trả lời

9

Bạn đã nêu ra hai vấn đề: một vấn đề liên quan đến việc bắt đầu thực thi mà không có người quyết định hoạt động nào và người khác liên quan đến diễn viên bị rơi ở giữa nhiệm vụ. Hãy để tôi giải quyết chúng theo thứ tự.

Tôi đã thực hiện thử nghiệm dựa trên các quan sát của bạn và thực sự, khi thực thi quy trình làm việc mới bắt đầu và không có người quyết định bỏ phiếu SWF vẫn nghĩ rằng nhiệm vụ quyết định mới được bắt đầu. Sau đây là nhật ký sự kiện của tôi từ bảng điều khiển AWS. Lưu ý những gì sẽ xảy ra:

Fri Feb 22 22:15:38 GMT+000 2013 1 WorkflowExecutionStarted 
Fri Feb 22 22:15:38 GMT+000 2013 2 DecisionTaskScheduled 
Fri Feb 22 22:15:38 GMT+000 2013 3 DecisionTaskStarted 
Fri Feb 22 22:20:39 GMT+000 2013 4 DecisionTaskTimedOut 
Fri Feb 22 22:20:39 GMT+000 2013 5 DecisionTaskScheduled 
Fri Feb 22 22:22:26 GMT+000 2013 6 DecisionTaskStarted 
Fri Feb 22 22:22:27 GMT+000 2013 7 DecisionTaskCompleted 
Fri Feb 22 22:22:27 GMT+000 2013 8 ActivityTaskScheduled 
Fri Feb 22 22:22:29 GMT+000 2013 9 ActivityTaskStarted 
Fri Feb 22 22:22:30 GMT+000 2013 10 ActivityTaskCompleted 
... 

Nhiệm vụ quyết định đầu tiên đã ngay lập tức lên kế hoạch (dự kiến) và bắt đầu ngay lập tức (ví dụ: bị cáo buộc cử đến một quyết định, mặc dù không có người quyết định đã chạy). Tôi đã bắt đầu một người quyết định trong thời gian chờ đợi, nhưng tiến trình công việc đã không di chuyển cho đến khi hết thời gian của nhiệm vụ quyết định ban đầu, 5 phút sau đó. Tôi không thể nghĩ ra một kịch bản mà đây sẽ là hành vi mong muốn.Hai biện pháp phòng thủ có thể chống lại điều đó: có người quyết định chạy trước khi bắt đầu một thực thi mới hoặc đặt thời gian chờ thấp chấp nhận được trên một nhiệm vụ quyết định (các nhiệm vụ này sẽ ngay lập tức).

Sự cố diễn viên gặp sự cố (người quyết định hoặc người lao động) là vấn đề mà tôi quen thuộc. Một lưu ý ngắn nền đầu tiên:

Cả hai hoạt động và quyết định nhiệm vụ được recored bởi dịch vụ trong 3 giai đoạn:

  • Scheduled = sẵn sàng để được chọn của một diễn viên.
  • Đã bắt đầu = đã được chọn bởi một diễn viên.
  • Hoàn thành/Không thành công hoặc Hết thời gian = tác nhân hoặc đã hoàn thành không thành công hoặc không hoàn thành tác vụ trong thời hạn.

Khi diễn viên nhặt một nhiệm vụ và đâm, người ta rõ ràng là sẽ không báo cáo bất cứ điều gì về dịch vụ (trừ nó có thể phục hồi và vẫn nhớ nhiệm vụ thẻ của nhiệm vụ cử - nhưng hầu hết các diễn viên bị rơi sẽ không được thông minh). Lần sau, một nhiệm vụ quyết định sẽ được lên kế hoạch, sẽ là khi hết thời gian của nhiệm vụ được gửi gần đây, đó là lý do tại sao tất cả các diễn viên dường như bị chặn trong thời gian hết nhiệm vụ. Đây thực sự là hành vi mong muốn: Dịch vụ không thể biết liệu tác vụ có đang được thực hiện hay không miễn là nhân viên vẫn làm việc trong thời hạn của nó. Có một cách đơn giản để giải quyết vấn đề này: phù hợp với các diễn viên của bạn với một khối try-catch và không thực hiện được nhiệm vụ khi xảy ra sự cố bất ngờ. Tôi sẽ không khuyến khích sử dụng các danh sách nhiệm vụ riêng biệt cho mỗi bài kiểm tra tích phân. Thay vào đó, tôi khuyên bạn nên không thực hiện tác vụ trong khối teardown(). SWF cho phép chỉ định một reason vì không thực hiện được nhiệm vụ, đó là một cách để ghi nhật ký lỗi và xem chúng sau này thông qua bảng điều khiển AWS.

+1

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

+0

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

+1

Điều này giúp ích. Cảm ơn – Tzu

Các vấn đề liên quan