我正在使用带有express的nodejs来读取mongodb中的一个集合,以便向用户显示一组消息。我读过关于http2的内容,但我不知道在客户端使用setInterval接收更新的消息列表是否有任何明显的优势。我基本上是这样做的:
setInterval(()=>{
this.props.getSession(session_id);
}, 5000);
这将获取mongodb文档的_id,并每隔5秒在GET请求中将其发送到nodejs。这会在野外造成严重问题吗?我基本上害怕这会导致大规模的可怕性能问题,但我想知道除了看起来像一个令人难以置信的复杂http2实现可能有许多安全漏洞之外我还有什么替代品。
我想我也可以将我的问题改写为,这是否会导致我的服务器崩溃,少数用户在某个页面上运行此代码?
好的,所以我找到了解决这个问题的最佳方法,过分关注数据库中的消息存在是没有帮助的。我最终使用了一个名为socket.io的Web套接字库。我能够为页面加载时连接到服务器的每个组创建唯一的“房间”。消息会话的mongodb _id用于动态创建房间,如下所示:
io.on('connection', async function(socket){
socket.on('session' async (session)=>{
socket.join(session.session_id); //not shown: session join authentication
});
socket.on('send', async (d)=>{
try{
const {text} = d.body;
const {token, session} = d.head;
//custom function that is async to parse jwt token and do db.MessageSession.create({})
const result = await socketMeassageAuthAndSend(session, token, text);
const {flag, user, _id, date} = result;
if(flag === 'auth'){
socket.broadcast.to(session).emit('socket_message_broadcast', {text,user,_id,date})
}else{
socket.emit("unauthorized", {message: "will place ip address here to send to admin panel"});
}}catch(err){
console.log(err);
}
});
这适用于执行使用mongo数据库进行身份验证和授权的更新。不需要从mongoose开始事件驱动,它使数据库实时与用户的视图保持同步。