Thread.Sleep在Azure WebJob

时间:2015-07-08 13:49:01

标签: c# asp.net-mvc multithreading azure azure-webjobs

我目前正在开发一个具有队列newUsersQueue的Azure WebJob应用程序。此队列由关联网站填充,该网站在创建帐户时将新用户添加到队列中,并且webjob的目标是在用户第一周没有活动时向用户发送电子邮件。队列中的每个对象都有用于标识用户的数据,以及DateTime RegisteredDate

我假设队列将按用户加入的日期排序,以便最老的用户在队列中排在第一位,因为FIFO(先进先出)

我当前的方法是从webjob中获取队列中的第一项,只需Thread.Sleep(DateTime.Now.Subtract(RegisteredDate.addDays(7)))

由于资源有限,我现在担心这可能会很昂贵。也许还有其他问题,我没有想过(这个线程可能会睡7天,浪费线程?)?

是否有更好(更具成本效益)的方法来实现这一目标?我一直在考虑使用计时器或其他一些东西。计时器/其他方法的好处是什么会超过睡眠?

队列消息在弹出队列后一周内是否存在丢失队列消息的风险? (它是否已加载到内存并从队列中删除?)持久性当然也很重要。

据我所知,到目前为止,我的决定主要归结为Azure Webjobs如何处理队列。它是否会随意启动新线程来处理排队的消息,还是会坚持使用1个线程,并让现在的队列花费时间?

换句话说,上面的方法会为每个新用户启动一个新线程,还是会坚持一个线程并一次处理一个排队对象?

1 个答案:

答案 0 :(得分:1)

Create a scheduled WebJob

选择定期,随时运行,确保用于检查条件中用户的逻辑是有效的,假设您拥有大量用户,这可能是最昂贵的部分。如果没有,这真的不贵。

如果您担心昂贵的查询,可以执行此操作的一种方法是将新用户添加到另一个表,每天检查此表以查找已登录的用户,将其从此表中删除。如果用户达到7天,发送电子邮件,然后删除或做任何他们想做的事情。然后,假设您每周只有300名新成员,那么您只需要查询300个用户,而不是10k用户。