Heroku建议更换会话粘性?

时间:2013-12-22 11:47:16

标签: session heroku

我们有一个遗留的java webapp,我们想迁移到Heroku。它使用会话粘性,不幸的是在Heroku上禁用了forbiddn - 所以我们想知道Heroku推荐的替代品是什么?

我们知道如果服务器崩溃,它会丢失存储在其会话中的数据。但是我们的会话只保留非关键数据...大多数情况下,ShoppingCart适用于未登录的用户(登录可能会推迟到付款阶段)。粘性很好,除了罕见的崩溃事件 - 我们可以忍受这种情况。

在Heroku上,我们需要另一种解决方案,到目前为止我的所有想法 - 似乎有点丑陋......

(1)我考虑过会话复制,但这对性能有害,特别是对于大量的dynos

(2)我考虑将ShoppingCart存储在外部数据存储(例如数据库)中。但我怎么知道哪个购物车属于哪个用户?召回用户未登录,因此我无法通过用户名找到购物车。我将不得不分配一些临时名称,它实际上会模仿会话行为:将其作为cookie发送到浏览器(这样它将识别来自同一客户端的进一步请求),记得在一些空闲时间之后清理它。

我觉得我错过了Heroku的设计意图,因为我的代码变得越来越丑陋而不是更干净......请问有更好的解决方案吗? 谢谢

1 个答案:

答案 0 :(得分:0)

您需要使用--session-store的{​​{1}}功能。见https://github.com/jsimone/webapp-runner#store-your-sessions-in-memcache。您可以通过几个Heroku附加组件将memcached实例附加到您的应用程序。 Redis也被支持作为会话商店。

如果您正在使用.war部署并且没有Procfile,Heroku仍会使用webapp-runner,并允许您通过webapp-runner设置会话存储。请参阅https://devcenter.heroku.com/articles/war-deployment#advanced-options

您将无法执行“传统”复制,因为1)应用程序运行的位置是动态且不可预测的; 2)dynos将无法侦听HTTP端口以外的任何内容。

希望有所帮助。