Почему Microsoft bot Framework не масштабируется?

#node.js #botframework

#node.js #botframework

Вопрос:

После кластеризации он работает не так, как ожидалось, и снова и снова спрашивает мое имя.

Я что-то упускаю?

Вот мой код для Microsoft bot Framework.

server.js

 var worker = require('./worker');
var cluster = require('cluster');


var spawnWorker = function() {
  worker.createServer();
};

var createCluster = function() {
  if(cluster.isMaster) {
    var cpus = require('os').cpus().length;
    for(var i = 0; i < cpus; i  ) {
      cluster.fork();
    }
    cluster.on('online', function(wkr) {
      console.log('Worker started', wkr.process.pid);
    });
    cluster.on('exit', function(wkr) {
      console.log('Worker died, respawing', wkr.process.pid);
      cluster.fork();
    });
  } else {
    spawnWorker();
  }
};

createCluster();
  

worker.js

 exports.createServer = function(){
    var builder = require('botbuilder');
    var connector = new builder.ConsoleConnector().listen();
    var bot = new builder.UniversalBot(connector);
    bot.dialog('/', [
        function (session) {
            builder.Prompts.text(session, process.pid ': Hi! What is your name?');
        },
        function (session, results) {
            session.send(process.pid ':Hello %s!', results.response);
        }
    ]);
}
  

Вывод

 $ node server.js 

Worker started 8540
Worker started 8068
Worker started 6020
Worker started 4244

8540: Hi! What is your name?
abc
8068: Hi! What is your name?
prq
6020: Hi! What is your name?
lmn
4244: Hi! What is your name?
xyz
  

Больше информации здесь
введите описание изображения здесь

Ответ №1:

Вы используете ConsoleConnector в своем Worker.js файл, в котором хранятся все состояния отслеживания разговоров ботов в памяти. Это означает, что у каждого узла есть отдельная копия состояния диалога, которая не будет работать в многоузловой архитектуре. Вам нужно либо использовать ChatConnector, который использует BotFramework для хранения состояния разговора в одном центральном месте для вашего бота, либо вам придется передать пользовательскую реализацию IBotStorage вашему UniversalBot. Эта реализация могла бы использовать кэш redis или что-то еще для централизации всего.