2015-09-14 59 views
0

在包含許多.js文件的節點項目中,假設我有一個管理昂貴狀態的文件:它提供了一個json blob,它定期從Web以短時間間隔提取。它的數據被緩存,並且在內部被請求的時間遠遠超過其更新間隔。節點 - 在應用程序中正確引用有狀態文件

let provider = require('./config-provider.js'); 
let config = provider.get(); // returns locally cached JSON blob 

假設上述代碼存在於我的應用程序中的10個不同文件中。這將創建此更新程序的10個不同實例,所有這些都會使昂貴的Web呼叫更新配置。

我想通過我的應用程序引用此配置提供程序的單個實例。但是,這似乎打破了Node應用程序的模塊化設計。

我總是可以使用全局對象,但這顯然是皺眉。

另一種解決方案是在我的應用程序中創建一個複雜的parent/child引用網絡。這似乎也很麻煩。

是否有一些建議的最佳做法是在整個Node應用程序跨度上引用單個有狀態模塊?

回答

1

在這種情況下,您應該使用如here所述的「單例」模式。我還發現this代碼示例很有用。請注意,有些開發人員對NodeJS中的單例表示不滿,如討論here

無論如何,這種模式是有道理的,你的情況,像你說的:

我想在我的應用程序

其他重要考慮因素引用此配置提供的單一實例

除了編碼之外,當您將應用程序部署到生產環境時,您必須考慮是否也希望複製單個實例。例如,如果您部署3個Node JS實例,您是否還希望單個實例處理所有JSON Blob?或者它可以複製3次嗎?

後來我有一個調度模塊部署了5個節點JS實例。很明顯,我不能讓調度器5次觸發同一個工作,所以它有自己的獨立實例,調度模塊本身是一個單例。我提出這個問題是因爲s​​ingleton對象和Node JS可以多次部署的方式有明顯區別。

我希望這會有所幫助。

+1

謝謝!是的 - 它看起來像「單身」是最好的選擇。這只是不幸的,因爲它看起來並不像某個人不喜歡的單一模式。 – dthree

+0

在伸縮點上,這不是一個問題 - 我在Node中構建一個大型的CLI應用程序,所以它只是將用戶實例化一次。我不認爲這是大型Web項目的問題,因爲狀態通常是單獨存儲的,比如使用'redis'。在這種情況下,在Node應用程序中沒有保持狀態的動機。但是,我不會要求外部數據存儲,但對於CLI應用程序! – dthree

+0

根據你的說法,這是有道理的。值得一提的是,單身人士最適合大多數只讀數據。如果多個異步進程開始多次寫入同一對象,則保持一致的狀態成爲一個考慮因素。不過,這似乎不是你的情況的問題。祝你好運! – arnold