Использовать setInverval для выполнения запросов GET к nodejs? - PullRequest
0 голосов
/ 30 апреля 2018

Я использую nodejs с express для чтения коллекции в mongodb для набора сообщений для отображения пользователю. Я читал о http2, но я не знаю, есть ли какие-либо существенные преимущества по сравнению с использованием setInterval на стороне клиента для получения обновленного списка сообщений. Я в основном делаю:

setInterval(()=>{ 
            this.props.getSession(session_id);
        }, 5000);

Принимает _id документа mongodb и отправляет его в GET-запросе к nodejs каждые 5 секунд. Это собирается вызвать серьезные проблемы в дикой природе. Я в основном боюсь, что это вызовет ужасные проблемы с производительностью в масштабе, но мне интересно, какие у меня есть альтернативы, кроме того, что выглядит как невероятно сложная реализация http2, которая может иметь много уязвимостей в безопасности.

Полагаю, я мог бы также перефразировать мой вопрос, так как это приведет к сбою моего сервера с небольшим числом пользователей, выполняющих этот код на определенной странице?

1 Ответ

0 голосов
/ 06 мая 2018

Хорошо, так что я нашел лучший способ справиться с этим, и не стоит слишком фокусироваться на том, как сообщения существуют в базе данных. В итоге я использовал библиотеку веб-сокетов с именем socket.io. Мне удалось создать уникальные «комнаты» для каждой группы, которая подключается к серверу при загрузке страницы. 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. Нет необходимости в управлении событиями из Мангуста, и он поддерживает синхронизацию базы данных с представлением пользователя в режиме реального времени.

...