我们的后端正在收集原始数据并将其推送到Azure存储队列。我们想对每个排队的消息做两件事:
- 记录/存档
- 对其进行解析并将解析结果发送到新队列
为了保持事物的简洁明了,我们希望有两个指向同一队列的WebJob函数:
public static void ArchiveRawData([QueueTrigger("raw")] RawData data, [Blob("{Ticks}.dat")] out string raw)
{
raw = data.Data;
}
public static void ParseRawData([QueueTrigger("raw")] RawData data, [Queue("result")] out Parsed parsedData
{
var parsed = Parser.Parse(data.Data);
parsedData = parsed;
}
但这不起作用:ArchiveRawData或ParseRawData都会收到消息,但不会收到另一个。
是否有一个选项可以使上述场景发挥作用在第一个函数完成后(无论是哪一个),消息似乎会自动退出队列。但我认为WebJobs SDK可以检测到有多个函数具有相同的QueueTrigger,并且只有在所有函数完成后,它才能将消息出列。
为了解决这个问题,我们目前在一个功能中有两个输出:
public static void ParseRawData([QueueTrigger("raw")] RawData data, [Queue("result")] out Parsed parsedData, [Blob("{Ticks}.dat")] out string raw)
{
var parsed = Parser.Parse(data.Data);
parsedData = parsed;
raw = data.Data;
}
但正如我所说,我们希望保持小而简单,所以如果我们可以使用单独的函数,那就太好了。
遗憾的是,SDK不支持多个函数侦听同一队列。
如果希望调用多个函数,只需创建几个方法,并将webjob函数作为入口点。然后网络作业将调用这些函数。
或者,您可以让第二个函数侦听不同的队列。第一个队列向该队列添加一条消息。
如果用ServiceBus主题替换存储队列,则可以在其上放置两个订阅,每个WebJob一个订阅。然后,每个WebJob都将获得每条消息的自己的副本。