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

时间:2017-07-16 16:10:19

标签: azure azure-functions azure-queues

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

我们应该为此委派使用的请求/响应设计模式是什么?具体来说,如何将通过队列发回的响应仅传递给发出请求的函数?

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

  1. 请求进入HTTP触发器功能A
  2. 功能A将消息放入队列X(采用JSON格式),第一个键是唯一的requestId:“ABC345”
  3. 功能A开始侦听队列Y以获取响应
  4. 功能B将此消息出列并执行其工作
  5. 功能B将带有工作结果的消息与requestId一起添加到队列Y中:“ABC345”
  6. 功能A使用requestId:“ABC345”查看此消息并返回HTTP响应
  7. 我们怎样才能让功能A只接收它正在等待的请求?

    getMessage方法似乎无法有选择地侦听队列,只能抓取最顶层的消息:

    getMessage(queue [, options], callback)
    

    另一个角度是,如果我们想要多个Worker函数来侦听Queue X.函数C将处理所有具有requestType:“query”的请求,而Function D将处理所有requestType:“blob”。没有这个过滤,我们将为每个Worker函数使用一个队列。这也是正确的方法吗?

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

2 个答案:

答案 0 :(得分:0)

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

考虑:

  1. 继续使用Http。您可以移植到函数并保留底层函数 图案。
  2. 在完全异步的情况下使用队列。所以排队了 消息开始B并返回; A2听取来自的回复 B.
  3. 查看耐用功能预览。这允许 同步调用完全像你想要的。它在预览中,但是 见https://github.com/Azure/azure-functions-durable-extension

答案 1 :(得分:0)

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

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