线程.在Azure WebJob中睡眠最多7天
本文关键字:7天 Azure WebJob 线程 | 更新日期: 2023-09-27 18:01:31
我目前正在做一个Azure WebJob应用程序,它有一个队列newUsersQueue
。该队列由一个关联的网站填充,当新用户创建帐户时,该网站会将新用户添加到队列中,而webjob的目标是,如果用户在成为会员的第一周内没有任何活动,则向用户发送电子邮件。队列中的每个对象都有标识用户的数据和DateTime RegisteredDate
。
我假设队列将按用户加入的日期排序,因此最老的用户最终首先在队列中,因为FIFO(先进先出)
我目前的方法是从webjob中抓取队列中的第一个项目,然后简单地Thread.Sleep(DateTime.Now.Subtract(RegisteredDate.addDays(7)))
由于资源有限,我现在担心这可能会很昂贵。也许还有其他问题,我还没有想到(这个线程可能会睡眠长达7天,浪费一个线程?)?
是否有更好(更具成本效益)的方法来实现这一点?我一直在考虑用计时器之类的东西。计时器或其他方法对睡眠有什么好处?
在将队列消息从队列中弹出后,是否存在因休眠一周而丢失队列消息的风险?(它是否加载到内存并从队列中删除?)持久性当然也很重要。
从我学到的到目前为止,我的决定基本上归结为Azure Webjobs如何处理队列。它会随意启动新线程来处理排队的消息,还是会坚持使用一个线程,并让它花时间处理现有队列?
换句话说,上面的方法会为每个新用户启动一个新线程,还是会坚持一个线程并一次处理一个队列对象?
创建调度的WebJob。
选择循环,随时运行它,确保用于检查标准中的用户的逻辑是有效的,假设您有很多用户,这可能是最昂贵的部分。如果没有,这并不昂贵,真的。
如果你担心昂贵的查询,你可以这样做,添加新用户到另一个表,每天检查这个表的用户登录,从这个表中删除他们。如果用户达到了7天,那就给他们发一封电子邮件,然后删除他们,或者对他们做任何你想做的事情。然后,假设每周只有300个新成员,那么您只需查询300个用户,而不是10,000个。