【问题标题】:How to scale websocket clients with queues如何使用队列扩展 websocket 客户端
【发布时间】: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


    【解决方案1】:

    Azure Web 应用为每个 SKU 设置了服务限制,其中包括 websocket 和内存的数量上限。你可以看到他们here。即使标准层 SKU 具有无限的 Web 套接字,您也会在某个时刻遇到内存限制。您可以通过预置多个 Web 应用实例(标准层最多 10 个)来进一步扩展。

    在解决这个问题四年左右之后,我们扩展了自托管 websocket 并使用 SignalR 服务。您可以使用 SignalR 服务连接数十万个客户端。我强烈建议使用它来省去很多麻烦。

    【讨论】:

    • 谢谢 Rob,但是我如何使用 SignalR 作为 websocket 客户端,你能指出我的任何例子吗?我需要与使用 websockets 发布消息的第 3 方合作。这比我们是否使用 Azure 更重要。
    猜你喜欢
    • 2012-10-02
    • 1970-01-01
    • 2012-03-21
    • 1970-01-01
    • 1970-01-01
    • 2017-05-29
    • 2010-09-07
    • 2015-11-22
    • 1970-01-01
    相关资源
    最近更新 更多