2012-09-13 42 views
5

我需要通过不同的浏览器/用户会话维护服务器上的全局状态。如何维护环形应用程序中不同用户会话的状态

这里我的假设是所有的原子等创建时请求进来是特定于该请求。一旦返回响应,所有状态都被销毁并释放内存。如果我错了,请纠正我。

通过使用会话中间件,跨特定会话请求的状态可以保存在内存中。

但是,如何维护跨多个用户会话和请求的状态。如果可能的话,我想避免使用memcached/redis等进行外部存储。是否有可能在内存中实现它?

回答

8

你的意思是你想要在所有会话中共享的全局状态吗?

如果这样比,很容易,只需要声明任何你喜欢的命名空间中的原子或引用,它会在所有会话共享,如:

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

这工作,因为Clojure的环境依然存在,只要随着应用程序服务器继续运行,以后的任何请求都将能够观察/修改全局状态。

说了这么多 - 值得记住的是,全球状态往往是一种设计气味。你应该考虑你是否真的需要这个,或者你应该考虑一些其他的选择(例如将共享状态推送到数据库中)。

+0

感谢您的快速响应。 @mikera反过来也有其他任何类型的状态仍然局限于请求?我指的是限于java中的用户请求的servlet级别状态。 – murtaza52

+1

由于您几乎从不需要它,因此没有可变状态仅限于环中的请求。传递/处理修改后的请求映射的环中间件是请求特定状态的常用方法。 –

相关问题