node.js - 采用 RESTful 架构的长轮询(用户通知)

标签 node.js rest long-polling

我正在开发一个简单的 RESTful api(在 NodeJs 上)。我知道,放松意味着横向扩展会容易得多。不幸的是,我需要某种方式让客户几乎立即收到某些事件的通知。出于这个原因,我正在考虑进行长轮询。我的问题是这如何与多个服务器一起工作。例如,这是一个简化的用例:

Both servers A and B are behind a common load balancer.
User Alice posts a message on Bob's wall (PUT request on server A).
If Bob is online, he should be notified instantly (long-polling on server B).

服务器A如何向Bob发送通知,或者服务器B如何知道应该通知Bob?

最佳答案

首先,我不知道为什么您不在客户端和服务器上使用像 socket.io 这样的东西来处理您的通知 channel 。如果可用的话,这将使用 Web 套接字(比长轮询更有效),然后如果没有 Web 套接字,则回退到长轮询。

有多种方法可以处理通知可能未连接到发出通知的服务器的用户的问题:

连接的数据库

当用户连接时,他们会负载平衡到随机服务器,但他们最终连接到的服务器存储在中央数据库(例如可能是 Redis 存储)中,您的任何服务器都可以从中找出任何用户当前连接到的服务器。这使您能够查找任何用户当前连接到的服务器。每个处理用户连接的服务器只是在连接时将每个用户添加到数据库并引用其服务器 ID,并在用户断开连接时将其从数据库中删除。注意:由于这些信息不需要持久存储到磁盘,并且数据量很小,因此您可以选择一个擅长将大部分或全部信息保留在内存中的数据库。

哈希连接

根据用户的一些众所周知的特征(例如用户 ID),计算哈希值并创建可重复的算法以在服务器池中映射哈希值。这是一项可预见的任务。因此,当服务器想要通知 Bob 时,它们可以调用相同的函数来确定 Bob 已连接到哪个服务器。哈希算法可以自适应,这样如果今天您有三台服务器,则哈希用户将均匀分布在三台服务器中,如果明天您有四台服务器,则哈希用户将均匀分布在四台服务器中。

多连接

由于低事件 websocket 如今具有相当大的可扩展性,所有用户都可以连接到所有服务器,因此每个服务器都会有一个到用户的套接字连接。这是更简单的基础设施,但最终并不具有可扩展性。

关于node.js - 采用 RESTful 架构的长轮询(用户通知),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26430246/

相关文章:

node.js - nodejs的napi模块没有 self 注册

rest - jaxrs-api VS jsr311-api VS javax.ws.rs-api VS jersey-core VS jaxrs-ri

jquery - 多个AJAX请求相互延迟

java - JQuery + JAVA 中的长轮询?

node.js - MongoDB 和 Mongoose 的区别

node.js - 使用 pbkdf2 的 SALT 和 HASH

php - WooCommerce Rest API 返回 404 未找到

spring - 如何使用 Spring Boot 和 @FeignClient 发送 Bearer 授权 token

angularjs - 编写 AngularJS 轮询器

deployment - 如何使用多核、反向代理和 SSL 在云中部署 Node.js 以实现高可用性