2015-04-29 14 views
5

Tôi có một số công nhân đang được chạy bằng Sidekiq và được lên lịch sử dụng Sidetiq. Tôi đang tìm lời khuyên về cách tốt nhất để chờ đợi cho tất cả các công nhân hoàn thành trước khi thực hiện một cuộc gọi lại, tương tự như chức năng xếp hàng của Sidekiq-Pro. Bất kỳ lời khuyên về các tùy chọn có thể sẽ được đánh giá rất nhiều!Làm thế nào để chờ cho nhân viên Sidekiq song song hoàn thành trước khi gọi một phương pháp khác?

+0

Thật không may là cách tốt nhất mà tôi đã tìm thấy là " biết "có bao nhiêu công việc trong một đợt, và sau đó giữ một đếm khi họ hoàn thành (hoặc lỗi). – vereecjw

+0

Có một lý do tôi tính tiền cho tính năng đó: nó cực kỳ hữu ích và đồng thời vô cùng khó khăn để xây dựng. Tôi cho rằng bạn không có ngân sách? –

+0

Đó là một bước mà tôi nghĩ cuối cùng chúng tôi sẽ hướng tới, nhưng cho đến khi quy trình ETL của chúng tôi được xác định rõ hơn và chúng tôi đang đọc nhiều nguồn dữ liệu hơn/sử dụng nhiều công nhân hơn, không cần 100% ở giai đoạn này. Nó chắc chắn là một cái gì đó trên radar của chúng tôi, nhưng tại thời điểm này, tôi chỉ tìm kiếm một giải pháp tạm thời. – AvocadoRivalry

Trả lời

2

Đối với trường hợp sử dụng đơn giản, bạn có thể thăm dò ý kiến ​​stats để nhận số lượng công việc đang chờ xử lý cho mỗi hàng đợi.

Vì vậy, nếu bạn biết rằng tất cả công việc của bạn đi đến một hàng đợi cụ thể và không có công việc nào khác trong hàng đợi đó từ nơi khác, điều này là đủ. Đối với trường hợp sử dụng cao cấp hơn/phức tạp, bạn có thể tham khảo các API source

Một giải pháp đơn giản là sử dụng một Redis dựa truy cập (kể từ khi bạn đang sử dụng Redis) và atomically decrement nó từ từng công việc, và publish một sự kiện một lần đếm đạt zero .

0

Bạn có thể viết một phương pháp:

def wait_for_sidekiq 
    sleep(1) until Sidekiq::Workers.new.size == 0 && Sidekiq::Queue.new.size == 0 
end 

Tôi cũng xin đề nghị bạn nên chắc chắn rằng các công việc đã xếp hàng ở nơi đầu tiên:

def wait_for_queuing 
    sleep(1) until Sidekiq::Queue.new.size > 0 || Sidekiq::Workers.new.size > 0 
end 

này là cần thiết, bởi vì đôi khi là người đầu tiên phương pháp có thể được thực hiện một vài miliseconds trước khi xếp hàng các công việc, để nó sẽ không chờ đợi ở tất cả.

0

Sidekiq-batch gem này Bạn sẽ thấy, tôi đã thử nó và nó hoạt động giống như hàng loạt Pro của Sidekiq, và nó miễn phí

Hy vọng điều này có thể giúp

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