2011-04-13 80 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工具是無狀態的,因此不需要任何會話關聯。

你的錯誤信息也非常模糊,看起來不完整的。您是否檢查過實例日誌以獲取完整的回溯?

相關問題