标签: azure-webjobs

无队列运行Azure WebJob

有没有办法在没有收听队列的情况下安排工作?我的意思是我想每小时左右运行它并做一些事情,无论队列如何.这甚至有意义吗?我能想到的一个解决方案是每次完成工作时将消息排队到自己,但这对我来说看起来不是一个干净的解决方案.

azure azure-webjobs

5
推荐指数
1
解决办法
4141
查看次数

在Azure中,为什么在多个Web站点上运行时,单个存储帐户中的同一个WebJob不能扩展?

我目前正在尝试将处理器密集型模拟任务划分为几百个在Azure中并行处理的块.我认为Azure WebSites提供易于设置的专用虚拟机和WebJobs,其易于使用的存储队列抽象符合我的法案.

我有以下Azure设置,每次运行时都会由我的代码重新创建

  • 单个存储帐户
  • 一个带有作业描述的存储队列
  • 具有静态数据的存储容器
  • 结果的存储容器(每个作业的唯一文件)
  • n(例如8)"标准"网站,意味着有n个不同的*.azurewebsites.net URI
  • 每个WebSite上的一个WebJob使用WebJobs SDK(JobHost)连续运行(示例中为8个WebJobs)
  • 每个职位描述<1k
  • 每个作业包含大约10万个Blob输入数据
  • 每个结果大约是100k的Blob输出数据
  • 通过当前缩放,每个作业运行大约一分半钟

这是工作的签名.

public static void RunGeant4Simulation(
    [QueueTrigger("simulationjobs")] JobDescription jobDescription,
    [Blob("input/{Archive}", FileAccess.Read)] Stream archive,
    [Blob("result/{Name}-{Energy}-output.zip", FileAccess.Write)] Stream output,
    [Blob("result/{Name}-{Energy}-log.dat")] TextWriter debug
)
Run Code Online (Sandbox Code Playgroud)

然后代码继续设置WebSite本地特定于作业的目录,提取包含可执行文件的zip-archive,使用Process.Start运行此可执行文件并将捕获的输出写入blob.进程访问的所有内容都可在计算机上使用.调试TextWriter用于捕获作业中的计时信息.

我期望看到的是每个WebSite都会从队列中找到一份工作,运行它,将结果发布到容器中并接受下一个工作.

我实际看到的是,只有一个WebSite实际上正在运行作业,而其余的只是闲置,尽管WebJob报告为在每个站点上启动和运行.最终结果是每分钟完成的作业数量与一个WebSite相同.这是一个运行日志,其中两个WebSites"决定"参与运行的作业:simulation-log.zip.连接字符串中提到的存储帐户已被删除,因此我没有从日志中删除访问密钥.

我已经为WebJob添加了一些计时工具,从中我可以看到,有时运行可执行文件需要两倍或三倍(几乎完全)在"正常"运行中花费的时间

stopwatch.Start();
using (var process = Process.Start(processStartInfo))
{
    debug.WriteLine("After Starting Process: {0}", DateTime.UtcNow);
    var outputData = process.StandardOutput.ReadToEnd();

    process.WaitForExit();

    stopwatch.Stop();
    debug.WriteLine("Process Finished: {0} {1}", DateTime.UtcNow, stopwatch.Elapsed);

    outputBytes = Encoding.UTF8.GetBytes(outputData);
}
Run Code Online (Sandbox Code Playgroud)

秒表显示时间为1:15,2:27,3:43等.但是一些花费比预期更长的工作也显示了秒表的预计时间.但是,在这两种情况下,运行另一个WebSite上的作业而不是在存储的结果容器中运行结果.最后,每分钟完成的工作数量不会改变.

更新

今天,我更进了一步,为每个WebSite创建了一个单独的存储帐户,并在8个存储帐户中的8个队列之间手动分配作业,每个帐户用于8个网站之一.这意味着从我的外部观点来看,除了偶然运行相同的代码之外没有任何共同之处.

这并没有帮助.

看起来我还有一个单独的处理器必须在我创建的任何WebSite上运行所有WebJobs,无论它们有多独立.我已经创建了一个CPU时间的图像,如门户网站所示: 门户网站中显示的CPU时间

azure azure-webjobs

5
推荐指数
1
解决办法
1054
查看次数

Azure WebJob - 未找到任何功能.尝试将作业类公开,方法公共静态

我正在使用Azure WebJob,但现在我收到以下错误消息:

找不到任何功能.尝试将作业类公开,方法公共静态.

我的代码很简单:

static void Main()
{
    var host = new JobHost(); 
    host.RunAndBlock();
}
public static async Task BlobTrigger(
    [BlobTrigger("test/{name}")] Microsoft.WindowsAzure.Storage.Blob.CloudBlockBlob input,
    TextWriter log)
{
    //code
}
Run Code Online (Sandbox Code Playgroud)

