百万级别聊天室,服务端channel是如何存放的 ???
channel不可以存储到Redis,它的底层是操作系统文件描述符,还会设计到TCP的链路。
是channel的坐标,机器IP和端口,以及channel双向绑定的session id
public class SessionCache implements Serializable {
private String userId;
private String sessionId;
private ImNode node;
}
这个Session就是存放在redis中的数据。
当然了,用户可能不止一个通道,
public class UserCache {
private String userId;
// session id
private Map<String, SessionCache> map = new LinkedHashMap<String, SessionCache>(10);
}
public interface SessionCacheDAO {
void save(SessionCache s);
SessionCache get(String sessionId);
void remove(String sessionId);
}
public interface UserCacheDAO {
void save(UserCache u);
void remove(String userId, String sessionId);
void addSession(String userId, SessionCache s);
UserCache get(String userId);
}
- 创建本地Session
- 创建SessionCache (sessionId, node)
- 创建UserCache (userId, sessionCache)
几乎和上面👆创建Session相关 :
- 删除UserCache中的SessionCache: removeSession(userId, sessionId)
- 删除Redis中的SessionCache: remove(sessionId)
- 删除本地Session: clear(sessionId)
- 根据用户id,找到所有服务器上的该用户的会话列表
- 为每一个会话转发消息
如果是千万级别,服务端的Channel存储应该做什么优化呢?