我们有一个自定义Chrome扩展程序,可执行一系列与Web相关的任务。任务必须是独占的,因此我们继续在运行chrome的单个docker容器上运行每个任务的概念
我们目前有4个运行ubuntu的ec2实例(c4.2xlarge),然后在docker容器中运行chrome。
我们还有一个更小的ec2实例,它从mongodb读取任务并将它们分配给一个接一个地填充它们的服务器。因此,如果添加了任务,则会将其分配给其中一个实例,然后将其选中,创建容器执行任务然后销毁容器。这些任务中的每一项大约需要2至6分钟才能完成。我们正在使用dockerode在nodejs中动态创建和销毁容器。
我们执行了很多基准测试并得出结论,每个服务器最多可以运行55个任务,因此我们在给定时间为每个服务器设置了最多45个任务的阈值,以便更安全。
这是在所有4个实例上运行的代码的一部分
function start_polling_mongo() {
Tasks.find({
server_id: instance_id,
task_status: 1
}, function(err, all_tasks) {
//update the tasks
Tasks.update({
_id: {
"$in": all_tasks
}
}, {
task_status: 2
}, {
multi: true
}, function(err) {
//perform the tasks
all_tasks.forEach(function(task) {
setTimeout(function() {
run_task_in_container(task.task_id);
}, 1000);
});
});
});
setTimeout(start_polling_mongo, 5000);
}
function run_task_in_container(task_id) {
console.log('Running Task id : ' + task_id);
var commands = '';
commands += 'Xvfb :99 & ';
commands += 'export DISPLAY=:99 & ';
commands += 'x11vnc -rfbport ' + task_id + ' -display :99 -bg -q & ';
commands += 'google-chrome --no-first-run --load-extension=/home/chrome_extension http://www.example.com/search?q=perform_task-' + task_id;
var exposed_ports = {};
exposed_ports[task_id + '/tcp'] = {};
var port_bindings = {};
port_bindings[task_id + '/tcp'] = [{
HostPort: task_id.toString()
}]
docker.createContainer({
Image: 'docker-chrome-final',
ExposedPorts: exposed_ports,
Cmd: ['bash', '-c', commands],
Labels: {
"task_id": task_id.toString()
}
}, function(err, container) {
if (err) {
console.log('error1 :');
console.log(err);
return;
}
container.start({
Privileged: true,
PortBindings: port_bindings
}, function(err, data) {
if (err) {
console.log('error2 :');
console.log(err);
return;
}
});
});
}
问题在于,一批150到180个任务都有随机容器被创建和启动但是chrome没有在同一个上运行(通常每个服务器上有2-3个容器)。我确认通过成功VNC进入服务器以呈现空白屏幕(XVFB)。
非常感谢任何输入!