【问题标题】:Azure WebJob - Limit Processing Time to Specific HoursAzure WebJob - 将处理时间限制为特定时间
【发布时间】:2017-03-21 03:39:02
【问题描述】:

我有一个 MVC 网站、一个存储队列和一个 WebJob。用户可以通过单击网页上的按钮来请求生成一组报告。这会将消息插入存储队列。过去,WebJob 连续运行并很好地处理这些请求。但是报告的需求和规模已经增长到 WebJob 正在减慢 Web 应用程序的速度。我仍想将请求消息放在队列中,但将所有请求的处理延迟到晚上,此时网络应用程序大部分时间都处于空闲状态。这将允许我继续使用 WebJob 代码和 QueueTrigger 功能,而不必通过转移到专用的 Worker Role 等来浪费资源。报告不需要立即生成,因此延迟是可以接受的。

我没有看到设置处理时间窗口的内置方法。我发现的唯一东西是用于启动和停止 WebJobs(Start-AzureWebsiteJob / Stop-AzureWebsiteJob)的 powershell cmdlet。所以我想我可以创建一个计划的 powershell 作业,它在午夜运行,启动 webjob,让它运行,然后在凌晨再次运行并停止它。

有没有人知道比这更好的选择?还有什么我可能找不到的更“官方”的吗?

【问题讨论】:

    标签: powershell azure azure-webjobs azure-queues


    【解决方案1】:

    一种可能的解决方案是在插入消息时将消息隐藏在队列中一段时间​​。

    如果您使用AddMessage 方法,您可以在initialVisibilityDelay 参数中指定此时间跨度值。

    这将确保消息不会立即在 WebJob 选择的队列中可见,并且仅在此时间跨度过去后才可见。

    这样的解决方案对您有用吗?

    【讨论】:

    • 我完全忘记了 initialVisibilityDelay。与我们现在使用的相比,我必须添加一个新的 AddMessage 包装器,但我认为它会起作用。只要队列没有变得太大以至于不会在一晚内处理完......因为这个解决方案没有“关闭”选项。谢谢。
    【解决方案2】:

    也许我没有完全理解您的问题,但是您不能使用由 CRON 计划触发的“触发”WebJob 吗?然后,您可以将其限制在特定时间

    0 * 20-22 * * *
    

    此示例将从晚上 8 点到晚上 10 点每分钟运行一次

    【讨论】:

    • 也许我需要试验一下。我已经完成了队列触发作业和简单的 cron 触发作业,但从未尝试将两者结合起来。当处理开始时,我不希望它简单地尝试一次性处理所有队列消息。这些报告变得很大,每个作业可能会消耗大量内存。出于这个原因,我将作业数量限制为每箱 4 个(使用 MaxDequeueCount)。作为一项触发工作,我不确定这会奏效。如果队列中有 50 条消息,我只想一次处理 4 条。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-10
    • 1970-01-01
    • 2015-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多