2012-09-13 28 views
5

Tôi có nhu cầu duy trì trạng thái toàn cầu trên máy chủ trên các phiên trình duyệt/người dùng khác nhau.Cách duy trì trạng thái trên các phiên người dùng khác nhau trong ứng dụng vòng

Giả định của tôi ở đây là tất cả các nguyên tử, vv được tạo khi yêu cầu đến cụ thể theo yêu cầu đó. Một khi đáp ứng được trả về, tất cả trạng thái đó bị hủy và bộ nhớ được giải phóng. Hãy sửa tôi nếu tôi sai.

Trạng thái trên các yêu cầu cho một phiên cụ thể có thể được duy trì trong bộ nhớ bằng cách sử dụng phần mềm trung gian phiên.

Tuy nhiên, làm cách nào để duy trì trạng thái trên nhiều phiên và yêu cầu của người dùng. Nếu có thể tôi muốn tránh việc sử dụng memcached/redis vv để lưu trữ nó bên ngoài. Liệu có thể đạt được nó trong chính bộ nhớ?

Trả lời

8

Bạn có nghĩa là bạn muốn trạng thái toàn cầu được chia sẻ trên tất cả các phiên không?

Nếu vậy hơn thế rất dễ dàng, chỉ cần khai báo một nguyên tử hay ref trong bất kỳ không gian tên bạn thích và nó sẽ được chia sẻ giữa tất cả các phiên, ví dụ:

(def my-state (atom {:foo 1 :bar 2})) 

này hoạt động vì môi trường Clojure vẫn tồn tại càng lâu khi máy chủ ứng dụng tiếp tục chạy và mọi yêu cầu trong tương lai sẽ có thể quan sát/sửa đổi trạng thái toàn cục.

Đã nói tất cả điều đó - đáng nhớ rằng trạng thái toàn cầu thường là mùi thiết kế. Bạn nên suy nghĩ về việc liệu bạn có thực sự cần điều này hay không, hoặc nếu bạn nên cân nhắc một số giải pháp thay thế khác (ví dụ: đẩy trạng thái được chia sẻ vào cơ sở dữ liệu).

+0

Cảm ơn bạn đã phản hồi nhanh. @mikera ngược lại cũng có bất kỳ loại trạng thái nào khác vẫn còn giới hạn trong yêu cầu không? Tôi đang đề cập đến trạng thái cấp servelet được giới hạn trong các yêu cầu của người dùng trong java. – murtaza52

+1

Không có trạng thái có thể thay đổi được giới hạn trong yêu cầu trong vòng vì bạn hầu như không bao giờ cần đến nó. Ring middleware truyền/xử lý các bản đồ yêu cầu sửa đổi là cách tiếp cận thông thường đối với trạng thái yêu cầu cụ thể. –

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