• 高并发三个方案


    在开发高并发系统时有三把利器用来保护系统:缓存、降级和限流。本文结合作者的一些经验介绍限流的相关概念、算法和常规的实现方式。

    限流的算法
    常见的限流算法有:计数器、漏桶和令牌桶算法。

    计数器
    计数器是最简单粗暴的算法。比如某个服务最多只能每秒钟处理100个请求。我们可以设置一个1秒钟的滑动窗口,窗口中有10个格子,每个格子100毫秒,每100毫秒移动一次,每次移动都需要记录当前服务请求的次数。
    内存中需要保存10次的次数。可以用数据结构LinkedList来实现。格子每次移动的时候判断一次,当前访问次数和LinkedList中最后一个相差是否超过100,如果超过就需要限流了。

    很明显,当滑动窗口的格子划分的越多,那么滑动窗口的滚动就越平滑,限流的统计就会越精确

    代码示例:

    //服务访问次数,可以放在Redis中,实现分布式系统的访问计数
    Long counter = 0L;
    //使用LinkedList来记录滑动窗口的10个格子。
    LinkedList<Long> ll = new LinkedList<Long>();
    public static void main(String[] args)
    {
    Counter counter = new Counter();
    counter.doCheck();
    }
    private void doCheck()
    {
    while (true)
    {
    ll.addLast(counter);
    if (ll.size() > 10)
    {
    ll.removeFirst();
    }
    //比较最后一个和第一个,两者相差一秒
    if ((ll.peekLast() - ll.peekFirst()) > 100)
    {
    //To limit rate
    }
    Thread.sleep(100);
    }
    }

    漏桶算法

    漏桶算法即leaky bucket是一种非常常用的限流算法,可以用来实现流量整形(Traffic Shaping)和流量控制(Traffic Policing)。

    贴了一张维基百科上示意图帮助大家理解:

    漏桶算法的主要概念如下:
    一个固定容量的漏桶,按照常量固定速率流出水滴;
    如果桶是空的,则不需流出水滴;
    可以以任意速率流入水滴到漏桶;
    如果流入水滴超出了桶的容量,则流入的水滴溢出了(被丢弃),而漏桶容量是不变的。
    漏桶算法比较好实现,在单机系统中可以使用队列来实现(.Net中TPL DataFlow可以较好的处理类似的问题,你可以在这里找到相关的介绍),在分布式环境中消息中间件或者Redis都是可选的方案。

    **************************************************************************************
    当你的才华还撑不起你的野心的时候,你就应该静下心来学习;当你的能力还驾驭不了你的目标时,就应该沉下心来,历练;梦想,不是浮躁,而是沉淀和积累,只有拼出来的美丽,没有等出来的辉煌,机会永远是留给最渴望的那个人,学会与内心深处的你对话,问问自己,想 要怎样的人生,静心学习,耐心沉淀,送给自己,共勉。
    **************************************************************************************
  • 相关阅读:
    ROS与Arduino学习(六)Logging日志
    ROS与Arduino学习(五)客户端与服务器
    ROS与Arduino学习(四)用ROS中的Cmake编译程序
    ROS与Arduino学习(三)订阅与发布
    ROS与Arduino学习(二)HelloWorld
    /dev/ttyUSB0 permission denied 解决办法:永久有可操作权限
    ROS与Arduino学习(一)准备工作
    E: Sub-process /usr/bin/dpkg returned an error code (1)解决方案
    ROS学习之URDF
    PIC16F684汇编学习笔记
  • 原文地址:https://www.cnblogs.com/macoffee/p/13375018.html
Copyright © 2020-2023  润新知