繁体   English   中英

如何使用带有 Node.js 的 azure service-bus 收听队列?

[英]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 ,但我不清楚是否:

  1. 该方法适用于 Node.js
  2. 如果该方法在消息到达后立即从队列中读取消息,就像我需要的那样。

问题

Node.js 的文档几乎不存在,该教程是我找到的唯一主要文档。

问题

  1. 如何通知我的工作人员 Azure 总线服务队列中的传入消息?

回答

根据 Azure 支持,当队列收到消息时无法收到通知。 这对每种语言都有效。

变通方法

此问题有 2 个主要解决方法:

  1. 使用 Azure 主题和订阅。 这样,您可以让所有客户端订阅事件new-message ,并让他们在收到通知后检查队列。 但是,这有几个问题:首先您必须为另一个 Azure 服务付费,其次您可以让多个客户端尝试读取相同的消息。

  2. 连续轮询。 让客户端每 X 秒检查一次队列。 这个解决方案很糟糕,因为你最终支付了你产生的网络流量,并且你用无用的请求向服务发送垃圾邮件。 为了帮助减少这种情况,有一个称为长轮询的概念,它的文档记录很差,它可能不存在 我确实找到了这个 NPM 模块: https ://www.npmjs.com/package/azure-awesome-queue

备择方案

老实说,此时您可能想知道为什么要使用此服务。 我同意...

作为替代方案, RabbitMQ是免费的,具有社区、良好的文档和更多功能。

这里的缺点是维护一个 RabbitMQ 容错集群并非易事。

另一种选择是Apache Kafka ,它也非常可靠。

我问了我同样的问题,这是我发现的。

使用 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 )可能会提供更详细的帮助。

您可以通过 subscribe 方法从服务总线队列接收消息,该方法侦听值流。 下面的 Azure 文档中的示例

const { delay, ServiceBusClient, ServiceBusMessage } = require("@azure/service-bus");

// connection string to your Service Bus namespace
const connectionString = "<CONNECTION STRING TO SERVICE BUS NAMESPACE>"

// name of the queue
const queueName = "<QUEUE NAME>"

 async function main() {
    // create a Service Bus client using the connection string to the Service Bus namespace
    const sbClient = new ServiceBusClient(connectionString);

    // createReceiver() can also be used to create a receiver for a subscription.
    const receiver = sbClient.createReceiver(queueName);

    // function to handle messages
    const myMessageHandler = async (messageReceived) => {
        console.log(`Received message: ${messageReceived.body}`);
    };

    // function to handle any errors
    const myErrorHandler = async (error) => {
        console.log(error);
    };

    // subscribe and specify the message and error handlers
    receiver.subscribe({
        processMessage: myMessageHandler,
        processError: myErrorHandler
    });

    // Waiting long enough before closing the sender to send messages
    await delay(20000);

    await receiver.close(); 
    await sbClient.close();
}    
// call the main function
main().catch((err) => {
    console.log("Error occurred: ", err);
    process.exit(1);
 });

来源: https ://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-nodejs-how-to-use-queues

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM