我正在開發一個Yesod應用程序,其中許多應用程序請求將導致從第三方API獲取數據。獲取的數據只會在後續請求中使用 - 也就是說,觸發API標註的請求可以在不等待標註完成的情況下完成。單獨的'App'和'BackgroundJobs'包的佈局
重要的是,某個數據段xyz
不會被提取和存儲兩次,但應用程序的性質是,多個客戶端通常會在同一時刻對xyz
產生興趣。如果我有每個應用程序線程查詢數據庫以查看xyz
是否已被提取,那麼即使規模不大,我也會開始查看併發相關問題。即使我要編寫一堆代碼來處理併發相關的完整性問題 - 並不好玩,並且很難確定我是否覆蓋了所有情況 - 這樣濫用昂貴的數據庫查詢是不好的做法。
在我看來,一個好的選擇是讓所有的App線程將請求發送到一個AMQP隊列(「確保xyz數據已被提取」),一個或多個「後臺工作者」 。
在this thread格雷格韋伯建議雙包裝佈局,其中兩個包都有'我的持久層'作爲依賴。他提到我可以使用符號鏈接或hs-source-dir
來避免維護'持久層'代碼的兩個副本。
格雷格描述的高水平對我來說很合理,但我對哈斯克爾來說比較新,我擔心這需要我花些時間才能弄清楚細節。有人可以爲我更詳細地介紹它嗎?
- 包目錄應該如何佈置? (哪些文件正好構成了我的持久層?)
- .cabal文件應該是什麼樣子?
- 一旦他們這樣佈局,我是否需要改變我的(腳手架網站)源文件導入我的持久模型的方式?
另一部分是:你會如何推薦編寫BackgroundJobs過程?除了Yesod的腳手架之外,我從未寫過生產Haskell代碼。我在大致的概述中得到它 - 我只寫一個main
,我將在其中訂閱消息隊列,並在每條消息上執行我的調出/處理/存儲 - 但是我是否需要擔心手動分叉以確保在等待標註結束時該過程不會阻止?
非常感謝。
順便說一下,這是使用Yesod 1.19。我已經更新到1.2,並且需要對這些代碼進行一些微調 - 所有這些都很簡單/明顯。 –