javascript - 聊天室的可靠计时器

标签 javascript node.js redis socket.io

请帮忙选择一个聊天室计时器的解决方案(nodeJS + socket.io + redis)。

创建了多个房间,每个房间都有一个主机,即该房间的管理员,每个房间将有 500 名成员。在任何时间't'可以有'n'个房间。一个房间会在创建 1 小时后被销毁。

Node server => 从redis 处理room 的成员相关数据,并在一定时间间隔后在每个room 中广播。这个间隔(即何时广播)由一个数组决定,将其称为 timerArrayForRoom1。该数组保存广播数据的时间(以秒为单位)。每个房间的阵列都不同。

现在,两种方法 -

  1. 在 nodeJS 中使用 setInterval() 以便它会在一段时间间隔后调用其广播方法。每个房间都有其独立的间隔对象。

  2. timerArrayForRoom1 交给房间的主人,让主人在几秒后根据计时器数组触发一个事件。即在客户端使用 setinterval() 。 Node 服务器将对该事件采取行动。

第一种方法是 HOST 独立的,但它涉及在 NodeJS 中使用 setInterval()。

哪一个实现起来更好,以便服务器能够同时支持 1000 个房间(其中有 500 个成员)同时运行和广播?

哪个更靠谱? (正如我所读,setInterval() 不保证调用该函数的时间)

或者任何其他方法?

Host/admin 将使用不同的设备,并且每个房间都有一个设备,因此第二种方法将在一定程度上平衡服务器负载。

最佳答案

setInterval 从你的 Node 服务器是要走的路。你已经给出了一个很好的理由,它是独立于客户的。此外,虽然它可能无法保证其执行时间。它最接近准时执行。

除非您的服务器因 CPU 密集型执行而挂起,否则这应该相当准确。允许 HOST 或任何其他客户端发起事件也容易受到同样的缺点影响。

关于javascript - 聊天室的可靠计时器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19783569/

相关文章:

string - 二进制安全字符串和二进制不安全字符串有什么区别?

javascript - 如何在 AngularJS 的 HTML 中保留复杂的表达式?

javascript - 从云代码调用函数

node.js - 在 mongoose 中,model.save 是增量的原子还是我应该始终使用 $inc?

javascript - Node promise - TypeError 无法读取未定义的属性 .then

python - Redis 在与 Celery 组或链一起使用时失去连接 - 抛出错误/MainProcess] 与 Redis 的连接丢失 : Retry (0/20) now

javascript - 在 Promises 中使用循环的正确方法

javascript - html css 或 php gd 库两个图像合并 Angular 到 Angular

jquery - Socket.IO类型错误: Cannot read property 'broadcast' of undefined

'keys' 命令的 Redis 模式,返回除包含特定字符的键之外的所有内容