Caching ColdFusion客户端变量间歇性显示过期值

Caching ColdFusion客户端变量间歇性显示过期值,caching,coldfusion,session-state,race-condition,intermittent,Caching,Coldfusion,Session State,Race Condition,Intermittent,我们有一个遗留的ColdFusion应用程序,它使用150个客户端变量来管理会话状态。 客户机变量集中存储在6应用服务器中的SQL Server数据库中 使用循环负载平衡器的群集环境 问题是当代码用新值(旧值)更新客户机变量时 即使CData表中的新值已适当更新,仍在使用和显示。这只会在使用cfset标记对客户机变量进行的平均1000次更新中有1次间歇性地发生 竞争条件和缓存问题是可能的解释。我们“怀疑”6台应用服务器中的一台仍在缓存旧值。Adobe的文档清楚地说明了客户端变量被缓存到内存中,但

我们有一个遗留的ColdFusion应用程序,它使用150个客户端变量来管理会话状态。 客户机变量集中存储在6应用服务器中的SQL Server数据库中 使用循环负载平衡器的群集环境

问题是当代码用新值(旧值)更新客户机变量时 即使CData表中的新值已适当更新,仍在使用和显示。这只会在使用cfset标记对客户机变量进行的平均1000次更新中有1次间歇性地发生

竞争条件和缓存问题是可能的解释。我们“怀疑”6台应用服务器中的一台仍在缓存旧值。Adobe的文档清楚地说明了客户端变量被缓存到内存中,但没有进一步详细说明

1) 是否有人也经历过这个问题并找到了一个好的解决方案


2) 当我们继续使用客户机变量时,转移到粘性会话有什么影响?

我想我首先仔细看看您的数据库提交。在请求的“开始”处检索客户机变量,然后在请求的“结束”处使用任何更改进行更新。考虑在请求结束时发生CF地点的情况。“下一个”请求是否可能在提交更新之前从数据库中提取页面?在具有复制等功能的复杂系统中,这样的情况可能会发生。6个群集web服务器是一个相当大的数字

至于在内存中缓存,CF在内存中缓存客户机变量,如果客户机变量发生了更改(如果发生了更新),则只从存储(数据库)中“读取”。所以你也可以在那里找到一些东西。不过,理论上,缓存在内存中的客户机变量应该与数据存储中的变量相同。因为它存储更改,这些更改也会写入数据存储。这是实时完成的(据我所知),即在请求结束时。对客户端变量的所有更改都会刷新到数据库中。所以从理论上讲,即使使用循环,如果浏览器出现在内存中没有客户端变量的新服务器上,它也会将它们从数据库中取出。这就是为什么我认为DB可能是这里的关键。注意:更新行为可能会根据全局变量是启用还是禁用而改变。查看每台服务器,看看此设置的使用方式是否有任何差异


至于粘性会话:如果您使用的是基于硬件的负载平衡器,请确保并探索它的平衡选项。您想要的是使用粘性会话,让LB在服务器之间分配负载。您希望它足够智能,能够了解实际负载(通常是CPU使用情况),而不仅仅是服务器之间分配的请求总数。祝你好运我喜欢这样的问题:)

非常感谢您的回复

其中一个应用程序服务器可能仍在尝试处理客户端变量的更新,而下一个应用程序服务器已经收到“下一个”请求,然后使用缓存的值而不是更新的值。这表明我们的应用服务器上存在负载问题。150个客户端变量的序列化和反序列化可能是一个因素。但是,正如您所指出的,在某些情况下,当应用程序服务器正常运行时,数据库可能比预期晚提交(或响应慢得多)。客户机变量存储在它自己的数据库中,但与主数据库位于同一数据库服务器上

有趣的是,在请求结束时,所有更改的客户机变量都会“刷新”到数据库中。但要澄清的是,它们是否同时从内存(以及数据库)和所有应用服务器上“刷新”了呢?从而删除其他服务器上任何过时的缓存值,因此需要服务器从数据库检索更新的值。或者,一旦数据库提交,ColdFusion才会更新其余应用程序服务器上的客户机变量,而不管内存中是否已经存在缓存值

出于性能原因,我们所有6(CF9)生产服务器上都禁用了全局变量更新。我们在测试站点上启用了此功能,该站点有3台(CF9)服务器,但间歇性事件仍在发生,甚至以更高的速率发生

另外

CFApplication标记中的setDomainCookies属性为“否”。自从10多年前编写遗留应用程序以来,此设置一直保持不变。但是,Adobe的文档确实表明集群环境需要“是”。我们正在创建一个简单的测试页面,以进一步分析如何在应用服务器之间共享CuGeI.CFID和Cuffi.CFTeNok值以及使用测试页进一步查看缓存问题。