如何在环形应用程序中维护不同用户会话的状态

时间:2012-09-13 10:11:13

标签: clojure ring

我需要在不同的浏览器/用户会话中维护服务器上的全局状态。

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

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

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

1 个答案:

答案 0 :(得分:9)

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

如果不是那么容易,只需在你喜欢的任何命名空间中声明一个atom或ref,它将在所有会话中共享,例如:

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

这是有效的,因为只要应用程序服务器一直运行,Clojure环境就会持续存在,并且任何将来的请求都将能够观察/修改全局状态。

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