如何在请求/响应模式下使用 Azure 存储队列?

How do I use an Azure Storage Queue in a request / response mode?

随着我们将更多 node.js 代码移植到 Azure Functions 中,我们在 Azure 文档中看到使用存储队列是委托处理责任的首选方式,而不是使用 http 请求来调用其他函数。

我们应该为这个委托使用什么 request/response 设计模式?具体来说,如何才能将通过队列发回的响应仅传送到发出请求的函数?

下面是我们想要做的一个例子:

  1. 请求进入 HTTP 触发函数 A
  2. 函数 A 将消息放入队列 X(以 JSON 格式),第一个键是唯一的 requestId:"ABC345"
  3. 函数 A 开始侦听队列 Y 的响应
  4. 函数 B 将此消息从队列中取出并执行其工作
  5. 函数 B 将带有工作结果的消息添加到队列 Y 中,请求 ID 为:"ABC345"
  6. 函数 A 看到此消息的 requestId:"ABC345" 和 returns HTTP 响应

我们怎样才能让函数 A 只接收它正在等待的请求?

getMessage方法好像不能选择性监听某个队列,只能抓取最前面的消息:

getMessage(queue [, options], callback)

另一个角度是,如果我们希望多个工作函数监听队列 X。函数 C 将处理具有 requestType: "query" 的所有请求,而函数 D 将处理所有 requestType: "blob".如果没有这种过滤,我们将为每个 Worker 函数使用一个队列。这也是正确的做法吗?

注意:我们使用的是 node.js,但我假设队列 API 在所有 SDK 中都是等效的。

Azure 队列确实不执行请求-响应。 Http 处理不应等待队列。 Http 消息应该 return 快速(同步,< 1 分钟),而队列用于更长的异步后台处理。如果 Http 正在等待队列,它应该使用 202 long-运行 模式。

考虑:

  1. 继续使用 Http。您可以移植到 Functions 并保留您的基础 模式。
  2. 在完全异步的情况下使用队列。所以A排队a 启动 B 和 returns 的消息; A2 监听来自 B.
  3. 查看 Durable Functions 预览。这允许 同步调用与您想要的完全一样。它在预览中,但是 见 https://github.com/Azure/azure-functions-durable-extension

看起来 Azure 逻辑应用程序是在 request/response 模式中编排多个功能的未来。使用逻辑应用程序,您可以设置一个 HTTP 触发器(以及许多其他触发器),然后使用条件逻辑按顺序设置几个函数 运行:

https://docs.microsoft.com/en-us/azure/logic-apps/logic-apps-azure-functions