簡體   English   中英

Python + Twisted中的消息隊列代理

[英]Message queue proxy in Python + Twisted

我想實現一個輕量級的Message Queue代理。 它的工作是從Web應用程序(PHP)接收消息,並將它們異步發送到Message Queue服務器。 該代理的原因是MQ並不總是可用,有時會滯后甚至下降,但是我想確保消息已傳遞,並且Web應用程序立即返回。

因此,PHP會將消息發送到在同一主機上運行的MQ代理。 如果發生崩潰,該代理會將消息保存到SQLite進行持久化。 同時,當連接可用時,它將從SQLite批量發送消息到MQ,然后從SQLite刪除消息。

現在,按照我的理解,此服務中包含以下組件:

  1. 消息偵聽器(偵聽來自PHP的消息並將其寫入傳入隊列)
  2. DB刷新程序(由於SQLite單線程性,從傳入隊列中讀取消息並將其保存到數據庫中)
  3. MQ連接處理程序(通過重新連接保持與MQ服務器的連接在線)
  4. 消息發送者(從SQlite db收集消息並將其發送到MQ服務器,然后從db中刪除它們)

我當時在考慮使用Twisted for#1(TCPServer),但是我在將其與不是事件驅動的其他點進行集成時遇到了問題。 直覺告訴我,這些要點中的每一個都應在單獨的線程中運行,因為所有這些點都受IO約束並且彼此獨立,但是我可以輕松地將它們放在單個線程中。 即使這樣,除了Twisted的主循環外,我也找不到任何關於如何實現此工作線程的好例子(對我而言)。

我開始的示例是chatserver.py ,它使用service.Application和internet.TCPServer對象。 如果在創建TCPServer服務之前啟動了自己的線程,它將運行幾次,但是它將停止並且永遠不會再次運行。 我不確定為什么會這樣,但這可能是因為我沒有正確使用Twisted線程。

關於如何實現單獨的工作線程並保持Twisted的任何建議? 您有其他構想嗎?

您基本上是在考慮為郵件服務器編寫一個臨時擴展,它的工作就是提供您所要求的可靠性。

相反,也許您應該在計划運行該新代理的硬件上運行並在其上運行另一個MQ節點。 當其他節點超載或脫機時,新節點應負責持久化和中繼您傳遞給它的消息。

也許在Twisted中使用單獨的線程來繞過阻塞調用並不是您的最佳選擇,但有時最不危險的解決方案是最好的。 這是一個鏈接,向您展示如何將線程集成到Twisted中:

http://twistedmatrix.com/documents/10.1.0/core/howto/threading.html

有時候,容易實現的時間要比數小時/數天的研究快,而事實證明這一切都是徒勞的。

解決此問題的一個好辦法是使用鍵值存儲Redis 它是一個高速持久數據存儲,具有大量客戶端-它具有php和python客戶端(如果您想使用定時/批處理過程來處理消息-它可以節省創建數據庫的時間,還可以處理持久性故事。它在Cywin / Windows + posix環境下運行良好。

PHP Redis客戶端在這里

Python客戶端在這里

兩者都有一個非常干凈和簡單的API。 Redis還提供了一個發布/訂閱機制,如果您需要的話,盡管聽起來如果您發布到不一致的隊列中,它的價值有限。

暫無
暫無

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

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