如何使用带 Node.js 的 azure 服务总线收听队列?
How to listen to a queue using azure service-bus with Node.js?
背景
我有几个客户端向 Azure 服务总线队列发送消息。为了匹配它,我需要几台机器从该队列中读取消息并在消息到达时使用 Node.js.
研究
我已阅读 azure service bus queues tutorial,我知道我可以使用 receiveQueueMessage
从队列中读取消息。
但是,教程没有提到如何监听队列并在消息到达时立即读取消息。
我知道我可以简单地轮询队列以获取消息,但这会向服务器发送垃圾邮件请求,没有任何实际好处。
在 SO 中搜索后,我发现有人有类似问题的讨论:
而且我知道他们最终使用了 C# 异步方法 ReceiveAsync
,但我不清楚是否:
- 该方法适用于 Node.js
- 如果该方法在消息到达时立即从队列中读取消息,就像我需要的那样。
问题
Node.js 的文档几乎不存在,该教程是我找到的唯一主要文档。
问题
- 我的工作人员如何收到 azure 总线服务队列中传入消息的通知?
回答
根据 Azure 支持,不可能在队列收到消息时收到通知。这对每种语言都有效。
解决方法
此问题有 2 个主要解决方法:
使用 Azure 主题和订阅。通过这种方式,您可以让所有客户端订阅一个事件 new-message
,并让他们在收到通知后检查队列。但这有几个问题:首先你必须支付另一项 Azure 服务,其次你可能有多个客户端试图阅读同一条消息。
连续轮询。让客户端每 X 秒检查一次队列。这个解决方案很糟糕,因为你最终要为你产生的网络流量付费,并用无用的请求向服务发送垃圾邮件。为了帮助最大限度地减少这种情况,有一个名为 long polling 的概念,它 记录得很差,它可能不存在 。不过我确实找到了这个 NPM 模块:https://www.npmjs.com/package/azure-awesome-queue
备选方案
老实说,此时您可能想知道为什么要使用此服务。 我同意...
作为替代方案,RabbitMQ 是免费的,具有社区、良好的文档和更多功能。
缺点是维护 RabbitMQ 容错集群并非易事。
另一种选择是Apache Kafka,它也很可靠。
我问过 myslef 同样的问题,这是我找到的。
使用 Google PubSub,它可以满足您的需求。
如果你想继续使用 Azure,以下是可能的:
- 可以通过 SBS 消息触发云功能
- 使用该云函数触发事件中心事件
- 接收事件并从 SBS 获取消息
您可以使用无服务器函数 "ServiceBusQueueTrigger",
一旦消息到达队列,它们就会被调用,
它在 nodejs 中非常直接,您需要在 function.json 中定义的绑定,其类型为
"type": "serviceBusTrigger",
这篇文章 (https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-service-bus#trigger---javascript-example) 可能会提供更多详细信息。
背景
我有几个客户端向 Azure 服务总线队列发送消息。为了匹配它,我需要几台机器从该队列中读取消息并在消息到达时使用 Node.js.
研究
我已阅读 azure service bus queues tutorial,我知道我可以使用 receiveQueueMessage
从队列中读取消息。
但是,教程没有提到如何监听队列并在消息到达时立即读取消息。
我知道我可以简单地轮询队列以获取消息,但这会向服务器发送垃圾邮件请求,没有任何实际好处。
在 SO 中搜索后,我发现有人有类似问题的讨论:
而且我知道他们最终使用了 C# 异步方法 ReceiveAsync
,但我不清楚是否:
- 该方法适用于 Node.js
- 如果该方法在消息到达时立即从队列中读取消息,就像我需要的那样。
问题
Node.js 的文档几乎不存在,该教程是我找到的唯一主要文档。
问题
- 我的工作人员如何收到 azure 总线服务队列中传入消息的通知?
回答
根据 Azure 支持,不可能在队列收到消息时收到通知。这对每种语言都有效。
解决方法
此问题有 2 个主要解决方法:
使用 Azure 主题和订阅。通过这种方式,您可以让所有客户端订阅一个事件
new-message
,并让他们在收到通知后检查队列。但这有几个问题:首先你必须支付另一项 Azure 服务,其次你可能有多个客户端试图阅读同一条消息。连续轮询。让客户端每 X 秒检查一次队列。这个解决方案很糟糕,因为你最终要为你产生的网络流量付费,并用无用的请求向服务发送垃圾邮件。为了帮助最大限度地减少这种情况,有一个名为 long polling 的概念,它 记录得很差,它可能不存在 。不过我确实找到了这个 NPM 模块:https://www.npmjs.com/package/azure-awesome-queue
备选方案
老实说,此时您可能想知道为什么要使用此服务。 我同意...
作为替代方案,RabbitMQ 是免费的,具有社区、良好的文档和更多功能。
缺点是维护 RabbitMQ 容错集群并非易事。
另一种选择是Apache Kafka,它也很可靠。
我问过 myslef 同样的问题,这是我找到的。
使用 Google PubSub,它可以满足您的需求。
如果你想继续使用 Azure,以下是可能的:
- 可以通过 SBS 消息触发云功能
- 使用该云函数触发事件中心事件
- 接收事件并从 SBS 获取消息
您可以使用无服务器函数 "ServiceBusQueueTrigger", 一旦消息到达队列,它们就会被调用,
它在 nodejs 中非常直接,您需要在 function.json 中定义的绑定,其类型为
"type": "serviceBusTrigger",
这篇文章 (https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-service-bus#trigger---javascript-example) 可能会提供更多详细信息。