node-maxmind 用于使用 IP 地址流式传输数据

node-maxmind usage for streaming data with IP address

我有带 IP 地址的流数据。我想在将数据放入我的数据库之前将 IP 转换为经度和纬度。

这就是我所做的,但它导致了一些问题。我还尝试将 locationObject 放在 for 循环之外。奇怪的是,它占用了大量内存。我知道这是阻塞代码,但它应该很快。虽然我看到内存问题,因为数据对象不断来自流,每个数据对象都很大。

for (var i ==0; i < data.length; i++){
        if (data.client_ip !== null) {
            var locationLookup = maxmind.openSync('./GeoIP2-City.mmdb');
            var ip = data.client_ip;
            var maxmindObj = locationLookup.get(ip);
            locationObject.country = maxmindObj.country.names.en;
            locationObject.latitude = maxmindObj.location.latitude;
            locationObject.longitude = maxmindObj.location.longitude;
           }
}

再次尝试输入 maxmind.openSync('./GeoIP2-City.mmdb');外部 fr 循环导致内存大量增加。

另一个选项是使用非阻塞代码

maxmind.open('/path/to/GeoLite2-City.mmdb', (err, cityLookup) => {
  var city = cityLookup.get('66.6.44.4');
});

但我认为将其放入循环中并不是一个好主意。

我该如何处理?我每分钟都在获取数据对象

https://github.com/runk/node-maxmind

我不确定为什么你认为每次循环迭代读取数据库文件会很快("blocking code" 不等于 "fast code"),读取数据库要好得多文件一次然后循环 data.

maxmind.openSync()会把整个数据库读入内存,也就是README:

中提到的

Be careful with sync version! Since mmdb files are quite large (city database is about 100Mb) fs.readFileSync blocks whole process while it reads file into buffer.

如果您没有空闲内存,唯一的选择是异步打开文件。同样,不是在循环内,而是在循环外:

maxmind.open("./GeoIP2-City.mmdb", (err, locationLookup) => {
  for (var i = 0; i < data.length; i++) {
    if (data.client_ip !== null) {
      var ip = data.client_ip;
      var maxmindObj = locationLookup.get(ip);
      locationObject.country = maxmindObj.country.names.en;
      locationObject.latitude = maxmindObj.location.latitude;
      locationObject.longitude = maxmindObj.location.longitude;
    }
  }
});

我唯一担心的是随着时间的推移我多次调用这个函数。每次我的消费者从 kakfa 读取 jsonObject 时(每分钟发生一次)。有没有更好的方法来优化它。所以我每分钟都调用这个函数。我怎样才能更好地进一步优化这个

function processData(jsonObject) {
    maxmind.open('./GeoIP2-City.mmdb', function(err, locationLookup) {
        if (err) {
            logger.error('something went wrong on maxmind fetch', err);
        }
        for (var i = 0; i < jsonObject.length; i++) { ...}
})
}