高效的动态URL限流实现

        访问限流对于一个网关来说是个比较重要的功能,它可以根据不同服务的处理能力来控制相关的访问量,从而保障服务更可靠地运行。但是URL控制的路径比较多还加上可动态添加删除,大量的访问匹配会很容易引起性能上的问题,接下来讲解一下Beetlex的网关是如何实现,并得到一个更好的处理性能。

        对于一个API服务来说它的接口非常多,当根据不同接口定义访问控制的时候每次请求都会匹配一下URL然后进行访问控制,当访问量比较大的时候这个字符匹配损耗是非常大的;解决这种问题可以对URL策略对象进行一个缓存,但缓存有一个延时性的问题,毕竟策略可以随意添加或删除,这时候当前URL的处理策略是否有效就存在一些延时问题了。接下介绍一下Beetlex的网关设计是怎样解决性能问题又能处理缓存的延时性问题。

        Beetlex在设计的时候引入了策略代理和版本问题,当网关接收到请求会拿到当前URL策略代理的缓存,然后再对比一下当前代理的版本和配置策略的版本是否一致,当一致的情况下直接用策略代理计数并判断处理,否则重匹配策略生成代理写入到缓存中。看上去有些复杂,实际代码非常简单

private void OnRefreshTable()
{lock (this){var items = (from a in mLimitTable.Valuesorderby a.Url.Length descendingselect a).ToArray();if (items == null){items = new UrlLimitRecord[0];}mUrlTables = items;System.Threading.Interlocked.Increment(ref mVersion);}
}public void AddUrl(string url, int maxrps)
{mLimitTable[url] = new UrlLimitRecord { Url = url, MaxRPS = maxrps };OnRefreshTable();
}public void RemoveUrl(string url)
{mLimitTable.TryRemove(url, out UrlLimitRecord result);OnRefreshTable();
}

在策略容器中添加一个版本号,当有修改的情况重新刷新匹配表和修改版本号。接下来在获取策略的时候做一下判断即可:

internal UrlLimitAgent Match(string url)
{if (mCachedLimitTable.TryGetValue(url, out UrlLimitAgent result)){if (result.Version == Version)return result;}var items = mUrlTables;result = new UrlLimitAgent();foreach (var item in items){if (url.IndexOf(item.Url, StringComparison.CurrentCultureIgnoreCase) >= 0){result.RpsLimit = new RpsLimit(item.MaxRPS);result.Config = item;}}result.Version = System.Threading.Interlocked.Add(ref mVersion, 0);mCachedLimitTable[url] = result;return result;
}

从缓存表中获取代理,当获取成功后判断一下版本号,如果一致就返回否则重新匹配并更新到缓存中。

        当看完以上代码是不是感觉非常简单,Beetlex网关的限流策略基本用这种方式进行设计和使用,以下是Beetlex网关的限流功能

if (!CheckIPTable(request, response))return;
if (!CheckDomains(request))
{if (string.IsNullOrEmpty(Options.InvalidDomainUrl)){response.InnerError("509", "Invalid domain name!");}else{Move302Result result = new Move302Result(Options.InvalidDomainUrl);response.Result(result);}return;
}
HttpToken token = (HttpToken)request.Session.Tag;
if (token.HttpRpsLimit.Check(this.Options.SessionMaxRps))
{response.InnerError("509", "session max rps limit!");return;
}
if (!mIPLimit.ValidateRPS(request))
{response.InnerError("509", $"{request.RemoteIPAddress} max rps limit!");return;
}
if (!CheckUrlLimit(request, response))return;
if (!CheckDomainsLimit(request, response))return;
if (RpsLimitHandlers.Count > 0)foreach (var handler in RpsLimitHandlers.Values){if (handler.Check(request, response)){response.InnerError("509", $"{handler.Name} max rps limit!");return;}}if (AllRpsLimit.Check(this.Options.MaxRps))
{response.InnerError("509", "server max rps limit!");return;
}
BeetleX

开源跨平台通讯框架(支持TLS)
提供高性能服务和大数据处理解决方案

8513020b7dd9e5d028b44ece17e8bcab.png

https://beetlex-io.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/292323.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

cocos2d-x学习 之一

最近准备学习cocos2d-x的开发,首先要搭建一下开发环境。今天就先搭建一下开发环境。本人系统为Mint-15 64位的linux,以下的开发环境只用于linux。首先到cocos2d-x的官网上下载安装包,由于cocos2d-x是开源的,所以我们可以查看源码&…

在 App 扩展和主 App 间共享数据

tags: iOS 8,Swift,App Groups 随着 iOS 8 的发布,苹果为广大开发者很多新的 API,其中最突出显著的就非 App Extension 莫属了。这为开发者们又带来了很多机会。 而我们在开发 App Extension 的时候,基本大多数人都会遇到这样一个问题。就是由…

