我正在玩弄仙丹和鳳凰,並試圖實現提醒功能,即待辦事項與未來的日期時間,這應該提醒你在該日期時間。仙丹鳳凰提醒功能
我心目中以下天真的解決方案:
1)使用簡單的一對一策略,併爲每個提示創建一個進程,它將使用超時和完成後死亡
2)彙總所有提醒在單個進程中,將提醒存儲在狀態中,每隔幾秒檢查一次日期時間,並在提醒後移除。
可能有人詳細說明每個解決方案,並且可以給出更合理的一個,由於
我正在玩弄仙丹和鳳凰,並試圖實現提醒功能,即待辦事項與未來的日期時間,這應該提醒你在該日期時間。仙丹鳳凰提醒功能
我心目中以下天真的解決方案:
1)使用簡單的一對一策略,併爲每個提示創建一個進程,它將使用超時和完成後死亡
2)彙總所有提醒在單個進程中,將提醒存儲在狀態中,每隔幾秒檢查一次日期時間,並在提醒後移除。
可能有人詳細說明每個解決方案,並且可以給出更合理的一個,由於
我建議考慮規模。 假設你有一個處理X提醒一個服務器:
在我們有X的過程,每一個都有自己的計時器的第一個解決方案,當計時器結束時它會發送消息和死亡。
在第二個解決方案,我們將有一個過程,大概會找到所有相關提醒和處理它們相應
多大X?
如果x的數量是千,而提醒是短暫的,那麼也許我會說第一個解決方案更好,因爲你有更好的容錯設計,因爲'提醒'被進程分開,但如果x很多那麼它可能不能很好地擴展,你會有很多每個都有一個定時器的進程,這並不是真的推薦。
我想補充一點,如果你有很長時間的提醒,比如說一個提醒一年後,你需要讓一個進程運行一年,直到它過期,這實際上並沒有擴展。
當您處理大量提醒時,第二種解決方案可以更好地擴展爲。 你可能會有一個計時器,可能每秒運行,它會聚合相關的提醒,應該在當時大概運行並處理它們,長時間運行的提醒將不再是問題。
我相信第一個選擇是好得多,爲簡單起見,並且尤其是的可擴展性。 Erlang被設計用來處理大量以有效方式併發運行的輕量級進程。進程也可以分佈在集羣中的許多機器上,所以你可以基本上擴展到無限大。
由於目標非常簡單並且性能影響很小,所以啓動一個只需調用send_after/3
的新進程即可,因爲目標非常簡單,並且如果出現問題並且該進程死亡,則只會丟失一個提醒。所有其他人都是孤立的,仍然會開火。
通過所有的提醒存儲在一個單一的過程中,你把自己放在一個非常不舒服的位置有以下幾個原因:
x
秒遍歷整個列表將是一項昂貴的操作; send_after/3
擁有更高效的調度/調度機制,並且它的構建正確性更低,工作更少,複雜性更低;在大多數編程語言中,併發性是非常難以安全的方式進行的,所以人們避免它像鼠疫一樣。在Elixir和Erlang中,情況恰恰相反 - 你想盡可能多地使用它,並且通過這樣做你會看到明顯的收益。分而治之!