Azure 服务总线将获取请求添加到队列

Azure Service Bus add get requests to queue

所以我在设计队列时遇到了很多问题,我的 API 收集数据的应用程序需要调用另一个端点,因此为了避免太多请求,我想将这些请求放入 Azure 服务总线队列中,但据我所知,这是 updating/inserting 数据的好方法,但是当涉及到读取数据时,我很难理解如何 return 处理数据到前面 (UI) 一次正在处理中。

我想到当前台请求数据时,我将其放入队列,return 消息 ID 放在前台,然后在队列中我将使用 Azure Function 调用我的服务端点,这将获得数据并作为 json 有效载荷插入到我的数据库中。

请求完成后,我会将请求状态更改为已完成,前端将每 5-10 秒拉取一次以检查消息状态,或使用 SignalR 进行实时检查。

有没有比我上面提到的更好的解决方案? 我认为它太复杂,数据冗余可能是个问题。

提前致谢!

我正在尝试为大量获取请求创建队列

Web 请求本质上是同步操作。持久消息传递是异步的。将两者混合需要弥合差距,这绝非易事。轮询并不理想,因为随着客户端数量的增加,它会对您的 Web 服务器造成负担。 SignalR 是回调需要知道结果的特定客户端的更好选择。

此解决方案的另一面是以我们更新或计算结果是最终结果而不是即时结果的方式构建客户端。

当发布者发送的消息多于接收者可以处理的消息并且您想要分离这两个实体以使接收者不会被请求淹没时,队列特别有用。如果您的目标是减慢到达您正在调用的另一个端点的请求数量,同时保持 API 的用户继续触发请求的可能性,那么您描述的过程是处理这种情况的标准方法。这是一个示例说明: 假设您的 API 允许用户 post 作业,您创建一个 UUID 并将其发送回 user/GUI 并将消息排队到 Azure 服务总线中。如果您想强制执行 FIFO 处理,请确保 use sessions. On the receiver end you add an Azure Function with a service bus trigger which calls your other endpoint (you can control the maximum number of instances your Azure Function can scale to by setting WEBSITE_MAX_DYNAMIC_APPLICATION_SCALE_OUT 以避免压倒您的其他端点)。如果另一个终结点处理了请求并做出响应,则将结果存储在您选择的数据库中,并将 Azure 服务总线中的消息标记为完成。如果您使用 CosmosDB,则可以使用更改源功能来侦听新条目并将它们发送到维护与用户的打开连接的 WebSocket 服务器。请记住,WebSocket 连接可能会意外关闭,因此最好为用户提供一个 URI,以便在他们 post 完成作业后查找结果。