Unvollständige Zusammenfassung der Strombegrenzung

Die Strombegrenzung kann auf Gateway-Ebene wie Nginx, Openresty, kong, zuul, Spring Cloud Gateway usw. erfolgen; sie kann auch auf Anwendungsebene über Aop erfolgen.

Einige strombegrenzende Komponenten, einschließlich Token-Bucket-Strombegrenzung von Redisson, RateLimiter von Guava (Client-Strombegrenzung). Hystrix ist ein clientseitiger Strombegrenzer (siehe Huian Jinke Java-Interview (Teil) oder direkt auf die Sicherung Hystrix oder JavaGuide-Java Interview Guide North-High Performance: What are the common algorithms for load Balancing? ).

Strombegrenzung der Gateway-Schicht

Bildbeschreibung hier einfügen1

Strombegrenzung der Gateway-Schicht: Die Strombegrenzung des Gateways basiert auf dem Redis+Lua-Skript 1 2 :

Prinzipanalyse des Redisson Distributed Current Limiter RRateLimiter

Eigenständige Strombegrenzung: Hystrix kann Thread-Pool- oder Semaphore-Strombegrenzung verwenden:

Beispiel 1: Umfassende Isolierung des Hystrix-Thread-Pools und Begrenzung des Schnittstellenstroms

Beispiel 2:
RedisHystrixCommand.java :

public class RedisHystrixCommand<T> extends HystrixCommand<T> {
    
    

  private static final Logger logger = new Logger("Hystrix");

  private Callable<T> callable;
  private T defaultResult;
  private String opName;

  /**
   * constructor.
   */
  public RedisHystrixCommand(String keyName, Callable<T> callable, T defaultResult,
      String opName) {
    
    
    // default timeout=1s, fallback when 50% or 20 requests in 10 seconds fail
    super(Setter
        .withGroupKey(HystrixCommandGroupKey.Factory.asKey(keyName))
        .andCommandKey(HystrixCommandKey.Factory.asKey(keyName))
        .andCommandPropertiesDefaults(HystrixCommandProperties.Setter()
            .withExecutionIsolationStrategy(ExecutionIsolationStrategy.SEMAPHORE)
            .withCircuitBreakerEnabled(true)));
    this.callable = callable;
    this.defaultResult = defaultResult;
    this.opName = opName;
  }

  @Override
  protected T run() throws Exception {
    
    
    return callable.call();
  }

  @Override
  protected T getFallback() {
    
    
    logger.error("RedisCache {} fallback since executionTimeout, return {}",
        opName, defaultResult);
    return defaultResult;
  }
}

RedisHelper.java:

public Long sadd(String key, String member) {
    
    
  return new RedisHystrixCommand<>(getCommandKey(), () ->
      getRedisClient().handle(redis -> redis.sadd(key, member))
          .orElse(0L), 0L, "sadd").execute();
}

  1. Unser Unternehmen verwendet seit 6 Jahren den verteilten Redis-Strombegrenzer, der als sehr leistungsfähig bezeichnet werden kann! ↩︎ ↩︎

  2. Strombegrenzung von Spring Cloud Gateway ↩︎

Ich denke du magst

Origin blog.csdn.net/qq_23204557/article/details/127762162
Empfohlen
Rangfolge