我在Azure表存储中有一个表,其中的行由各种进程定期更新。我想有效地监视行在特定时间段内没有更新,并在发生这种情况时生成警报。
我看到的大多数Azure功能的任务调度器实现都是通过确保一次只有一个工作者执行给定的工作。然而,设置一个等待n分钟的计划任务,然后查询最新的时间戳以确定是否应该采取行动,似乎效率很低,因为工作不会分散到各个工作人员。同时,轮询这么多的记录似乎效率很低。
这个的一个例子是向一个在过去30天内没有登录过网站的用户发送一封电子邮件。为了产生一个有效的算法,假设用户的数量是一个"大数字"。
有没有人有什么建议的策略可以用来检查最近的活动,而不强迫一个工人做这项工作?
保留一个LastActive表,将时间戳作为rowkey (DateTime.UtcNow.Ticks.ToString("d19")
)。通过执行批处理事务来更新它,删除旧行并插入新行。
现在对非活动用户的查询就像from user in LastActive where user.PartitionKey == string.Empty && user.RowKey < (DateTime.UtcNow - TimeSpan.FromDays(30)).Ticks.ToString("d19") select user
一样。这对于任何大小的表都是非常有效的。
根据您要对该信息做什么,您可能希望然后将消息放在队列中,然后删除该行(因此下次检查时它不会再次被注意到)。多个worker现在可以提取这些队列消息并采取行动。
我对你想在多个工作实例上这样做的愿望感到困惑…您可能只希望对非活动用户执行一次操作,因此您只希望一个实例执行检查。(发送电子邮件或其他您正在做的工作可以通过使用队列来分散,但初始检查应该由一个实例完成。)