为什么 Microsoft bot 框架不可扩展?
Why Microsoft bot framework is not scalable?
聚类后没有按预期工作,一遍又一遍地问我名字。
我是不是漏掉了什么?
这是我的微软机器人框架代码。
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
更多信息here
您正在 Worker.js 文件中使用 ConsoleConnector,该文件将所有机器人对话跟踪状态存储在内存中。这意味着每个节点都有一个单独的对话状态副本,这在多节点架构中是行不通的。您需要使用 ChatConnector,它使用 BotFramework 将对话状态存储在您的机器人的一个中心位置,或者您必须将自定义 IBotStorage 实现传递给您的 UniversalBot。该实现可以使用 redis 缓存或其他东西来集中所有内容。
聚类后没有按预期工作,一遍又一遍地问我名字。
我是不是漏掉了什么?
这是我的微软机器人框架代码。
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
更多信息here
您正在 Worker.js 文件中使用 ConsoleConnector,该文件将所有机器人对话跟踪状态存储在内存中。这意味着每个节点都有一个单独的对话状态副本,这在多节点架构中是行不通的。您需要使用 ChatConnector,它使用 BotFramework 将对话状态存储在您的机器人的一个中心位置,或者您必须将自定义 IBotStorage 实现传递给您的 UniversalBot。该实现可以使用 redis 缓存或其他东西来集中所有内容。