过滤容易,CC防御计数特别难-墨者安全-墨者盾
DDOS防御_CC防护_高防CDN服务器_【墨者安全】—墨者盾墨者盾—你的网站贴身保镖!
QQ:800185041
高防免费接入:400-0797-119

渠道合作:156 2527 6999

主页 > 行业资讯 > 过滤容易,CC防御计数特别难

过滤容易,CC防御计数特别难

小墨安全管家 2020-11-23 02:51 行业资讯 89 ℃
DDoS防御
几个月前,我们在我们的安全评级门户网站的核心添加了一具新功能:用户不仅能够过滤其投资组合中的公司,还能够实时查看有多少"过滤"公司符合其选定的筛选标准。在实践中,这允许用户快速地看到,例如,在技术或金融行业中的所有供应商,在英国或德国使用IP脚迹作为服务提供者使用亚马逊或谷歌。获得这些过滤器计数最好分两步完成。首先,你过滤;接着,你计数。正如这篇文章的标题所透露的那么:过滤特别容易;计数(在一具线程上,你还担心怎么呈现网页)要艰难得多,尤其是从性能的角度来看。在差不多的过滤器计数算法就位之后,我们最后来不得不将计数部分托付给Web工作者,以确保我们的页面保持性能。这使得我们可以在代码复杂性和性能之间取得平衡,用户能够过滤他们的投资组合,同时页面在更新计数时保持交互。我们尝试在对集合中的元素举行计数的并且并且对其举行筛选,但我们意识到,尽管可行,但该过程会增加代码的整体复杂性。过滤是一具相对简单的过程,其时刻复杂度为O(n),而随着给定类别中单个字段的大概值数量的增加,计数步骤将大大增加。经过将过程分成两个部分,我们能够将更复杂的计数步骤与过滤步骤隔离开来,CC防御,这使得我们能够在挑选过滤器选项时即将更新UI,接着惰性地更新计数过滤特别简单。。。我们探究了几种不同的想法来解决咨询题的过滤部分;最初我们简单地使用了lodash过滤函数,它也许在一定程度上起到了作用。可是,我们特别快发觉,这种想法关于我们的用例来讲并不是最佳的,因为我们没有像我们想要的那么操纵过滤过程。所以,我们创建了自个儿的过滤器有用程序。其工作原理如下:从共享相同差不多结构的对象集合开始。传入一具filterConfig对象数组,这些对象描述我们希翼过滤器函数怎么处理对象中的每个键。经过基于以下三个参数为对象中的每个字段创建单独的谓词函数来组成谓词函数:差不多对象的字段类型(数组、字符串或数字)、作为我们要搜索的对象类型的原型的filterObject和我们的filterConfig数组。我们经过检查数组中的第一具对象来获得字段的类型;假如它是一具数组,我们会检查数组中第一具元素的类型,并向来如此做,直到找到一具数字或字符串。对传递给(1)中函数的对象集合调用Array#filter,其余的由Javascript处理。例如,假设我们正在筛选BitSight投资组合中的一组公司:公司const companies=[{name:'BitSight',行业:'Technology',country:['US','UK','DE'],提供商:['AWS']},{name:'Saperix',行业:'Finance',国家:['US','DE'],提供商:['AWS','Google','MS']},{name:'Acme Education',行业:'Education',国家:['UK','FR',提供商:['MS','Google']},{名称:'Goliath mafg',行业:'Manufacturing',country:['DE','US','UK'],提供商:['AWS']},]; 我们的filterConfig对象看起来像:过滤器配置const filterConfig=[{name:'Industry',key:'Industry',hidden:false},{name:'Country',key:'Country',hidden:false},{name:'Service Provider',key:'Provider',hidden:false},] 作为一具精明的读者,您大概会注意到,我们实际上只关怀每个filterConfig条目中的key字段——当我们向最后来用户显示这些条目时,其他字段由render函数使用。一旦我们有了对象集合和filterConfig,我们只需要生成一具filterObject,它是我们感兴趣的对象的原型。在BitSight的公文包页面上,这是经过用户界面(UI)来实现的,但也能够经过URL或其他想法的查询参数轻松完成。在我们的示例中,filter对象如下所示:过滤器对象const filterObject={行业:['Technology','Education'],国家:['DE','UK',提供商:['AWS','Google',}; 简单地讲,用户希翼在德国或英国拥有IP脚迹的技术或教育行业的公司使用AWS或Google作为服务提供商。为了将其转换为扫瞄器能够使用的内容(并在合理的时刻内运行过滤器),我们为filterObject的每个成员生成一具谓词,接着将所有这些单独的谓词组合成一具更大的谓词,接着我们能够将集合中的每个项传递给它;假如每个独立谓词为真,则组合谓词为真,同时项经过筛选器。所以,就我们公司的收款而言,CC防御,我们发觉自个儿只剩下:过滤公司const filteredCompanies=[{行业:'Technology',country:['US','UK','DE'],提供商:['AWS']},{行业:'Education',国家:['UK','FR'],提供商:['MS','Google']},];……数数特别难上面描述的过滤实现起来相对简单;以一种高效的方式获得我们的过滤器计数被证明是更艰难的。我们猎取计数的初始原始解决方案是简单地迭代每个对象上的每个键,并计算给定项在给定键下浮上的次数:计数器-天真.jsconst count=(items)=>{const result={}项目.forEach((item)=>{//遍历(item中const key in item)的所有项{//假如(!数组.isArray(item[key]){item[key]=[item[key]];//将任何字符串强制转换为数组}item[key].forEach((singleFilterValue)=>{result[key][singleFilterValue]=(result[key][singleFilterValue]?result[key][singleFilterValue]+1:1);});}}});返回result;}; 这种想法的咨询题是速度慢,而且由于所有的计数基本上在我们客户的扫瞄器中计算的,所以这种缓慢的副作用是阻挠公文包页面的呈现和交互。我们所做的第一具优化是重写count函数,以便一次只对单个类别举行计数。(由于用户一次只点击一具过滤器选项,我们只需要重新计算单个类别的计数。)当我们最初从服务器猎取数据时,我们也将所有内容转换为一具数组,这使得我们能够摆脱显式转换。计数器-优化.jsconstcount=(items,category)=>{//创建一具对象来保存我们的结果。const result={}项目.forEach((item)=>{//假如(item[category]){//遍历给定类别中的所有项(例如,['DE'、'UK'、'US']表示国家,或['Google'、'AWS'、'MS']表示提供者,则检查给定对象是否实际具有我们正在计数的类别。item[category].forEach((singleFilterValue)=>{//假如给定项基本作为键存在于结果中,则增加其值//否则将其值设置为1。result[singleFilterValue]=结果[singleFilterValue]?result[singleFilterValue]+1:1;});}});返回result;}; 那个解决方案运行得特别好,然而关于每个对象有大量大概项目的过滤器类别(在服务提供商的事情下,这大概是250多个项目),它仍然花费了不可答应的长时刻,同时在公文包页面马上浮上时导致一些很讨厌的"jank"。这是因为Javascript的执行堵塞了扫瞄器中的关键呈现路径。我们尝试了几个不同的选项来"取消阻挠"关键渲染路径,例如使用async或defer足本属性。最后来,所有这些都被证明是不成功的,缘由特别简单:每当需要更新计数时,我们都会阻挠扫瞄器上的主线程来处理数以万计的项目。输入Web Worker我们没有然后对我们的count函数举行微优化,而是决定将咨询题从主线程中推出来,交给Web工作者处理。引用MDN:webworker是Web内容在后台线程中运行足本的一种简单想法。工作线程能够在不干扰用户界面的事情下执行任务。此外,它们能够使用XMLHttpRequest执行I/O(虽然responseXML和channel属性始终为null)。一旦创建,worker能够经过将消息发送到由该代码指定的事件处理程序(反之亦然),向创建它的Javascript代码发送消息在实践中,我们可以使用以下代码来实现我们的柜台工作人员:启动工作进程并为传入消息实例化处理程序。在消息公布时运行计数器代码。计数执行完成后,将结果返回到主线程。counter.worker.js//我们使用Webpack将其转换为单独的fileconst counter=require('counter-优化.js').default;//不要在那个地点使用=>语法,因为它会严峻破坏您的执行contextself.onmessage=函数onmessage(e){const counts=计数器(e.data[0],DDoS防御,DDoS防御,e.data[1]);postMessage(counts);}; 这段代码是在主线程上由代码治理的,该代码是用我们要计数的项的集合和类别的键调用的。假如这个特定键的工作线程基本在工作,我们终止它并启动一具新的工作线程——这是为了处理底层collecti的边缘事情

过滤容易,计数特别难


DDoS防御

当前位置:主页 > 行业资讯 > 过滤容易,CC防御计数特别难

标签列表
DDoS防御
网站分类
X
 

QQ客服

400-0797-119