2014-10-02 64 views
1

我正在解決可能的問題體系結構。儘可能少的話,問題是:我需要設計一個系統,允許客戶端使用HTTP/REST進行連接以啓動長時間運行的進程。每個進程將創建到第三方服務器的持久連接,並將接收到的數據寫入隊列。每個進程只有在第三方服務器關閉連接或收到另一個HTTP/REST請求表明應該終止的情況下才會終止。使用REST接口構建多線程應用程序

約束和背景:

  • 客戶端必須能夠使用HTTP/REST連接
  • 系統必須用Python編寫的

我是一個較低的C級的傢伙(有足夠的Python經驗來感受能力),但是試圖將我的頭圍繞可用於使這更容易的Python框架。我的直覺就是跳入雜草,我知道如果我按照自己的想法來實施這項工作,那麼我可能已經用C寫過了。不想那麼做。我想盡可能多地利用Python的框架和庫。性能不是重中之重。

途徑,我認爲:

  • 在做研究,我碰到來扭轉這可能是一個合適的,似乎意義,我(想這是一個守護進程)。我想象最終產品將是一個Twisted應用程序,它公開一個REST接口,爲每個接收到的客戶端請求分派連接到第三方服務的新線程,並管理自己的線程池。我很熟悉線程,儘管他們還沒有在Python中做過任何事情。簡而言之,Twistedlooks very cool,儘管最後,我仍然想知道我是否過於複雜。

  • 第二種方法我認爲是使用芹菜和瓶,只是讓芹菜處理所有的調度,線程管理等我發現這篇文章顯示Celery and Flask很好地玩在一起。這看起來很像一個更簡單的方法。

寫在這之後,我傾向於用芹菜和瓶的第二個選擇,雖然我不知道很多關於芹菜,所以找你可能有任何建議,以及其他可能的體系結構我不考慮。我非常感謝,並提前謝謝你。

+0

要主持人:什麼?雖然我理解基於意見的問題,比如「什麼語言更好,C#或Java?」或者「我應該在哪裏放大括號?」沒有堆棧溢出的地方,我高度和強烈不同意這個問題,這個問題提出了一個有關軟件架構的合理問題,符合基於意見的問題。 – 2014-10-03 14:46:51

回答

0

是的,扭曲是在這裏矯枉過正。

從你所描述的,芹菜和燒瓶的組合就足夠了。它將允許您實現一個REST接口,將您長時間運行的進程作爲Celery任務啓動。您可以輕鬆實現REST方法,通過在任務ID上調用Celery的撤銷方法,客戶端可以停止運行任務。請注意,Celery依賴Message Broker來發送和接收消息(通常使用RabbitMQ),並使用數據後端來存儲結果(通常使用Redis)。

>>> from celery.task.control import revoke 
>>> revoke(task_id, terminate=True) 

http://docs.celeryproject.org/en/latest/userguide/workers.html#revoking-tasks