【问题标题】:Are sticky sessions needed when load-balancing Plone 3.3.5?负载平衡 Plone 3.3.5 时是否需要粘性会话?
【发布时间】:2011-04-13 14:16:17
【问题描述】:

我们遇到了一个我们怀疑与负载平衡有关的问题。我们在 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

【问题讨论】:

    标签: apache load-balancing plone


    【解决方案1】:

    在 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 的一些提示)。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2013-01-01
        • 2011-09-23
        • 2019-01-21
        • 2017-10-22
        • 2012-03-12
        • 2018-04-05
        • 2021-09-06
        • 2017-04-28
        • 2016-02-17
        相关资源
        最近更新 更多