服務器A有一個將n個數據庫表作爲平面文件導出的過程。 服務器B包含一個將平面文件加載到DW設備數據庫的實用程序。使用排隊或REST Web服務協調分佈式Python進程
進程在服務器A上運行,該服務器導出並壓縮大約50-75個表。每次導出表格和生成文件時,都會生成.flag文件。
服務器B有一個bash進程,它會重複檢查服務器A生成的每個.flag文件。它通過連接到A並檢查文件的存在來執行此操作。如果標誌文件存在,則服務器B將從服務器A scp文件解壓縮並將其加載到分析數據庫中。如果該文件尚不存在,它將睡眠n秒鐘,然後重試。對於服務器B期望在服務器A上找到的每個表/文件重複該過程。該過程連續執行,一次處理單個文件。
此外:服務器A上運行的進程無法將文件「推送」到服務器B.由於文件大小和地理位置的關係,服務器A無法將平面文件加載到DW設備中。
我覺得這個過程很繁瑣,所以恰巧要重寫/修改。我正在提出一個基於消息傳遞的解決方案。我最初以爲這將是RabbitMQ的一個很好的候選人(或類似),其中
服務器A會寫一個文件,壓縮它,然後產生一個消息隊列。
服務器B將訂閱隊列並處理消息正文中指定的文件。
我覺得,一個基於消息的方法將不僅節省了時間,因爲這將消除每個表的檢查等待的重複週期,也允許我們並行運行的過程(因爲沒有依賴關係)。
我向我的團隊展示了一個使用RabbitMQ的概念驗證,他們都接受使用消息。他們中的一些人很快確定了我們將從基於消息的處理中受益的其他機會。我們將從實施消息傳遞中受益的一個領域是實時填充我們的DW維度,而不是通過批量填充。
然後,我想到基於MQ的解決方案可能會因爲低容量(50-75個任務)而過度使用。考慮到我們的操作團隊必須安裝RabbitMQ(及其依賴項,包括Erlang),這可能是過度的,它會引發新的管理難題。
然後我意識到這可以通過基於REST的解決方案變得更簡單。服務器A可以生成一個文件,然後對服務器B上的簡單(web.py)Web服務進行HTTP調用。服務器B然後可以根據所調用的URL啓動傳輸和加載過程。考慮到傳輸,解壓縮和加載每個文件所需的時間,我可能會使用Python的多處理來創建一個加載每個文件的子進程。
我在考慮基於REST的解決方案,因爲它更簡單。在我看來,使用MQ將更適合更高容量的任務,但我們只是在談論(現在)的50-75個操作,可能會有更多的任務。
鑑於我的要求和數量,基於REST的解決方案是一個很好的解決方案嗎?是否有其他框架或OSS產品已經這樣做?我期望添加消息而不會造成其他管理和開發難題。
更新謝謝大家 - 我已經支持這個項目的Zookeeper! –