如何在没有“始终开启”的情况下保持 Azure WebJob 运行

Posted

技术标签:

【中文标题】如何在没有“始终开启”的情况下保持 Azure WebJob 运行【英文标题】:How can I keep my Azure WebJob running without "Always On" 【发布时间】:2015-05-08 09:02:36 【问题描述】:

我有一个与网站关联的连续网络作业,并且我正在在共享模式下运行该网站。我不想使用 Always On 选项,因为我的应用程序并不真正需要。我只想在调用我的网站时处理消息。

我的问题是,即使我每隔 5 分钟在我的网站上不断调用一个虚拟的 keep alive 方法,该方法会在该网络作业监控的队列中发布一条消息,但几分钟后该作业仍然停止。

我的 webjob 是一个使用 WebJob SDK 构建的简单控制台应用程序,其中包含这样的代码

JobHost host = new JobHost(new JobHostConfiguration(storageConnictionSttring));
host.RunAndBlock();

消息处理函数如下:

public static void ProcessKeepAliveMessages([QueueTrigger("keepalive")] KeepAliveTrigger message)

    Console.WriteLine("Keep Alive message called on :0", message.MessageTime);

该工作的消息日志基本上说

[03/05/2015 18:51:02 > 4660f6: SYS INFO] WebJob is stopping due to website shutting down

我不介意这种情况发生,但是当网站启动下一个保持活动状态的调用时,webjob 不会启动。所有消息都排队,直到我进入管理仪表板或 SCM 门户,如下所示

https://mysite.scm.azurewebsites.net/api/continuouswebjobs

我可以看到这样的状态:

["status":"Starting","detailed_status":"4660f6 - Starting\r\n","log_url":"https://mysite.scm.azurewebsites.net/vfs/data/jobs/continuous/WebJobs/job_log.txt","name":"WebJobs","run_command":"mysite.WebJobs.exe","url":"https://mysite.scm.azurewebsites.net/api/continuouswebjobs/WebJobs","extra_info_url":"https://mysite.scm.azurewebsites.net/azurejobs/#/jobs/continuous/WebJobs","type":"continuous","error":null,"using_sdk":true,"settings":]

如果有人能帮助我了解这里出了什么问题,我将不胜感激。

【问题讨论】:

您可以使用 WebJob Api ***.com/questions/38346062 手动触发作业。 【参考方案1】:

我遇到了类似的问题。我有一个网站(共享模式)和一个关联的网络作业(连续类型)。查看 webjob 日志,我发现作业在大约 15 分钟后进入停止状态。不活动并停止对触发消息做出反应。这似乎与连续工作概念的概念相矛盾,但显然,要使其真正连续运行,您必须订阅付费网站。你得到你所付出的...

也就是说,我的网站大约需要每隔几天使用一次,并且以共享模式运行非常有意义。我不介意该站点需要一些额外的时间才能开始 - 只要它自动重新启动即可。 webjob 的问题是一旦停止它就不会自行重启。所以,我的目标是用网站重新启动它。

我注意到,只需查看 Azure 管理门户中的网络作业即可启动它。按照这种思路,我发现获取 webjob 属性足以将其切换到运行状态。唯一的技巧是如何以编程方式获取属性,以便重新启动网站也会重新启动 webjob。

因为获取 webjob 属性的调用必须经过身份验证,所以第一步是转到 Azure 管理门户并下载网站发布配置文件。在发布配置文件中,您可以找到身份验证凭据:用户名(通常为 $)和 userPWD(密码哈希)。把它们抄下来。

这是一个获取 webjob 属性并将其唤醒(如果尚未运行)的函数:

class Program

    static void Main(string[] args)
    
        string websiteName = "<website_name>";
        string webjobName = "<webjob_name>";
        string userName = "<from_publishing_profile>";
        string userPWD = "<from_publishing_profile>";
        string webjobUrl = string.Format("https://0.scm.azurewebsites.net/api/continuouswebjobs/1", websiteName, webjobName);
        var result = GetWebjobState(webjobUrl, userName, userPWD);
        Console.WriteLine(result);
        Console.ReadKey(true);
    

    private static JObject GetWebjobState(string webjobUrl, string userName, string userPWD)
    
        HttpClient client = new HttpClient();
        string auth = "Basic " + Convert.ToBase64String(Encoding.UTF8.GetBytes(userName + ':' + userPWD));
        client.DefaultRequestHeaders.Add("authorization", auth);
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        var data = client.GetStringAsync(webjobUrl).Result;
        var result = JsonConvert.DeserializeObject(data) as JObject;
        return result;
    

您可以使用类似的功能来获取您网站中的所有网络作业(使用端点https://<website_name>.scm.azurewebsites.net/api/webjobs)。您还可以查看返回的 JObject 来验证 webjob 的实际状态和其他属性。

【讨论】:

谢谢!这种方法似乎可以帮助我。我也可以使用 pingdom 对 SCM 执行 ping 操作,这也有效,但看起来有点过于 hack。【参考方案2】:

如果您希望 WebJob 不会停止,您需要确保您的 scm 网站活动

因此,keep-alive 请求应该发送到 https://sitename.scm.azurewebsites.net,并且这些请求需要进行身份验证(使用您的部署凭据进行基本身份验证)。

【讨论】:

我的印象是我们的工作将在站点激活时开始,这就是我在文档中读到的内容。不是这样吗? 不,WebJob 正在 scm (kudu) 站点下运行,除非启用“Always On”,否则站点启动时不会启动。 有没有办法从我的 WebApi 代码中触发作业? @AmitApple 看来你必须去mysite.scm.azurewebsites.net/basicauth 而不是mysite.scm.azurewebsites.net。 如果您像我一样通过 Visual Studio 进行部署,并且它为您生成了一个您没有的部署密码,您需要在此处查看此答案:***.com/questions/37635783/…

以上是关于如何在没有“始终开启”的情况下保持 Azure WebJob 运行的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有绑定的情况下运行 Azure Function

如何在没有 azure 的情况下为 UWP 注册推送通知?

如何在没有 microsoft azure 用户的情况下使用 swift 获取访问令牌?

GLUT 鼠标移动,坐标始终开启

如何在没有文件路径的情况下将文件上传到 Azure Blob 存储容器的根目录

Azure Fileshare - 在没有备份服务的情况下还原快照