2009-05-10 12 views
7

Cách tốt nhất để duy trì trạng thái khi khởi động lại quy trình bị lỗi là gì?Làm cách nào để khôi phục trạng thái quy trình sau sự cố?

Tôi có một giám sát viên trong một ứng dụng OTP, những gì đồng hồ một số gen_servers "hệ thống con".

Ví dụ: một hệ thống con "thời tiết" tạo trạng thái thời tiết mới sau mỗi 15 phút và xử lý các truy vấn cho trạng thái hiện tại của thời tiết. (Hãy suy nghĩ trò chơi đứng chanh)

Nếu gen_server đó bị lỗi, tôi muốn khởi động lại, nhưng nó phải được khởi động lại với trạng thái thời tiết gần đây nhất, không phải trạng thái bất kỳ được mã hóa cứng trong init(). Nó sẽ không có ý nghĩa cho tình trạng mô phỏng đột nhiên đi từ "cơn bão mưa đá" để "dễ chịu và mát mẻ" chỉ vì vụ tai nạn.

Tôi ngần ngại sử dụng mnesia hoặc ETS để lưu trữ trạng thái sau mỗi lần cập nhật do tính phức tạp thêm vào; Có cách nào dễ hơn không?

Trả lời

4

Miễn là nó chỉ có trong thời gian chạy thì sẽ đề xuất việc sử dụng ETS. Giá trị lớn hơn nhiều so với độ phức tạp. API rất đơn giản và nếu bạn đang làm việc với các bảng có tên, truy cập cũng đơn giản. Bạn chỉ phải tạo bảng trước khi gen_server của bạn được bắt đầu bởi người giám sát.

Hai - phức tạp hơn - lựa chọn:

  • xây dựng một cặp của các quá trình, một cho công việc để làm, một cho việc duy trì trạng thái. Do sự đơn giản của thứ hai, nó sẽ thực sự đáng tin cậy.
  • Một điều ngớ ngẩn thực sự có thể là trao đổi thông số con của người giám sát với trạng thái hiện tại làm đối số mỗi khi tiểu bang thay đổi. (cười) Không, chỉ đùa thôi.
2

có cách nào dễ dàng hơn không?

khi quá trình chết nó sẽ gửi thông điệp tới người giám sát mà chứa nước của quá trình, vì vậy bạn có thể sử dụng giá trị này để lưu trữ trong giám sát (trong mnesia hoặc tiểu bang giám sát) và khi máy chủ của bạn sẽ bắt đầu (trong init) nó phải gửi cuộc gọi đồng bộ đến người giám sát để nhận giá trị Nhà nước. Tôi không có ví dụ thực sự, nhưng tôi hy vọng nó có ý nghĩa.

Dù sao tôi không thực sự thấy vấn đề để lưu trữ Nhà nước trong tình trạng mất trí nhớ.

xin lỗi tiếng Anh của tôi :)

+1

Giám sát viên nên chứa càng ít càng logic càng tốt và chỉ chịu trách nhiệm khởi động lại. Một lỗi duy nhất trong logic đó có thể dẫn đến một toàn bộ cây con bị hỏng. –