2017-06-20 151 views
0

我有一個web應用程序,併爲每個用戶(假設我將有大約5千用戶)我需要在一小時後提出通知(他是一個簡化的說明)。通知隊列的實現

我有主意下面這個方案:

  1. <userId, Timer>有無詞典(我想Threading.Timer,也許其他?),並處理它們的事件。
  2. 有字典<userId, Task>並將每個任務的延續設置給我的處理程序。
  3. 有PriorityQueue的時候,應該提出通知,並在一個單一的線程處理它們(處理可以是異步或序列化)的所有時間。當隊列爲空時,處理停止,當一個項目被添加時,處理恢復(這將需要一些同步,但不是相當複雜)

哪種方法在性能方面可能更具可擴展性或更好?其他方法也受到讚賞。

謝謝。

+1

你無法在內存中執行任何操作(例如Dictionary或Timer),因爲它無法在Web服務器重新啓動(例如部署)期間存活。 – mjwills

+0

應用程序回收將被禁用。在部署時重置通知對我來說可以。 – steavy

回答

1

改爲使用Quartz或Hangfire。他們可以在特定的時間或按照時間表舉辦活動。事情是,他們將在服務器關機/重新啓動後生存。如果你在內存中有一個<user, Timer>字典 - 毫無疑問,它可以正常工作。但是,當服務器出現故障時,您的字典也會附帶所有計時器和事件。你必須把它存儲(你的日程安排)在某個地方。這是這些軟件包的工作方式。時間表存儲在存儲器(例如MS SQL數據庫)中。而你的調度不斷監督該存儲,發射一些流程,是由於要執行

如何,如果你選擇Quartz

Quartz documentation它的外觀,注意第9章。這種調度的需要(工種)初步配置

0

使用選項3並按時間優先排列隊列。

經過一段固定的時間間隔後,您會從隊列中選取應發送給用戶的項目。

是的,您需要線程以異步方式獲取項目,並且還需要在此隊列上進行同步(鎖定對象)。

您可能也有興趣ConcurrentPriorityQueue