在负载均衡Plone 3.3.5时是否需要粘性会话?

Mik*_*maa 2 apache load-balancing plone

我们遇到了一个我们怀疑与负载平衡有关的问题.我们在Apache之后拥有4个ZEO前端客户端.有时(从日志中)创建新内容项会记录错误.

2011-04-13T15:39:57 ERROR Zope.SiteErrorLog 1302701997.20.258830910503 https://x/intranet 
/portal_factory/MyType/xxx.2011-04-13.9797548037/xxx_edit
ValueError: Unable to find
Run Code Online (Sandbox Code Playgroud)

我们怀疑发生的是portal_factory存储在ZEO客户端会话存储中临时创建的项目(我们如何确认),并且ZEO客户端之间不共享此存储.当用户点击保存时,会发生验证错误,浏览器将被定向回编辑屏幕.然后,此编辑屏幕视图转到另一个ZEO客户端,该客户端在其会话存储中没有临时"创建项目".

但是,之前我们一直在运行许多负载平衡的Plone站点,之前我们没有关于此问题的报告,因此我怀疑错误原因可能是其他原因,或者此站点上有某个因素触发了该行为.

以下是一些相关信息,遗憾的是,这些信息非常含糊:

http://plone.org/documentation/kb/sticky-sessions-and-mod_proxy_balancer

Han*_*ing 5

在Plone 3中,在对象创建逻辑中仍然存在一些确实使用会话的代码.它支持类似于小部件的界面,其中对象创建分布在多个实际请求中.这个支持和代码在Plone 4中消失了.

Plone 3中的此代码依赖于访问request.SESSION.棘手的是,如果某些其他代码已经创建了代码,则代码仅使用会话.Plone中没有代码(甚至是Plone 3)应该首先创建会话,所以通常它不会在那里并且不会被使用.但是,如果站点中的任何代码确实创建了会话,则对象创建逻辑也将使用它.这可以解释为什么在大多数网站中都没有看到问题.

所有这一切都特别棘手,因为简单地调用request.SESSION将创建一个会话.Products.Archetypes中的content_edit_impl.py脚本使用不同的API来访问会话:

# Avoid implicitly creating a session if one doesn't exists
session = None
sdm = getToolByName(context, 'session_data_manager', None)
if sdm is not None:
    session = sdm.getSessionData(create=0)
Run Code Online (Sandbox Code Playgroud)

创建= 0通知API避免隐含如果不存在尚未创建会话.

您可以尝试查找创建会话的代码,自定义Archetypes中的代码以删除会话部分或将会话存储移动到ZEO并在所有Zope实例中共享它.虽然这不适用于高流量站点,但它应该适用于简单的场景(https://weblion.psu.edu/trac/weblion/wiki/TemporaryStorageInZeo上的一些提示).