通知队列实现

时间:2017-06-20 13:27:16

标签: c# multithreading timer task

我有一个Web应用程序,并且对于每个用户(假设我有大约5千个用户)我需要在他请求后一小时内提供通知(这是一个简化的desc.ofc)。 / p>

我想到了以下解决方案:

  1. <userId, Timer>字典(我想Threading.Timer,也许是其他?)并处理他们的事件。
  2. 拥有<userId, Task>字典并将每个任务的Continuation设置为我的处理程序。
  3. 具有PriorityQueue的次数,此时应该引发通知并且在单个线程中始终处理它们(处理可以是异步的或序列化的)。当Queue为空时,处理停止,当添加项目时,处理恢复(这将需要一些同步,但不是很复杂)
  4. 哪种方法在性能方面可能更具可扩展性或更好?其他方法也很受欢迎。

    感谢。

2 个答案:

答案 0 :(得分:1)

使用Quartz或Hangfire代替。他们可以在指定时间或根据时间表提出事件。事情是他们将在服务器关闭/重启后继续存在。如果你在内存中有一个<user, Timer>字典 - 毫无疑问它会正常工作。但是,当服务器出现故障时,您的字典也会附加所有定时器和事件。你必须在某处存储它(你的日程安排)。这就是这些包的工作方式。计划存储在存储(例如,MS SQL数据库)中。并且您的调度程序一直在监视此存储,触发将要执行的某些进程(作业)

如果选择Quartz

,它的外观如何

Quartz documentation,请注意第9章。这种调度程序需要初步配置

答案 1 :(得分:0)

使用选项3并按时间对队列进行优先排序。

在一段固定的时间间隔之后,您将从队列中挑选应该发送给用户的项目。

是的,您需要以异步方式获取项目的线程,并且您还需要在此队列上进行同步(锁定对象)。

您可能也对ConcurrentPriorityQueue感兴趣。