我们有不同的项目,其中一个是white label DSP solution。 我们的客户要求启用IP过滤所有传入流量。 他们向我们提供了包含 20.5亿记录的地址列表,它应该可以实时运行。
这些地址可以压缩到600万个范围。我们只有 10毫秒来进行此检查。
此任务应使用 NodeJS 。
实施您对如何完成此任务或哪种机制适合此任务有任何建议吗?
答案 0 :(得分:0)
将已排序的IP加载到这种结构中必须很容易。只需向下走过数十亿即可填写:
{
100: {
150: {
200: [250, 251],
205: [250]
}
},
105: {
110: {
115: [120]
},
115: {
150: [200]
}
}
}
然后只检查必须过滤的IP的每个八位字节的密钥存在
JavaScript优化整数字典并对它们使用二进制搜索
我不知道NodeJS中是否有无符号字节,或者你需要几十GB的内存。
答案 1 :(得分:0)
目前尚不清楚“所有传入流量”是什么意思。如果你正在过滤IP数据包而你需要一个可扩展的解决方案,我强烈建议不要这样做。有一些SDN硬件可以用来做他们想做的事情,但我想这不属于项目的范围。
无论如何,我会尝试回答你的问题(至少部分)并给你一些一般的提示(不是node.js特定的)。首先,有一些事情应该澄清,其中包括:
无论如何,您可以应用路由器在进行路由查找时所做的类似操作。您可以构建patricia trie(Radix tree)并在其中进行搜索(如果您认真对待,请查看this文章)。请记住,在路由世界中,10ms被认为是一生,因此即使是“慢速”CPU(1GHz以下)的基于软件的路由器也可能在10ms的时间范围内进行数百次IPv4查找。 hedgar2017为您提供了类似的示例,根据您拥有的资源量(以及流量),您可能不需要担心性能(如果您仅在建立用户会话时检查IP)。
如果你也在做IPv6(并且你至少应该做好计划),那么这种方法是类似的。我唯一要提的是,即使IPv6有128位,ISP也会为每个用户分配一个/ 48(或最差情况/ 64)前缀。您可以将树构建到/ 48并获得更快的查找速度。