码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【故障补牢】贪吃的 Bing 爬虫,限量供应的应对措施


    相对于【故障公告】,【故障补牢】分享的是园子在发生故障后采取的亡羊补牢措施。

    在上次被微软 Bing 爬宕机后(详见 【故障公告】被放出的 Bing 爬虫,又被爬宕机的园子),我们采取了2个应对措施,然后解除了对 Bing 爬虫的屏蔽。

    措施1:限流——采用滑动窗口进行限流

    我们之前采用的限流措施没有采用滑动窗口,只能防君子不能防小人,比如限制同一个IP一天只能请求2万次,但如果遇到大胃口的爬虫,1秒请求2万次,虽然没有超过限制,但服务器已趴下。

    我们通过 ASP.NET Core 内置的 rate limiting middleware 进行滑动窗口限流,参考博文 ASP.NET Core rate limiting middleware in .NET 7

    services.AddRateLimiter(
        _ =>
        {
            _.GlobalLimiter = PartitionedRateLimiter.CreateChained(
                PartitionedRateLimiter.Createstring>(
                    _ => RateLimitPartition.GetSlidingWindowLimiter(
                        "total",
                        _ => new SlidingWindowRateLimiterOptions()
                        {
                            AutoReplenishment = true,
                            PermitLimit = limitOptions.TotalPermitLimit,
                            QueueLimit = 0,
                            Window = TimeSpan.FromSeconds(limitOptions.WindowSize),
                            SegmentsPerWindow = limitOptions.WindowSize,
                            QueueProcessingOrder = QueueProcessingOrder.OldestFirst
                        })),
                PartitionedRateLimiter.Createstring>(
                    context => RateLimitPartition.GetFixedWindowLimiter(
                        partitionKey: context.GetUserIp() ?? "unspecified",
                        factory: _ => new FixedWindowRateLimiterOptions
                        {
                            AutoReplenishment = true,
                            PermitLimit = limitOptions.PermitLimit,
                            QueueLimit = limitOptions.QueueLimit,
                            Window = TimeSpan.FromSeconds(limitOptions.WindowSize),
                            QueueProcessingOrder = QueueProcessingOrder.OldestFirst
                        })));
            _.OnRejected = (context, _) =>
            {
                context.HttpContext.Response.StatusCode = StatusCodes.Status429TooManyRequests;
                return default;
            };
        });
    

    措施2:隔离——专用 pod 限制计算资源、专用负载均衡限制带宽

    借助 k8s 的资源隔离能力,部署专用的 pod 给 Bing 爬虫使用,最多把 pod 爬挂,不会造成服务器宕机,对其他应用 pod 毫无影响。

    部署专门的负载均衡给 Bing 爬虫通行,这样可以避免因爬虫抢占带宽而造成其他正常请求无法正常响应,而且可以通过限制带宽控制爬虫的并发请求量以及带宽成本。

  • 相关阅读:
    Java进阶学习笔记31——日期时间
    入坑机器学习:四,单变量线性回归
    unity il2cpp打包安卓打包崩溃原因Unity2020.3 il2cpp.so丢失
    【JVM】为什么静态内部类实现单例模式是线程安全?
    不需要服务器,教你仅用30行代码搞定实时健康码识别
    精品基于NET实现的论坛管理系统
    用迭代器 模拟一个for of
    聚类算法的先验基础知识
    G. The Morning Star
    vue3之echarts区域折线图
  • 原文地址:https://www.cnblogs.com/cmt/p/17383699.html
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号