2013-07-29 17 views
1

我正試圖設計一個彈性和高度可用的python API後端服務。核心服務旨在持續運行。該服務必須爲每個租戶獨立運行。這是必需的,因爲核心服務是阻塞服務,每個租戶的執行都需要獨立於任何其他租戶的服務。如何在python中設計一個彈性和高度可用的服務?

核心服務將由供應服務啓動。供應商也是一個連續運行的服務,並負責管理房屋的功能,即啓動租戶註冊核心服務,檢查所需的環境和屬性,並停止核心服務等。

當前我正在使用multiprocessing模塊從供應商服務產生核心服務的子實例。爲每個租戶使用一個線程的多線程服務也是一種選擇,但是如果任何線程出現問題,則會出現其他租戶的服務中斷的缺點。理想情況下,我希望所有這些都作爲後臺進程運行。這些問題是

  1. 如果我守護進程置備服務,multiprocessing不會讓這種服務創建子進程。這是寫here

  2. 如果提供者服務死亡,那麼所有的孩子將成爲孤兒。我該如何迴避這種情況。

顯然,我很樂意接受不遵循此multiprocessing使用模式的解決方案。

回答

0

在Debian樣可以用

start-stop-daemon --start --quiet --background --make-pidfile --pidfile $PIDFILE --exec $DAEMON --chuid $USER --chdir $DIR -- \ 
    $DAEMON_ARGS 

孩子換不妖魔化服務proceesing任務後必須死。父進程必須如此虛構,主循環中只有「resieve task - spawn child」。

+0

這不是我想要的。說明明確指出,子女不能退出 – auny

1

我會建議你採取不同的方法。使用發行版中可用的系統工具來管理流程的生命週期,而不是自己產生它們。配置者也會更加簡單,因爲它不需要花費很少的努力來重現操作系統的功能。

在Ubuntu/CentOS 6系統上,您可以使用Upstart,與舊的sysvinit(主動並行化,重新構建,簡單的init配置語法等)相比,它具有許多優點。

還有一種SystemD與設計上的新貴類似,並且在OpenSuse中默認使用。

調配程序然後可以僅用於爲每個服務創建所需的init配置,並使用子進程模塊啓動或停止它們。如果新貴無法重新生成實例併發送警報或嘗試重新啓動服務,則可以監控您的實例。

使用此方法,可以將用戶服務的所有實例相互隔離。如果供應商崩潰,其餘的服務將繼續保持。

例如,假設您的預配置器正在後臺運行。它通過AMQP或其他方式獲取消息來創建用戶併爲該用戶啓動服務。一個可能的流動你們會有:

  1. 創建用戶
  2. 需要做的新用戶的任何引導
  3. 創建/etc/init/[username]_service.conf
  4. 開始[用戶名] _Service

初始化腳本可能類似於:

description "start Service for [username]" 

start on runlevel [2345] 
stop on runlevel [!2345] 

respawn 

# Run before process 
pre-start script 
end script 

exec /bin/su -c "/path/to/your/app" <username> 

這種方式可以將進程管理從供應商卸載到系統新貴守護程序。您只需要以簡單的方式進行作業管理(在創建或刪除用戶時創建/銷燬服務)。

+0

「爲每項服務創建所需的初始配置」。服務名稱會相同,只是實例會有所不同。我將不得不將所有'.conf'文件放到/etc/init??...中,這不是一個好主意..「然後你就可以監視你的實例了。」您是否說我從我的配置服務中運行暴發性作業並檢查其狀態? – auny

+0

另外,如果其中一個用戶服務崩潰,我該如何重新啓動? – auny

+0

好吧,如果你需要爲每個用戶創建一個實例,你可以將它們命名爲 _ 。命名取決於你。但看到每個用戶都有不同的名字,我認爲這是相當安全的命名方案。您不會在您的供應商中運行新興的工作。您的供應商將創建init腳本並使用subprocess.Popen啓動服務(開始_)。您可以通過發佈「狀態service_name」來監控您的應用程序。新貴應該照顧重生,但這項檢查很容易實施並且可能有用。 –

相關問題