Database 如何在群集环境中管理CFC的状态

Database 如何在群集环境中管理CFC的状态,database,session,coldfusion,session-state,cfml,Database,Session,Coldfusion,Session State,Cfml,我一直在cfml应用程序中使用会话作用域来存储当前登录的用户对象。太棒了 user.isLoggedIn(),user.hasPremiumAccess(),user.hasRole('admin') 在尝试将我的应用程序迁移到集群(云)环境时,我意识到依赖会话范围并不理想,因为运行中的应用程序的每个实例都有自己的服务器内存。我知道我可以使用“粘性会话”,但我宁愿不使用,因为这会限制像Amazon Elastic Beanstalk这样的东西自由旋转应用程序的上下实例(基于负载) 我还知道我可以

我一直在cfml应用程序中使用
会话
作用域来存储当前登录的
用户
对象。太棒了

user.isLoggedIn()
user.hasPremiumAccess()
user.hasRole('admin')

在尝试将我的应用程序迁移到集群(云)环境时,我意识到依赖
会话
范围并不理想,因为运行中的应用程序的每个实例都有自己的服务器内存。我知道我可以使用“粘性会话”,但我宁愿不使用,因为这会限制像Amazon Elastic Beanstalk这样的东西自由旋转应用程序的上下实例(基于负载)

我还知道我可以使用
客户机
范围以集群友好的方式存储简单的值,但是复杂的数据呢,比如我描述的用户对象?您将如何存储用户对象,或者我可以使用什么其他方法

我可以根据需要更改应用程序

**编辑**要清楚,不是我不能使用粘性会话,而是我不想使用粘性会话(或会话复制)。原因是,我可以充分利用不依赖服务器/实例内存来管理会话状态的可扩展性优势。这种方法允许像Elastic Beanstalk这样的服务自由创建和删除应用程序服务器实例,而不会影响用户。使用粘性会话不允许这样做

我考虑过的一些可能的解决方案包括:

  • 序列化/反序列化用户对象用户的“状态”以存储在客户端范围中,并在每次页面加载时“重新初始化”用户
  • 序列化/反序列化要存储在NoSQL db中的用户对象用户的“状态”,并在每次页面加载时“重新初始化”用户
  • 如果您不/不能使用“粘性会话”,那么另一个选项是实施会话复制。这实际上是将存储在内存中的会话复制到集群中的每个节点。是的,这样做是有开销的

    从文档中:

    要为群集中的服务器实例实施会话故障切换,请为每个服务器实例启用会话复制。会话复制在群集中的服务器实例之间实时协调会话信息。启用会话复制允许Tomcat在当前服务器不可用时自动将请求路由到正在运行的服务器

    注意:当群集使用会话复制时,每次修改会话数据时,都会将其复制到群集中的其他服务器。如果在会话范围中存储大量信息,则会降低性能。如果计划在会话范围内存储大量信息,请考虑将此信息存储在保存在数据库中的客户端变量。

    从-

    下一页将进一步提到另一个警告:

    如果您正在使用会话复制,请转到内存变量页面并启用J2EE会话。为群集中的所有服务器实例启用J2EE会话。如果未在ColdFusion Administrator中启用J2EE会话,则会话复制无法正常工作。CFC序列化允许您在群集中使用J2EE会话复制,并可以跨群集中的所有实例访问会话中的CFC数据。会话复制还确保跨集群复制会话作用域变量。但是,会话复制不支持复制会话作用域CFC或变量中的阵列。在会话故障转移的情况下,您还可以保留和访问CFC中的数据。存储在会话作用域内的ColdFusion结构在会话作用域中可用,即使在故障转移之后也是如此。例如,如果要运行多个ColdFusion实例以平衡服务器负载,则可以在会话中存储有用的数据,包括CFC,以便可以跨该会话中提供的所有页面访问数据


    还要检查一下前一段时间对同一问题的回答(注意,ColdFusion 10的早期版本中存在一个不允许会话复制工作的bug)

    感谢您的回答,Miguel!我宁愿让事情变得更简单,而不是更复杂,所以假设我愿意修改我的应用程序,使其成为无状态的。在无状态环境中存储复杂对象的最佳方式是什么?以某种方式序列化和反序列化cfc状态并将其作为json存储在数据库中?在每个请求上“重新填充”该用户?还有别的吗?我通常只在负载平衡的环境中使用粘性会话(以保持简单)。所以我不确定我能对你的问题有多大帮助。但我最初的想法是,如果你的应用程序真的是无状态的,那么为什么你需要在它们之间共享任何东西呢?谢谢Miguel。我可能会使用粘性会话一段时间,但在一天结束时,必须存储的是会话数据,只是为了使应用程序“无状态”,它的存储方式应该不依赖于运行它的服务器实例的服务器内存。这就是我经常使用的客户端范围。。。问题在于,如果没有黑客攻击,客户端无法存储复杂的数据。如果你想在Elastic Beanstalk上使用ColdFusion,那么请阅读这篇bug帖子——以及这里的相关帖子——很有趣。我试图在生产环境中运行docker容器(是的,在Elastic Beanstalk上),因此如果所有承诺都是真的,那么只要docker守护进程在EC2实例上运行(它确实运行),docker容器中的lucee应用程序也应该运行。当然要克服一些障碍,但祈祷好运。Lucee(Railo)没有这个问题,我认为它只与Adobe CF有关。