我正在运行GPS监听程序。它从GPS设备接收数据,解码,准备最终数据对象,然后将数据存储在数据库中。 我试图使用以下代码从nodejs向mongodb插入文件 - (使用节点mongodb本机驱动程序)
var mong = require('mongodb');
var MongoClient = mongo.MongoClient
, format = require('util').format;
MongoClient.connect('mongodb://user:pass@a.b.c.d:27017/dbname', function(err, db) {
if(err) {console.log("mongo connect error " + err); throw err};
gpsdb = db;
console.log("Database Ready");
listener.listen(port);
console.log("Listener Started on: " + port);
});
// code to generate the object to insert - d_obj
var collection = gpsdb.collection(d_obj);
d_obj._id = new mong.ObjectID;
collection.insert(d_obj, {safe:true}, function(err, docs) {
if (err) { console.log("mongo insert query error " + err); return; }
console.log("Inserted 1 rec " + d_obj.imei);
console.dir(docs);
});
启动程序后,插入操作会持续2-3分钟。插入停止后。但是,控制台日志不断出现。
示例日志 -
Inserted 1 rec 358811020044291
[ { dt_server: '2014-12-12 05:56:14',
dt_tracker: '2014-12-12 05:56:09',
lat: 19.123456,
lng: 73.123456,
angle: 81,
speed: '47',
signal_gsm: 3,
signal_gps: 4,
alarm: 'pcut',
odo: 'y',
offset: 0,
time_stamp: 1418363774454,
ltime: '2014-12-12 05:56:09',
proto: 12,
imei: '123456789123456',
save_mysql: 'no',
altitude: 0,
_id: 548a837e4c73ebaef72d0073 } ]
只有在查询正确执行时才应执行console.dir(doc)。 我没有收到任何错误或警告。我正在为每个处理的数据对象调整此控制台日志。 但是插入不会在最初的几分钟后发生。
当我用一台设备发送数据测试程序时,它可以完美地工作几个小时。正确插入所有数据。 但是当我连接大约2000个设备运行它时,发生了无声失败。
我尝试从数据对象(d_obj)中删除具有null值的属性。这没有用。
我没有在任何地方定义任何架构或数据类型。
可能的原因
这似乎是异步插入的锁定问题。我在nodejs上的程序发送了许多并行插入。 当我正常运行程序时(以异步方式),以下是mongostat输出 -
connected to: 127.0.0.1
insert query update delete getmore command flushes mapped vsize res faults locked db idx miss % qr|qw ar|aw netIn netOut conn set repl time
138 *0 1 *0 43 28|0 0 496g 992g 10.8g 1 ilogistek:144.8% 0 4|0 0|1 93k 101k 40 rs0 PRI 00:15:12
143 *0 1 *0 70 73|0 0 496g 992g 10.8g 1 ilogistek:176.2% 0 6|0 0|1 106k 108k 40 rs0 PRI 00:15:13
125 *0 1 *0 60 60|0 0 496g 992g 10.9g 2 ilogistek:124.2% 0 5|0 0|1 94k 95k 40 rs0 PRI 00:15:14
181 *0 1 *0 77 96|0 0 496g 992g 11g 0 ilogistek:149.8% 0 6|0 0|1 135k 137k 40 rs0 PRI 00:15:15
91 *0 1 *0 47 45|0 0 496g 992g 11.1g 0 ilogistek:127.0% 0 6|0 0|1 68k 70k 40 rs0 PRI 00:15:16
211 *0 3 *0 74 94|0 0 496g 992g 11.2g 2 ilogistek:138.6% 0 6|0 0|1 152k 156k 40 rs0 PRI 00:15:18
250 *0 2 *0 71 86|0 0 496g 992g 11.2g 5 ilogistek:203.9% 0 10|0 0|1 174k 176k 40 rs0 PRI 00:15:19
270 *0 3 *0 76 111|0 0 496g 992g 10.9g 3 ilogistek:99.2% 0 5|0 0|1 197k 200k 40 rs0 PRI 00:15:20
137 *0 3 *0 54 48|0 0 496g 992g 10.9g 8 ilogistek:137.7% 0 5|0 0|1 97k 100k 40 rs0 PRI 00:15:21
203 *0 1 *0 83 114|0 0 496g 992g 11g 9 ilogistek:154.8% 0 4|0 0|1 153k 152k 40 rs0 PRI 00:15:22
另一方面,当我以同步方式强制写入时(下一次写入前一次写入的回调),锁定不会发生,每秒写入次数会增加很多次。
insert query update delete getmore command flushes mapped vsize res faults locked db idx miss % qr|qw ar|aw netIn netOut conn set repl time
1670 *0 1 *0 321 515|0 0 496g 992g 11.4g 0 ilogistek:15.7% 0 0|0 0|0 1m 1m 19 rs0 PRI 00:24:47
1830 *0 1 *0 344 621|0 0 496g 992g 11.4g 0 ilogistek:10.3% 0 0|0 0|0 1m 1m 19 rs0 PRI 00:24:48
1767 *0 1 *0 330 571|0 0 496g 992g 11.4g 1 ilogistek:14.5% 0 0|0 0|0 1m 1m 19 rs0 PRI 00:24:49
1726 *0 1 *0 337 599|0 0 496g 992g 11.4g 0 ilogistek:11.9% 0 0|0 0|0 1m 1m 19 rs0 PRI 00:24:50
1743 *0 1 *0 343 590|0 0 496g 992g 11.4g 0 ilogistek:10.9% 0 0|0 0|0 1m 1m 19 rs0 PRI 00:24:51
1758 *0 1 *0 336 605|0 0 496g 992g 11.4g 0 ilogistek:12.2% 0 0|0 0|0 1m 1m 19 rs0 PRI 00:24:52
1657 *0 1 *0 344 625|0 0 496g 992g 11.4g 0 ilogistek:9.9% 0 0|0 0|1 1m 1m 19 rs0 PRI 00:24:53
1688 *0 1 *0 342 567|0 0 496g 992g 11.4g 0 ilogistek:10.6% 0 0|0 0|0 1m 1m 19 rs0 PRI 00:24:54
1689 *0 1 *0 344 610|0 0 496g 992g 11.4g 0 ilogistek:10.1% 0 0|0 0|0 1m 1m 19 rs0 PRI 00:24:55
1780 *0 1 *0 340 596|0 0 496g 992g 11.4g 0 ilogistek:10.8% 0 0|0 0|0 1m 1m 19 rs0 PRI 00:24:56
我无法以同步的方式运行我的程序,因为这将超越此技术堆栈的目的。
有什么东西显而易见我错过了。
大师,请帮忙!