我们遇到了一个我们怀疑与负载平衡有关的问题。我们在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
答案 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工具是无状态的,因此不需要任何会话关联。
您的错误消息也非常模糊,看起来不完整。您是否检查了实例日志以获取完整的回溯?