2011-04-13 90 views
2

我们遇到了一个我们怀疑与负载平衡有关的问题。我们在Apache后面有4个ZEO前端客户端。有时(从日志中)创建新内容项目会记录错误。负载均衡Plone 3.3.5时需要粘性会话吗?

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

回答

5

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

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

所有这一切都特别棘手,因为只是调用的request.session将创建一个会话。在Products.Archetypes为此使用了不同的API的脚本content_edit_impl.py才能到会话:

# 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) 

创建= 0告诉API,以避免暗示如果不存在尚未创建会话。

你可以试着找到创建会话的代码,从原型定制代码删除会话部分或移动会话存储到ZEO并在所有的Zope实例分享。虽然这不建议在高流量的网站上使用,但它对于简单的场景应该可以正常工作(https://weblion.psu.edu/trac/weblion/wiki/TemporaryStorageInZeo的一些提示)。

1

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

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