[探索 .NET 6]02 比较 WebApplicationBuilder 和 Host

这是『探索 .NET 6』系列的第二篇文章:01 揭开 ConfigurationManager 的面纱02 比较 WebApplicationBuilder 和 Host在 .NET 中,有一种新的“默认”方法用来构建应用程序,即使用 WebApplication.CreateBuilder()。在这篇文章中,我…

都怪爱因斯坦没说清楚!竟有人相信一个粉笔头就能让全人类多喝100年的热水?...

全世界只有3.14 % 的人关注了爆炸吧知识一个粉笔头一共能释放多少能量爱因斯坦大家肯定都熟悉,相信也有很多朋友听说过质能方程。根据质能方程的公式,我们发现:似乎能量和质量是可以相互转化的。尤其是一些没有系统学习过相对论,又…

从微信云托管容器镜像的选择-alpine 说起

微信云托管 使用目前主流的容器平台Docker以及容器编排技术Kubernetes(简称K8S),来管理你的项目。使用微信云托管需要掌握对Docker的使用,但你无需掌握K8S的使用方法。微信云托管将K8S的运维配置完全接手,你不需要关心…

H5移动开发AUI框架入门---博客园老牛大讲堂

大家都知道H5可以开发移动端的页面,网上提供的移动端的开发都有很多。因为我学习了AUI框架,所以我这里介绍一下移动端AUI框架。--博客园老牛大讲堂 一、AUI框架是什么?---博客园老牛大讲堂 AUI框架就是利用原生的js和css封装成的一些界面。当…

.NET6使用DOCFX根据注释自动生成开发文档

本文内容来自我写的开源电子书《WoW C#》,现在正在编写中,可以去WOW-Csharp/学习路径总结.md at master sogeisetsu/WOW-Csharp (github.com)来查看编写进度。预计2021年年底会完成编写,2022年2月之前会完成所有的校对和转制电子书工作&…

量子力学到底神奇在哪里?看完这个,我的认知彻底坍塌了

▲ 点击查看很多朋友应该都看过Facebook创始人扎克伯格给他的女儿讲量子力学的那张照片。扎克伯格在清华大学经济管理学院做演讲时,曾谈到:学习量子力学改变了他的思维方式。到底什么是量子力学?我们生活面对的物质尺度大约是厘米级到千米级之…

linux 路由表设置 之 route 指令详解

使用下面的 route 命令可以查看 Linux 内核路由表。 [cpp] view plaincopy# route Destination Gateway Genmask Flags Metric Ref Use Iface 192.168.0.0 * 255.255.255.0 U 0 0 0 eth0 169.254.0.0 * …

黄老师离开呆了十年的上海

关注我的老朋友都知道,我和一线码农(黄新成)以前是同事,我以前也写过文章说过他的事迹。我们曾经一起共事过一家电商服务公司,每天和千万量级的数据打交道。.NET 圈的朋友想必很多人都看过一线码农写的技术文章&#x…

Shell配置_配置IP

1、setup 打开图形化页面a) 选择网络配置b) 选择设置配置c) 选择第一个网卡2、启动网卡(第一个网卡)vim /etc/sysconfig/network-scripts/ifcfg-eth0将ONBOOT"no"改为ONBOOT"yes"3、重启网络服务service network restart来自为知笔记…

linux之路由知识之ip route 命令中的疑惑

1.基础知识 1.1 路由 (Routing) 1.1.1 路由策略 (使用 ip rule 命令操作路由策略数据库) 基于策略的路由比传统路由在功能上更强大,使用更灵活,它使网络管理员不仅能够根据目的地址而且能够根据报文大小、应…

python怎么执行程序_小鹅通视频怎么下载?用python实现小鹅通视频下载(二)

小鹅通视频怎么下载?用python实现小鹅通视频下载(二)背景上次分享《小鹅通视频怎么下载?用python实现小鹅通视频下载(一)[1]》后,引来了很多人咨询小鹅通视频怎么下载的问题。其实咨询的人大多是不懂python[2]语言的人,也有一部分…

在 Azure Functions 上使用不同的路由前缀

点击上方蓝字关注“汪宇杰博客”原文:Azure Tips and Tricks翻译:汪宇杰导语有时需要使用与 Azure Functions 自动生成的路由前缀不同的路由前缀。例如:https://mynewapimc.azurewebsites.net/api/HttpTriggerCSharp1 在函数名之前使用 api。…

RabbitMq、ActiveMq、ZeroMq、kafka之间的比较,资料汇总

2019独角兽企业重金招聘Python工程师标准>>> MQ框架非常之多,比较流行的有RabbitMq、ActiveMq、ZeroMq、kafka。这几种MQ到底应该选择哪个?要根据自己项目的业务场景和需求。下面我列出这些MQ之间的对比数据和资料。 第一部分:Rab…