【问题标题】:Strategies for checking inactivity on Azure在 Azure 上检查不活动的策略
【发布时间】:2011-10-17 21:00:03
【问题描述】:

我在 Azure 表存储中有一个表,其中的行由各种进程定期更新。我想在特定时间段内有效地监控行没有更新,并在发生这种情况时生成警报。

我见过的 Azure 功能的大多数任务计划程序实现都是通过确保一次只有一个工作人员执行给定的工作来实现的。但是,设置等待 n 分钟的计划任务,然后查询最新的时间戳以确定是否应采取行动,似乎效率低下,因为工作不会分散到工作人员之间。轮询如此多的记录通常也似乎效率低下。

使用此方法的一个示例是向过去 30 天内未登录网站的用户发送电子邮件。假设用户数量是一个“大数字”,以产生高效的算法。

是否有人对可用于检查近期活动而无需仅强迫一名工人完成工作的策略有任何建议?

【问题讨论】:

    标签: azure scheduled-tasks azure-table-storage


    【解决方案1】:

    保留带有时间戳的 LastActive 表作为行键 (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。这对于任何大小的桌子都非常有效。

    根据您要对该信息执行的操作,您可能希望将消息放入队列,然后删除该行(这样下次检查时就不会再次注意到它)。多个工作人员现在可以提取这些队列消息并采取行动。

    我对您希望在多个工作实例上执行此操作感到困惑...您可能只想对非活动用户执行一次操作,因此您只希望一个实例进行检查。 (发送电子邮件或您正在做的任何其他工作都可以通过使用队列来传播,但最初的检查应该由一个实例完成。)

    【讨论】:

    • 我使用用户只是一个简单的例子。我的数据实际上每五秒更新一次。更新一个额外的表会导致比仅仅扫描几千行的表更多的开销。通常,您也是对的,我可以将要完成的实际工作排队,以避免过度加载单个工作人员。但是,鉴于队列限制为每秒约 500 条消息,假设处理 5000 行将需要 50 秒才能排队。我希望以某种方式直接处理。
    • 更重要的是,通过将所有这些行放在同一个 PK 中,我还将每秒可以执行的更新次数限制为 500。我希望可以扩展到数千个.
    • 如果扫描速度更快,那我想我不明白你在问什么。进行扫描。如果一个分区不够可扩展,请使用多个分区。如果一个队列不够可扩展,请使用多个队列。如果您遇到整个存储帐户的限制,您可以使用多个存储帐户,或者您可能需要考虑不同的存储技术。
    猜你喜欢
    • 2022-01-02
    • 2022-01-03
    • 1970-01-01
    • 1970-01-01
    • 2017-08-08
    • 1970-01-01
    • 2011-01-20
    • 2011-04-16
    • 2015-01-20
    相关资源
    最近更新 更多