2017-06-20 126 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