2012-04-28 17 views
10

Một cách hay để có một diễn viên thử lại một lần nữa về thất bại, nhưng với khoảng thời gian gia tăng giữa các lần thử lại là gì? Giả sử tôi muốn diễn viên thử lại sau 15 giây, sau đó là 30 giây, sau đó cứ mỗi phút trong một số lần giới hạn.Akka: Làm thế nào để lên kế hoạch thử lại về sự thất bại với khoảng thời gian trễ tăng lên?

Dưới đây là những gì tôi đã đưa ra:

  • phương pháp của diễn viên đó thực hiện các công việc thực tế có một tùy chọn RetryInfo tham số đó, nếu có, chứa số của retry chúng tôi đang có trong
  • trên thất bại, nam diễn viên này sẽ gửi cho bản thân một mới ScheduleRetryMessage với retryCount + 1, sau đó ném một RuntimeException
  • diễn viên khác giám sát việc diễn viên người lao động, sử dụng new OneForOneStrategy(-1, Duration.Inf() trở Resume làm Chỉ thị của nó. Các diễn viên không có nhà nước, vì vậy Resume nên OK
  • trên nhận được ScheduleRetryMessage, nam diễn viên này sẽ
    • nếu retryCount < MAX_RETRIES: sử dụng lên lịch Akka để tự động gửi một RetryMessage sau độ trễ mong muốn
    • khác: cuối cùng bỏ cuộc, gửi một thông điệp tới diễn viên khác để báo cáo

lỗi đây có phải là một giải pháp tốt hoặc là có một cách tiếp cận tốt hơn?

Trả lời

8

Bạn có thể có người giám sát bắt đầu diễn viên công nhân. Mẹo từ tài liệu là khai báo một bộ định tuyến có kích thước một cho nhân viên. Người giám sát sẽ theo dõi số lần thử lại, sau đó lên lịch gửi tin nhắn cho nhân viên khi thích hợp.

Mặc dù bạn sẽ tạo một lớp diễn viên khác, điều này có vẻ sạch hơn với tôi vì bạn sẽ giữ chức năng giám sát của nhân viên. Lý tưởng nhất là bạn có thể biến người giám sát này thành n công nhân, nhưng tôi nghĩ bạn sẽ phải sử dụng Giám sát vòng đời để có được Thất bại từ một diễn viên trẻ. Trong trường hợp đó, bạn chỉ có thể giữ một bản đồ [ActorRef, Int] để theo dõi số lần thử lại cho tất cả các công nhân được giám sát. Chính sách giám sát sẽ Tiếp tục, nhưng nếu bạn đã đạt đến số lần thử lại tối đa, bạn có thể gửi PoisonPill tới ActorRef vi phạm.

+0

Ý tưởng thú vị, tôi sẽ thử điều đó. Cảm ơn! –

7

Trong những trường hợp như vậy, tôi sử dụng giám sát chuẩn. Một diễn viên phụ huynh/giám sát xác định các lần thử lại trong một cửa sổ thời gian. Con công nhân thử lại đơn giản là sắp xếp lại thông điệp gây ra lỗi với sự chậm trễ trong preRestart().

Nếu trẻ thử lại khá phức tạp, bạn có thể cân nhắc kết nối một diễn viên trung gian. Diễn viên đó chỉ đơn giản là leo thang giám sát. Bật preRestart tác nhân trung gian lên lịch một thông báo khởi động lại (bị trì hoãn). Khi tác nhân trung gian được giữ nguyên trạng thái của nó, nó có thể đơn giản khởi động lại diễn viên công nhân (với sự chậm trễ).

Như bạn có thể thấy phần trì hoãn có thể ở chế độ preRestart hoặc khi bắt đầu công nhân.