Use dynamic pool of map instances to reduce waiting times (issue #3)
This commit is contained in:
parent
4f9b8c1a1b
commit
dc096012ef
2 changed files with 76 additions and 78 deletions
|
@ -12,11 +12,11 @@
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"async": "1.5.2",
|
"async": "1.5.2",
|
||||||
"async-lock": "0.3.8",
|
"advanced-pool": "0.3.1",
|
||||||
"clone": "1.0.2",
|
"clone": "1.0.2",
|
||||||
"cors": "2.7.1",
|
"cors": "2.7.1",
|
||||||
"express": "4.13.4",
|
"express": "4.13.4",
|
||||||
"mapbox-gl-native": "3.0.2-earcut",
|
"mapbox-gl-native": "3.0.2",
|
||||||
"mbtiles": "0.8.2",
|
"mbtiles": "0.8.2",
|
||||||
"morgan": "1.7.0",
|
"morgan": "1.7.0",
|
||||||
"nomnom": "1.8.1",
|
"nomnom": "1.8.1",
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
var async = require('async'),
|
var async = require('async'),
|
||||||
asyncLock = require('async-lock'),
|
advancedPool = require('advanced-pool'),
|
||||||
crypto = require('crypto'),
|
crypto = require('crypto'),
|
||||||
fs = require('fs'),
|
fs = require('fs'),
|
||||||
path = require('path'),
|
path = require('path'),
|
||||||
|
@ -32,8 +32,6 @@ mbgl.on('message', function(e) {
|
||||||
});
|
});
|
||||||
|
|
||||||
module.exports = function(maps, options, prefix) {
|
module.exports = function(maps, options, prefix) {
|
||||||
var lock = new asyncLock();
|
|
||||||
|
|
||||||
var app = express().disable('x-powered-by'),
|
var app = express().disable('x-powered-by'),
|
||||||
domains = options.domains,
|
domains = options.domains,
|
||||||
tilePath = '/{z}/{x}/{y}.{format}';
|
tilePath = '/{z}/{x}/{y}.{format}';
|
||||||
|
@ -46,9 +44,11 @@ module.exports = function(maps, options, prefix) {
|
||||||
sources: {},
|
sources: {},
|
||||||
tileJSON: {}
|
tileJSON: {}
|
||||||
};
|
};
|
||||||
if (!maps[prefix]) {
|
|
||||||
var createRenderer = function(ratio) {
|
var styleJSON;
|
||||||
return new mbgl.Map({
|
var createPool = function(ratio, min, max) {
|
||||||
|
var createRenderer = function(ratio, createCallback) {
|
||||||
|
var renderer = new mbgl.Map({
|
||||||
ratio: ratio,
|
ratio: ratio,
|
||||||
request: function(req, callback) {
|
request: function(req, callback) {
|
||||||
var protocol = req.url.split(':')[0];
|
var protocol = req.url.split(':')[0];
|
||||||
|
@ -115,12 +115,20 @@ module.exports = function(maps, options, prefix) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
renderer.load(styleJSON);
|
||||||
|
createCallback(null, renderer);
|
||||||
|
};
|
||||||
|
return new advancedPool.Pool({
|
||||||
|
min: min,
|
||||||
|
max: max,
|
||||||
|
create: createRenderer.bind(null, ratio),
|
||||||
|
destroy: function(renderer) {
|
||||||
|
renderer.release();
|
||||||
|
}
|
||||||
|
});
|
||||||
};
|
};
|
||||||
map.renderers[1] = createRenderer(1);
|
|
||||||
map.renderers[2] = createRenderer(2);
|
|
||||||
map.renderers[3] = createRenderer(3);
|
|
||||||
|
|
||||||
var styleJSON = require(path.join(rootPath, styleUrl));
|
styleJSON = require(path.join(rootPath, styleUrl));
|
||||||
|
|
||||||
map.tileJSON = {
|
map.tileJSON = {
|
||||||
'tilejson': '2.0.0',
|
'tilejson': '2.0.0',
|
||||||
|
@ -160,15 +168,13 @@ module.exports = function(maps, options, prefix) {
|
||||||
});
|
});
|
||||||
|
|
||||||
async.parallel(queue, function(err, results) {
|
async.parallel(queue, function(err, results) {
|
||||||
map.renderers.forEach(function(renderer) {
|
// TODO: make pool sizes configurable
|
||||||
renderer.load(styleJSON);
|
map.renderers[1] = createPool(1, 2, 8);
|
||||||
});
|
map.renderers[2] = createPool(2, 2, 4);
|
||||||
|
map.renderers[3] = createPool(3, 2, 4);
|
||||||
});
|
});
|
||||||
|
|
||||||
maps[prefix] = map;
|
maps[prefix] = map;
|
||||||
} else {
|
|
||||||
map = maps[prefix];
|
|
||||||
}
|
|
||||||
|
|
||||||
var tilePattern = tilePath
|
var tilePattern = tilePath
|
||||||
.replace(/\.(?!.*\.)/, ':scale(' + SCALE_PATTERN + ')?.')
|
.replace(/\.(?!.*\.)/, ':scale(' + SCALE_PATTERN + ')?.')
|
||||||
|
@ -186,17 +192,10 @@ module.exports = function(maps, options, prefix) {
|
||||||
return res.status(404).send('Invalid format');
|
return res.status(404).send('Invalid format');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var pool = map.renderers[scale];
|
||||||
|
pool.acquire(function(err, renderer) {
|
||||||
var mbglZ = Math.max(0, z - 1);
|
var mbglZ = Math.max(0, z - 1);
|
||||||
var renderer = map.renderers[scale];
|
|
||||||
var params = {
|
var params = {
|
||||||
/*
|
|
||||||
debug: {
|
|
||||||
tileBorders: true,
|
|
||||||
parseStatus: true,
|
|
||||||
timestamps: true,
|
|
||||||
collision: true
|
|
||||||
},
|
|
||||||
*/
|
|
||||||
zoom: mbglZ,
|
zoom: mbglZ,
|
||||||
center: [lon, lat],
|
center: [lon, lat],
|
||||||
width: width,
|
width: width,
|
||||||
|
@ -206,9 +205,8 @@ module.exports = function(maps, options, prefix) {
|
||||||
params.width *= 2;
|
params.width *= 2;
|
||||||
params.height *= 2;
|
params.height *= 2;
|
||||||
}
|
}
|
||||||
lock.acquire(renderer, function(done) {
|
|
||||||
renderer.render(params, function(err, data) {
|
renderer.render(params, function(err, data) {
|
||||||
done();
|
pool.release(renderer);
|
||||||
if (err) console.log(err);
|
if (err) console.log(err);
|
||||||
|
|
||||||
var image = sharp(data, {
|
var image = sharp(data, {
|
||||||
|
|
Loading…
Reference in a new issue