簡體   English   中英

許多生產者,使用python / mod_wsgi的單一消費者

[英]Many producer, single consumer with python/mod_wsgi

我有一個由Apache服務的Pylons Web應用程序(mod_wsgi,prefork)。 由於使用Apache,因此有多個單獨的進程同時運行我的應用程序代碼。 我希望應用程序在后台執行一些非關鍵任務,以縮短“實時”響應時間。 因此,我想到了任務隊列,許多Apache進程將任務添加到此隊列中,一個單獨的Python進程一個接一個地處理它們並從隊列中刪除。

最好將隊列保留在磁盤上,這樣不會因斷電,服務器重啟等原因而丟失未排隊的任務。問題是實現這種隊列的合理方法什么

至於我嘗試過的事情:我從簡單的SQLite數據庫和其中的單個表開始存儲隊列項目。 在負載測試中,當並發級別提高時,我開始按預期收到“數據庫鎖定”錯誤。 快速的“骯臟”解決方案是將MySQL替換為SQLite,它可以很好地處理並發問題,但是對於我需要做的簡單事情來說,這似乎有點過頭了。 與隊列相關的數據庫操作也顯示在我的性能分析報告中。

像Apache的ActiveMQ這樣的消息代理是這里的理想解決方案。

管道可能如下:

  • 負責處理HTTP請求的應用程序進程會快速生成答復,並將低優先級的繁重任務發送到AMQ隊列。
  • 訂閱一個或多個其他進程以使用AMQ隊列,並執行這些繁重的任務。

由於ActiveMQ將尚未使用的消息存儲在持久性存儲中,因此開箱即用即可滿足隊列持久性的要求。 此外,它可以很好地擴展,因為您可以自由地在多個不同的計算機上部署多個HTTP應用程序,多個消費者應用程序以及AMQ本身。

我們在使用STOMP作為底層通信協議的Python編寫的項目中使用了類似的內容。

Web服務器(任何Web服務器)是多生產者,單消費者的過程。

一個簡單的解決方案是構建一個wsgirefWerkzeug后端服務器來處理您的后端請求。

由於此“后端”服務器是使用WSGI技術構建的,因此它與前端Web服務器非常非常相似。 除了。 它不會產生HTML響應(JSON通常更簡單)。 除此之外,它非常簡單。

您為此后端設計RESTful事務。 您將所有各種WSGI功能用於URI解析,授權,身份驗證等。通常,您不需要會話管理,因為RESTful服務器通常不提供會話。

如果遇到嚴重的可伸縮性問題,只需將后端服務器包裝在lighttpd或其他Web引擎中即可創建多線程后端。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM