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

时间:2011-04-13 14:16:18

标签: 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

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

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

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

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

2 个答案:

答案 0 :(得分: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)

create = 0 告诉API避免在没有会话的情况下隐式创建会话。

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

答案 1 :(得分:1)

您的诊断不正确; portal_factory工具是无状态的,因此不需要任何会话关联。

您的错误消息也非常模糊,看起来不完整。您是否检查了实例日志以获取完整的回溯?