Как правильно отправить callback на socket.io в ответ на запрос пользователя?

Гуглил ответа не нашёл. Точнее нашёл что такая структура не правильная. Поэтому хочу узнать у специалистов как правильно организовать то что я хочу.

Система : nodejs , expressjs , socket.io , ejs , mysql , apache2

Задача. Нужно выдать рандомный приз пользователю.

Как это решено сейчас : через ajax.

Проблема . Сайт начинает тормозить при 250-300 онлайн пользователей одновременно. Некоторые страницы отрендеренные я храню в переменной но и это не сильно помогло. Раньше тормозил при 150 онлайн. Также кэш отдаёт cloudflare что тоже сильно спасает.

Как я хочу разгрузить сайт. Бонус вынести в js и подключаться им уже к главному socket Как у меня получилось это сделать.

У пользователя

//Запрос на получение
socket.emit('bunus' , 'start');
//Ждём результат
socket.on( 'result' , (data) => {
       console.log(data);
});

На сервере

//Запрос пользователя
socket.on('bunus', function ( data ) {
  let r = {};
       r.data = data;  
             //socket.id для ответа именно этому пользователю
       r.user = socket.id;
             //id пользователя для проверки авторизован или нет
       r.user_id = socket.handshake.session.userId; 
  io.emit( 'new_bunus' , r );
});
// Ответ от бонус js
socket.on('new_result', function ( data ) {
  io.to(data.user).emit( 'result', data); 
});

Бонус js

const socket = io.connect(config.connection_type + '://localhost:' + config.PORT , {
    secure: true,
    reconnect: true,
    rejectUnauthorized: false
});
socket.on('connect', function() {
  console.log('connect Успешно подключились к SocketIO! bonus.js : '+process.pid);
});
//Ждём запрос на выдачу бонуса
socket.on('new_bunus' , function ( data ) {
    data.bonus = "рандомный бонус";
    socket.emit('new_result', data );
});

Вот так работает. Но по мне это громадная конструкция. В socket.io есть callback и хотелось бы написать через него. Как я хочу что бы было.

У пользователя

//Запрос на получение
socket.emit('bunus' , 'start'  , (data)=>{
    console.log(data);
});

На сервере

//Запрос пользователя
socket.on('bunus', function ( data , cb) {
  let r = {};
       r.data = data;  
             //id пользователя для проверки авторизован или нет
       r.user_id = socket.handshake.session.userId; 
  io.emit( 'new_bunus' , r  ,  (result)=>{
              cb(result);
        });
});

Бонус js

const socket = io.connect(config.connection_type + '://localhost:' + config.PORT , {
    secure: true,
    reconnect: true,
    rejectUnauthorized: false
});
socket.on('connect', function() {
  console.log('connect Успешно подключились к SocketIO! bonus.js : '+process.pid);
});
//Ждём запрос на выдачу бонуса
socket.on('new_bunus' , function ( data , cb) {
    data.bonus = "рандомный бонус";
    cb(data);
});

Вроде всё логично. Но получаю ошибку "Callbacks are not supported when broadcasting"


Ответы (0 шт):