【发布时间】:2021-02-08 17:41:42
【问题描述】:
我正在使用提供酒店信息的第三方 API;它提供的选项之一是在有人进行预订时发出 websocket 通知,因此通过创建客户端并接收广播消息,我知道何时访问 API 的端点并获取有关预订的所有信息。现在我只想将消息写入队列。我使用 'ws' 库编写了一个简单的 node.js Web 应用程序,它接收 websocket 消息并将它们写入 Azure 存储队列:
// Import the libraries I need for websockets, Azure storage queues and some config files
const env = require('dotenv').config();
const WebSocket = require('ws');
const config = require('./config');
const { QueueClient } = require('@azure/storage-queue');
var queueName, createQueueResponse, fullUrl, sendMessageResponse;
let connectionString = process.env.AZURE_STORAGE_CONNECTION_STRING;
// Get wss://clientsite URL and query string parameters from a config file
const { url: { site, myToken, hotelToken } } = config;
// Create a name for the queue.
queueName = process.env.HOTEL_ID;
// Instantiate a QueueClient which will be used to create and manipulate a queue
var queueClient = new QueueClient(connectionString, queueName);
// Create the queue
(async () => {
createQueueResponse = await queueClient.createIfNotExists();
if (createQueueResponse.requestId) {
console.log("Queue created, requestId =", createQueueResponse.requestId);
}
else {
console.log("Queue not created");
}
})();
//Create the websocket
fullUrl = `${site}?ClientToken=${myToken}&AccessToken=${hotelToken}`;
var ws = new WebSocket(fullUrl);
//Write the received messages to the queue
ws.on('message', async function incoming(data) {
if (data) {
sendMessageResponse = await queueClient.sendMessage(data);
console.log("Messages added, requestId:", sendMessageResponse.requestId);
}
});
ws.on('error', function error(error) {
console.log("Error: " + error.message);
});
但我希望能够监听来自可能数百个 websocket 的消息,并跟踪哪个源是哪个,可能通过将每个 websocket 链接到不同的队列。但是,当我通过迭代 websocket URL 列表来尝试此操作时,为每个 URL 创建一个队列,它们最终都使用我创建的最终队列。
将 websocket 客户端绑定到队列的正确方法是什么?我已经研究过使用 SignalR,但所有示例都是关于如何创建聊天室的!
【问题讨论】:
标签: node.js websocket azure-web-app-service message-queue