gpt4 book ai didi

apache - Plone 3.3.5 负载均衡时是否需要粘性 session ?

转载 作者:行者123 更新时间:2023-12-02 08:54:57 24 4
gpt4 key购买 nike

我们遇到了一个问题,我们怀疑与负载平衡有关。我们在 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 客户端 session 存储中(我们如何确认这一点),并且该存储不在 ZEO 客户端之间共享。当用户点击“保存”时,会发生验证错误,并且浏览器会被引导回编辑屏幕。然后,此编辑屏幕 View 将转到另一个 ZEO 客户端,该客户端在其 session 存储中没有临时“创建中的项目”。

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

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

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

最佳答案

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

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

所有这些都特别棘手,因为只需调用 request.SESSION 就会创建一个 session 。 Products.Archetypes 中的 content_edit_impl.py 脚本使用不同的 API 来访问 session :

# 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 避免在尚不存在 session 的情况下隐式创建 session 。

您可以尝试查找创建 session 的代码,从 Archetypes 自定义代码以删除 session 部分,或者将 session 存储移至 ZEO 中并在所有 Zope 实例之间共享。虽然不建议在高流量网站上这样做,但它对于简单的场景应该可以正常工作(https://weblion.psu.edu/trac/weblion/wiki/TemporaryStorageInZeo 中的一些提示)。

关于apache - Plone 3.3.5 负载均衡时是否需要粘性 session ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5650716/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com