zoukankan      html  css  js  c++  java
  • 业务限流场景简单实现方案:RateLimiter

    前因:因为本系统中,有大数据高并发的场景。在向下游系统发送请求的时候,需要限流。否则会造成下游系统的堵塞。

    实现方案1:

      Thread.sleep(ms).

    优点:简单粗暴,一行代码搞定

    缺点:有点low,万一线程被抢了,无法唤醒怎么办

    实现方案2:

      Guava的RateLimiter类

    优点:简单实用,满足简单业务场景的需求。2行代码就能搞定

    缺点:功能还是比较简单,限流方案限定在秒级

    实现方案3:

      RXJava的flowable

    说明:比RateLimiter复杂,但是功能强大。还没仔细研究过

    所以综合考虑,使用Guava的RateLimiter类是一个比较好的解决方案,下面附上2篇资料:

    1.http://ifeve.com/guava-ratelimiter/

    2.https://www.cnblogs.com/f-zhao/p/7210158.html

    注意要点:RateLimiter 有一个有趣的特性是「前人挖坑后人跳」,也就是说 RateLimiter 允许某次请求拿走超出剩余令牌数的令牌。这就会造成rateLimiter.acquire()这个取令牌的方法,第一次取的时候,肯定是秒回的,不会任何停顿。

    所以rateLimiter.acquire()一定要放在业务逻辑的最前面,最前面,最前面(重三遍)。我写的时候以为和Thread.sleep()一样是每次都会停的,结果放在方法最后面,前2次方法执行就没限流效果了。

      

  • 相关阅读:
    Lucene4.5.1之添加索引、更新索引、删除索引、查找数据
    DWR 2.0.10之简单测试
    SNMP OID列表
    zabbix low-level discovery 监控mysql
    Linux系统负载查询
    MySQL 调优
    Linux 下DNS详解
    C语言计算两个日期间隔天数
    Linux vmstat命令详解
    select函数的详细使用(C语言)
  • 原文地址:https://www.cnblogs.com/xujanus/p/9963882.html
Copyright © 2011-2022 走看看