簡體   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