此外,我从我的调试文件夹创建一个zip文件并上传它,并将作业配置为连续运行.

c# azure azure-webjobs

5
推荐指数
1
解决办法
2974
查看次数

Azure网站持续部署总是选择错误的项目

我的TFS在线有以下文件夹结构:

在此输入图像描述

文件夹名称也与解决方案中的项目名称匹配.

传说:

  • 绿点:web api 2.0项目
  • 红点:类库
  • 蓝点:控制台应用程序作为webjob添加到Web项目
  • 灰点:仅用于测试的控制台应用程序

构建定义的工作文件夹: 在此输入图像描述

通过在线连接Azure到TFS自动创建构建定义,我只更改了文件夹,因此它指向该分支的文件夹,而不是Team Project根文件夹,其中包含解决方案文件和第一张图片中的文件夹.

(这指向包含解决方案文件的文件夹以及第一张图像中的所有子文件夹.

问题: 当我运行构建时,它总是选择ExpiringRateCardsWorker项目(即使现在Web项目已被重命名(目录和项目文件)以下划线开头,因此它将首先按字母顺序排列.

部署成功,这是我在摩纳哥看到的:

在此输入图像描述

如何让它获取Web项目?

编辑:问题被关闭,说明是的重复.我已经尝试了那里建议的解决方案,但是/site/deployments文件夹在FTP上是空的,它不包含deploy.cmd,所以我的问题仍然没有得到不幸的回答.

tfs continuous-integration azure azure-web-sites azure-webjobs

5
推荐指数
1
解决办法
450
查看次数

Azure Web作业VS Azure批处理VS工作人员角色

在Azure之上决定数据处理方法的利弊是什么?我们看到了Azure Web作业,Azure批处理和Azure工作者角色,但实际上无法确定每种选择的优缺点,尤其是在可伸缩性和成本方面。

假设e具有来自天蓝色队列的数据处理。从每天1-5个数据项到每分钟500个数据项。每个项目都需要自定义处理(如果使用C#逻辑,则需要一些位),具体时间在5秒到5分钟之间,具体取决于数据的性质。

有了这样的负载,我们如何决定Web作业,Azure批处理或工作人员?决定的主要标准是什么?

azure web-worker azure-webjobs azure-batch

5
推荐指数
1
解决办法
1491
查看次数

使用WebJob发布简单的Asp.Net核心应用程序(.Net Framework)

我想创建一个简单的ASP.NET核心Web应用程序(.NET Framework)并将WebJob与它一起发布到Azure.

我正在使用Visual Studio 2017,但结果在VS2015中似乎是相同的.

首先,我在VS2017中创建相应的项目:

在此输入图像描述

我选择了基本的Web应用程序模板:

在此输入图像描述

此时我有点失落.在旧的Asp.Net MVC 5方法中,我曾经能够点击Asp.Net项目并找到"Add => New Azure Webjobs Project".然后,WebJob将始终在发布中链接并且只是"工作".

使用新的Asp.Net Core方法,我似乎无法找到一种类似的简单方法来实现这一点.

我尝试手动将WebJobs项目添加到解决方案中,然后在Asp.Net项目中手动设置webjobs-list.json文件,但发布步骤无法识别它.我注意到像这样的各种答案建议挂钩到发布过程来复制文件,但添加到*.pubxml文件的标记没有任何影响(即文件没有被复制).

关于这项任务似乎有一些过时的信息.有人能够详细说明在Visual Studio中包含Asp.Net Core应用程序的新解决方案的当前过程吗?

azure-web-sites azure-webjobs visual-studio-2015 asp.net-core visual-studio-2017

5
推荐指数
2
解决办法
1850
查看次数

在Azure Functions上部署节点应用程序

我想知道如何在Azure Functions上部署Node.js应用程序.

基本上,我有一个功能设置并运行一个基本的hello world http示例,如下所示:

module.exports = function (context, req) {
    context.log('JavaScript HTTP trigger function processed a request.');
    context.res = {
        // status: 200, /* Defaults to 200 */
        body: "Hello " + req.params.name
    };
    context.done();
};
Run Code Online (Sandbox Code Playgroud)

我试图部署到一个函数的应用程序是一个使用swagger的简单moc客户端(基本上接受请求并返回一些xml).app.js看起来像:

const SwaggerExpress = require('swagger-express-mw');
const app = require('express')();
const compression = require('compression');

const configSwagger = {
    appRoot: __dirname, // required config
};


SwaggerExpress.create(configSwagger, (err, swaggerExpress) => {
    if (err) {
        throw err;
    }

    // install middleware
    swaggerExpress.register(app);

    // server configuration
    const serverPort …
Run Code Online (Sandbox Code Playgroud)

azure node.js azure-node-sdk azure-webjobs azure-functions

5
推荐指数
1
解决办法
1638
查看次数

什么运行模式应该用于ServiceBus触发的WebJob?

我有一个WebJob,只要ServiceBus队列项出现就会被触发

public static void ProcessQueueMessage(
    [ServiceBusTrigger("%ServiceBusHighPriorityQueueName%")] BrokeredMessage message)
Run Code Online (Sandbox Code Playgroud)

一些网站声明如下

  • 连续:将始终运行的WebJob
  • 触发:在进行API调用时按需运行的WebJob,或在达到预定条件时运行的WebJob.

我假设ServiceBus队列触发器处理程序是"触发"而不是"连续",那么在设置webjob-publish-settings.json参数runMode时应该使用什么?

由于它被触发,AppService仍然需要是AlwaysOn吗?

c# azure azureservicebus azure-webjobs

5
推荐指数
1
解决办法
286
查看次数

如何将.net核心WebJob与asp.net核心Web应用程序一起发布?

我有两个网络核心控制台应用程序,我使用visual studio作为Web作业部署到Azure.

<Project Sdk="Microsoft.NET.Sdk;Microsoft.NET.Sdk.Publish">
Run Code Online (Sandbox Code Playgroud)

当我单独发布它时,它运行良好.

如何使用Web应用程序发布.net核心webjobs togeter?

我试过创造webproject/properties/webjob-list.json.路径与webproject/webproject.csproj相关:

{
  "$schema": "http://schemastore.org/schemas/json/webjobs-list.json",
  "WebJobs": [
    {
      "filePath": "../PeopleWebJob/PeopleWebJob.csproj"
    },
    {
      "filePath": "../Reminder/ReminderWebJob.csproj"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

我也试过安装Microsoft.Web.WebJobs.Publishnuget,但看起来这种方法不适用于.NET Core.

Alternativelly,

如何使用VSTS发布webjobs?

我试过dotnet publishWebJob项目并将输出复制到$(Build.ArtifactStagingDirectory)/webproject.zip/App_Data/jobs/Triggered

azure-web-sites azure-webjobs azure-devops asp.net-core asp.net-core-2.0

5
推荐指数
1
解决办法
2321
查看次数

抛出TaskCanceledException时,Azure ServiceBus队列不重试消息

我有一个Azure WebJob函数,用于侦听Azure ServiceBus队列上的消息。通常,当我在代码中遇到异常时,根据Azure WebJobs SDK文档,该消息将被放弃:

如果功能成功完成,SDK会在PeekLock模式下接收一条消息,并在消息上调用Complete,如果功能失败,则调用Abandon。如果该函数的运行时间超过了PeekLock超时时间,则该锁定将自动更新。

根据Azure ServiceBus文档,这应该意味着该消息再次变得可用,并将被重试:

如果应用程序由于某种原因无法处理该消息,则可以对收到的消息调用AbandonAsync方法(而不是CompleteAsync)。此方法使Service Bus可以解锁消息并使其可以由同一使用者或另一个竞争使用者再次接收。其次,存在与锁定相关联的超时,并且如果应用程序未能在锁定超时到期之前处理消息(例如,如果应用程序崩溃),则服务总线将消息解锁并使其可以再次接收(基本上是)默认情况下执行AbandonAsync操作)。

上面描述的行为是通常发生的情况,但是我发现了此规则的例外。如果我的代码TaskCanceledException专门抛出了该消息,则该消息不会被丢弃,而应该这样做:

public void ProcessQueueMessage([ServiceBusTrigger("queue")] BrokeredMessage message, TextWriter log)
{
     throw new TaskCanceledException();
}
Run Code Online (Sandbox Code Playgroud)

通过Web作业运行此功能时,我看到错误消息打印成一天,但该消息被使用而没有重试,也没有进入死信队列。如果我将TaskCanceledException上述内容替换为InvalidOperationException,则该消息将被绑定并重试(应根据实际的ServiceBus队列进行了验证)。

我无法找到有关此行为的任何解释。目前,我将换成TaskCanceledException另一个例外来解决此问题。

问题

我正在遇到Azure WebJobs SDK中的错误吗?TaskCanceledException在这方面是否特殊,或者其他类型的异常是否具有类似的行为?


我正在使用以下NuGet软件包:

  • Microsoft.Azure.WebJobs 2.3.0
  • Microsoft.Azure.WebJobs.ServiceBus 2.3.0

c# azure azureservicebus azure-servicebus-queues azure-webjobs

5
推荐指数
1
解决办法
220
查看次数