如果简单,我们的任务是处理大量输入消息.为了解决这个问题,我们决定使用Azure队列存储和Azure功能.我们有Azure Functions结构,类似于以下代码:
队列触发功能:
[FunctionName("MessageControllerExecutor")]
public static async void Run(
[QueueTrigger(QUEUE_NAME, Connection = QUEUE_CONNECTION_NAME)]string queueMessage,
[OrchestrationClient] DurableOrchestrationClient client,
TraceWriter log)
{
await client.StartNewAsync("MessageController", queueMessage);
}
Run Code Online (Sandbox Code Playgroud)
耐用功能:
[FunctionName("MessageController")]
public static async void Run(
[OrchestrationTrigger] DurableOrchestrationContext context,
TraceWriter log)
{
if (!context.IsReplaying) log.Warning("MessageController started");
var function1ResultTask = context.CallActivityAsync<ResultMessage>("Function_1", new InputMessage());
var function2ResultTask = context.CallActivityAsync<ResultMessage>("Function_2", new InputMessage());
await Task.WhenAll(function1ResultTask, function2ResultTask);
// process Function_1 and Function_2 results
// ...
}
Run Code Online (Sandbox Code Playgroud)
简单活动功能样本:
[FunctionName("Function_1")]
public static ResultMessage Run(
[ActivityTrigger] DurableActivityContext activityContext,
TraceWriter log)
{
var msg = …Run Code Online (Sandbox Code Playgroud) 我们使用几个 azure 函数和 azure 存储队列在它们之间进行通信。我们知道每个队列消息的限制为 64kB,因此我们必须使用消息压缩,但有时我们会超出该限制。根据文档https://learn.microsoft.com/en-us/azure/service-bus-messaging/service-bus-azure-and-service-bus-queues-compared-contrasted#capacity-and-quotas
\n\n\n\n\nAzure 通过组合队列和 blob \xe2\x80\x93 来支持大消息,此时您可以为单个项目排队最多 200 GB。
\n
看起来我们可以将大消息放入存储队列中。不幸的是没有关于此的额外文档。所以我们的问题是它应该如何运作?它应该开箱即用,或者我们应该使用某种模式,例如将消息写入 blob,将带有 blob id 的消息放入队列,然后在某些队列触发的函数中按 id 读取 blob?
\n\n我们使用 Microsoft.Azure.Storage.Queue v9.4.2 nuget 包将消息推送到队列中。
\n