返回

智能清理:让你的 WebSocket 聊天室保持精简

后端

前言

WebSocket 多房间聊天室 系列的第二部分中,我们创建了一个多房间聊天室,允许用户加入和离开不同的房间并实时交换消息。然而,我们很快发现了一个问题:没有无人房间的自动清理机制,导致内存无限增加。

自动清理的必要性

随着时间的推移,未使用的房间会累积,消耗宝贵的内存资源。这可能导致聊天室性能下降,甚至服务器崩溃。因此,实现一种机制来自动清理无人房间至关重要。

实现自动清理

我们采用定期检查和清理的策略:

  1. 定期检查: 使用定时任务定期检查房间中的活动。
  2. 无人房间的识别: 如果一个房间在指定时间内没有活动,则将该房间标记为无人。
  3. 清理无人房间: 删除无人房间,释放与该房间关联的所有资源。

定时任务

我们创建一个定时任务,每 5 分钟运行一次。该任务将检查所有房间,识别无人房间,并将其清理掉。

const cleanUpInterval = 5 * 60 * 1000; // 5 分钟
setInterval(() => {
  // 检查所有房间
  for (const room of rooms) {
    // 检查房间的最后活动时间
    const lastActivity = room.getLastActivity();
    // 如果房间在指定时间内没有活动,则标记为无人
    if (Date.now() - lastActivity > inactivityThreshold) {
      room.markAsEmpty();
    }
  }

  // 清理无人房间
  for (const room of rooms) {
    if (room.isEmpty()) {
      room.cleanup();
    }
  }
}, cleanUpInterval);

标记无人房间

当一个房间被标记为无人时,它表示该房间不再有活动用户。我们通过更新房间的“最后活动时间”属性来实现这一点。

Room.prototype.markAsEmpty = function() {
  this.isEmpty = true;
};

清理无人房间

当一个房间被标记为无人时,我们将其从聊天室中删除,并释放与该房间关联的所有资源。

Room.prototype.cleanup = function() {
  // 从聊天室中删除房间
  delete rooms[this.id];

  // 释放所有资源
  this.sockets.forEach(socket => socket.leave(this.id));
  this.messages = [];
};

结论

通过实现自动清理无人房间的逻辑,我们有效地解决了 WebSocket 多房间聊天室的内存问题。定期检查和清理机制确保了聊天室始终精简高效,为用户提供流畅且可靠的聊天体验。