2012-07-12 18 views
8

Tôi đặt khá nhiều thời gian chờ phía máy chủ với setTimeout và setInterval cho mỗi người dùng được kết nối có thể kéo dài 10-30 giây. Nếu cá thể Node.js khởi động lại ở giữa một trong những thời gian chờ này, chúng rõ ràng là tất cả sẽ bị xóa khi khởi động lại, điều này có thể gây ra một số vấn đề cho những người dùng này. Làm thế nào tôi sẽ đi về sự bền bỉ những timeouts, hoặc có bất kỳ mô-đun đã giúp đỡ với điều này?PersTime setTimeout và setInterval trên Node.js khởi động lại

+0

bạn không thể sử dụng nút cron cho điều này? – albertjan

+1

Làm thế nào? Đây không phải là công việc cron tôi đang thiết lập, họ là thời gian chờ 10-30 giây dựa trên tương tác của người dùng với ứng dụng. –

+0

Bạn có thể sử dụng beanstalkd cho điều đó. Nó thậm chí có thể tồn tại. – Alfred

Trả lời

1

Tôi sẽ lưu trữ thời gian bắt đầu và thời lượng trong Redis và khởi động lại bộ tính giờ không đầy đủ khi ứng dụng của bạn tải lại. Một số module Redis:

https://github.com/joyent/node/wiki/modules#wiki-db-nosql-redis

+0

Bạn sẽ xác định ứng dụng đó sẽ gặp sự cố như thế nào? Hoặc bạn sẽ cập nhật start_time/duration trong redis mỗi giây? –

1

setTimeOut mất chậm trễ như tham số, vì vậy khi thiết lập thời gian chờ, chụp 'currentServerTime + delay' nói 'serverTriggerTime' và tồn tại này trong DB. Sau đó, khi khởi động lại máy chủ, hãy tạo cùng một bộ hẹn giờ bằng cách sử dụng serverTriggerTime. Sau đó, delay = serverTriggerTime - currentServerTime, hãy sử dụng độ trễ này để đặt hẹn giờ mới.

Khi cài đặt hẹn giờ

const date = Date.now(); 
const serverTriggerTime = +date + +delay; //time in milliseconds 

Trên máy chủ khởi động lại:

serverTriggerTime = //retrieve from DB. 
newDelay = serverTriggerTime - Date.now(); 

Ngoài ra, thiết lập hẹn giờ mới chỉ nếu newDelay> = 0, có nghĩa là thời gian kích hoạt chưa đạt được và sẽ xảy ra sau thời gian newDelay .