我有一个Web应用程序,并且对于每个用户(假设我有大约5千个用户)我需要在他请求后一小时内提供通知(这是一个简化的desc.ofc)。 / p>
我想到了以下解决方案:
<userId, Timer>
字典(我想Threading.Timer
,也许是其他?)并处理他们的事件。<userId, Task>
字典并将每个任务的Continuation设置为我的处理程序。哪种方法在性能方面可能更具可扩展性或更好?其他方法也很受欢迎。
感谢。
答案 0 :(得分:1)
使用Quartz或Hangfire代替。他们可以在指定时间或根据时间表提出事件。事情是他们将在服务器关闭/重启后继续存在。如果你在内存中有一个<user, Timer>
字典 - 毫无疑问它会正常工作。但是,当服务器出现故障时,您的字典也会附加所有定时器和事件。你必须在某处存储它(你的日程安排)。这就是这些包的工作方式。计划存储在存储(例如,MS SQL数据库)中。并且您的调度程序一直在监视此存储,触发将要执行的某些进程(作业)
如果选择Quartz
,它的外观如何Quartz documentation,请注意第9章。这种调度程序需要初步配置
答案 1 :(得分:0)
使用选项3并按时间对队列进行优先排序。
在一段固定的时间间隔之后,您将从队列中挑选应该发送给用户的项目。
是的,您需要以异步方式获取项目的线程,并且您还需要在此队列上进行同步(锁定对象)。
您可能也对ConcurrentPriorityQueue感兴趣。