2013-04-27 25 views
11

Tôi không hiểu.nhiều phương thức cho mỗi nhân viên của sidekiq

Mỗi tài liệu Sidekiq, mỗi công nhân (tên tôi gọi là FeedWorker) chỉ có thể chứa một phương pháp được gọi là thực hiện. Vâng, nếu tôi muốn chạy các phương pháp mulitple thông qua cùng một công nhân thì sao?

Ví dụ, FeedWorker của tôi (bạn đoán nó, nó xử lý một nguồn cấp dữ hoạt động) nên chạy 3 phương pháp sau đây:

announce_foo 
announce_bar 
invite_to_foo 

Tôi không nghĩ rằng đây là một kỳ vọng hợp lý. Tôi chắc rằng những người khác đã xem xét điều này. Tôi không có thiên tài, nhưng tôi biết tôi không phá vỡ nền tảng mới trong kỳ vọng ở đây. Tuy nhiên, nó không rõ ràng làm thế nào người ta sẽ làm điều này.

Ngay bây giờ, có vẻ như tôi phải viết mã theo cách này:

def perform(id, TYPE) 
    if TYPE == BAR 
    Bar.find(id) and_announce_bar 
    else 
    Foo.find(id) and_announce_foo 
    end 
end 

đang Nhàm chán và xấu xí. Phải có tốt hơn ngoài kia. Bất kỳ trợ giúp nào được đánh giá cao!

+0

Bạn có thể liên kết đến trang tài liệu nơi bạn tìm thấy tuyên bố như vậy không? –

Trả lời

5

perform là điểm đầu vào của Công nhân của bạn. Bên trong nó, bạn có thể tạo ra nhiều phương thức ví dụ như bạn muốn, để tổ chức mã của bạn vì nó phù hợp nhất với nhu cầu của bạn. Đó là một thực hành tốt mặc dù để giữ mã công nhân mỏng nhất có thể. Gọi các vật thể khác từ bên trong nó là một cách để đạt được điều đó. Bạn sẽ tìm thấy mã của bạn sẽ dễ dàng hơn để kiểm tra quá.

+0

Hey Fabrizio đó thực sự là những gì tôi đã làm. Và tôi đã nói về số phận của mình. Cảm ơn ít nhất vì đã liên hệ! Hy vọng rằng những người khác có câu hỏi tương tự sẽ được hưởng lợi. – Laurent

2

Tôi có cùng một câu hỏi cho một lúc và bây giờ có một giải pháp khá đơn giản: sử dụng phương pháp mở rộng chậm trên bất kỳ lớp học, như được giải thích trong docs, cho ví dụ:

# Usage: EmailWorker.delay.do_something 

class EmailWorker 
    class << self 
    def send_this(attrs) 
     MyMailer.some_action(attrs).deliver 
    end 

    def send_that(attrs) 
     MyMailer.another_action(attrs).deliver 
    end 
    end 
end 

Bất kỳ lớp có thể bị hoãn lại nên không cần phải bao gồm Sidekiq :: Công nhân nếu bạn không sử dụng phương thức perform_async.

Vấn đề tôi gặp phải với điều này là các tùy chọn cho mỗi người lao động sẽ không được sử dụng trừ khi bạn đi qua phương thức perform_async.

+0

Sử dụng '.delay' bit cho tôi. Tôi đang cố gắng điều chỉnh với 'sidekiq-throttler' và không thể hiểu tại sao nó không được điều chỉnh. Tôi đã có nhiều phương thức trong nhân viên của mình và gọi chúng bằng '.delay'. 'sidekiq-throttler' sử dụng các tùy chọn cho mỗi người lao động đó và giống như bạn đã đề cập, chúng sẽ không hoạt động trừ khi thực hiện các cuộc gọi' perform_async'. Một khi tôi tái cấu trúc mã của mình để có nhiều công nhân cụ thể mà mỗi người có phương thức 'thực hiện', điều chỉnh đã làm việc. – Jack

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